CSVデータの数値の罠
CSVファイルのデータを取り込む
以下の画像の通り、「製品データ.csv」と「製品データ取得.xlsm」の2つのファイルがあります。
CSVファイルの中身↓↓
何の変哲もない、4行のデータです。
CSVファイルを開いてデータを取得する。
以下のコードでCSVファイルを開いてデータを取得します。
Sub csvをOpenしてデータを取得する() Dim fPth Dim wb fPth = ThisWorkbook.Path & "\製品データ.csv" Set wb = Workbooks.Open(fPth) Range("A1").CurrentRegion.Copy wb.Close Range("A1").Select ActiveSheet.Paste Range("A1").Select Columns("A:C").AutoFit Set wb = Nothing End Sub
処理結果↓↓
CSVデータが取得できたように思えますね!
しかし、これ間違っています。
では、何が違うのか?
このCSVファイルを、「テキスト」で開いて見てみましょう!
(右クリック → プログラムから開く → メモ帳)
すると、以下の画像の通り↓↓
なんということでしょう!?4行目のシリアル番号は「0032」なのです!
これはおそらく、CSVファイルをExcelで開くと自動変換しているものと思われます。
ニャンちゅうこっちゃ(;^ω^)
どうしようもないのか!?
こんなときのための対処法を紹介します!
テキストでファイルを開く
テキストベースでファイルデータを取得します。
シリアル番号の列が数値の場合「’」(シングルクオート)を付けてファイルを上書きします。
コードは以下の通り↓↓
Sub csvをテキストで開く() Dim i, j Dim fPth Dim Fno Dim data() As String Dim rec Dim fCnt Dim svData(1 To 4) fPth = ThisWorkbook.Path & "\製品データ.csv" Fno = FreeFile Open fPth For Input As #Fno While Not EOF(Fno) Line Input #Fno, rec data = Split(rec, ",", -1) fCnt = fCnt + 1 If IsNumeric(data(2)) Then data(2) = "'" & data(2) End If 'カンマで文字列結合 For j = 0 To UBound(data) If j = 0 Then rec = data(j) Else rec = rec & "," & data(j) End If Next svData(fCnt) = rec 'カンマを付けたデータを格納 Wend Close #Fno 'csvファイルを上書きする Open fPth For Output As #Fno For i = 1 To fCnt Print #Fno, svData(i) Next i Close #Fno End Sub
このコードを実行したCSVファイルを開いた結果が以下の画像です↓↓
シングルクォートが付いて、文字列になっていますね!
メモ帳からCSVファイルを見て見ましょう!
シングルクォートが付いていますね。
以上のように、数値として先頭に00が付いているのは問題になりにくいと思いますが、
シリアル番号はダメですよね(;^ω^)
文字列として扱うべきですよね。この罠に私もはまったので参考になればと思います。
備忘録でした(^^)/~~~