CSVデータの数値の罠

f:id:bimori466:20210619224941p:plain

CSVデータの数値に注意!

CSVデータ、よく使いますよね。
使う中でCSVの持つ数値の扱いに気を付けなければならないことがあったので、備忘録としてまとめました。

CSVファイルのデータを取り込む

以下の画像の通り、「製品データ.csv」と「製品データ取得.xlsm」の2つのファイルがあります。

f:id:bimori466:20210619225806p:plain


CSVファイルの中身↓↓
f:id:bimori466:20210619230028p:plain

何の変哲もない、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


処理結果↓↓
f:id:bimori466:20210619230424p:plain

CSVデータが取得できたように思えますね!
しかし、これ間違っています。

では、何が違うのか?
このCSVファイルを、「テキスト」で開いて見てみましょう!
(右クリック → プログラムから開く → メモ帳)
f:id:bimori466:20210619230948p:plain


すると、以下の画像の通り↓↓
f:id:bimori466:20210619231128p:plain

なんということでしょう!?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ファイルを開いた結果が以下の画像です↓↓
f:id:bimori466:20210619231911p:plain

シングルクォートが付いて、文字列になっていますね!

メモ帳からCSVファイルを見て見ましょう!
f:id:bimori466:20210619232118p:plain

シングルクォートが付いていますね。


以上のように、数値として先頭に00が付いているのは問題になりにくいと思いますが、
シリアル番号はダメですよね(;^ω^)
文字列として扱うべきですよね。この罠に私もはまったので参考になればと思います。


備忘録でした(^^)/~~~