次に抽出したデータをCSVで出力するのですが実はこのCSVというのが曲者でCSVはフォーマットが固定されたものという概念がまかり通っています。
汎用性が高いのでよく使われます、でも「Comma Separated Values」と言うように要するにデータが「","で区切られていればよい」のでデータを括る記号は「"」だろうが「'」だろうが・・あるいは何もなくても良いのです。
このことがExcelやAccessで出力するときに苦労する種になることがよくあります、今回もオフコンから出力されたCSVデータをそのものを加工し、それと全く同じフォーマットで出力しなければならずこれに苦労しました。
Open コマンドで開き、単にCSVで出力するのなら Write コマンドを使えばよいのです、文字列データは「"ABC"」のように、数値データは「123」のように出力されますがデータが空のフィールドは飛ばされてしまうのです、また備考欄のようにどんなデータが入るか分からないフィールドは基本的に文字列として扱わなければならないのですが数字だけだとそこだけフィールドが「"」なしで出力されてしまい、データの種類の一貫性がなくなります。
ところがオフコンの出力データではデータが空であっても文字列フィールドでは「"」で括り、数値フィールドも飛ばすことはないのです。
つまり、文字列として扱わなければならないフィールドは文字列として、数値として扱わなければならないフィールドは数値フィールドとして出力しなければならず、できたのがこれ。
Sub csvで出力()
With Cells(1).CurrentRegion
行 = .Rows.Count
列 = .Columns.Count
End With
Open "C:TREEIDECDATAtest.csv" For Output As #1
For begin_row = 1 To 行
For begin_column = 1 To 列 + 1
v = Cells(begin_row, begin_column)
If begin_column = 7 Or begin_column = 8 Then GoTo moji
If Len(v) = 0 Then
Print #1, Chr(34) & "" & Chr(34) & ",";
ElseIf IsNumeric(v) = True Then
Print #1, v & ",";
Else
moji:
Print #1, Chr(34) & v & Chr(34) & ",";
End If
Next
Print #1, Chr(34) & v & Chr(34)
Next
Close #1
End Sub
結局 Write コマンドを使うと面倒なことになりそうなので敢えて Print コマンドで済ませました。
汎用性が高いのでよく使われます、でも「Comma Separated Values」と言うように要するにデータが「","で区切られていればよい」のでデータを括る記号は「"」だろうが「'」だろうが・・あるいは何もなくても良いのです。
このことがExcelやAccessで出力するときに苦労する種になることがよくあります、今回もオフコンから出力されたCSVデータをそのものを加工し、それと全く同じフォーマットで出力しなければならずこれに苦労しました。
Open コマンドで開き、単にCSVで出力するのなら Write コマンドを使えばよいのです、文字列データは「"ABC"」のように、数値データは「123」のように出力されますがデータが空のフィールドは飛ばされてしまうのです、また備考欄のようにどんなデータが入るか分からないフィールドは基本的に文字列として扱わなければならないのですが数字だけだとそこだけフィールドが「"」なしで出力されてしまい、データの種類の一貫性がなくなります。
ところがオフコンの出力データではデータが空であっても文字列フィールドでは「"」で括り、数値フィールドも飛ばすことはないのです。
つまり、文字列として扱わなければならないフィールドは文字列として、数値として扱わなければならないフィールドは数値フィールドとして出力しなければならず、できたのがこれ。
Sub csvで出力()
With Cells(1).CurrentRegion
行 = .Rows.Count
列 = .Columns.Count
End With
Open "C:TREEIDECDATAtest.csv" For Output As #1
For begin_row = 1 To 行
For begin_column = 1 To 列 + 1
v = Cells(begin_row, begin_column)
If begin_column = 7 Or begin_column = 8 Then GoTo moji
If Len(v) = 0 Then
Print #1, Chr(34) & "" & Chr(34) & ",";
ElseIf IsNumeric(v) = True Then
Print #1, v & ",";
Else
moji:
Print #1, Chr(34) & v & Chr(34) & ",";
End If
Next
Print #1, Chr(34) & v & Chr(34)
Next
Close #1
End Sub
結局 Write コマンドを使うと面倒なことになりそうなので敢えて Print コマンドで済ませました。