会社を卒業したのんちおじさん。

人生は知恵と工夫と思いやり!
優しさほど強いものはなく、本当の強さほど優しいものはない -ラルフ・W・ソックマン-

COUNTIFでできた3

2009-01-31 10:37:28 | Excelのお話
次に抽出したデータを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 コマンドで済ませました。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。