セルの自動変換が起こらないようにCSVファイルを読み込む

中級VBA

変数型を考慮したCSVファイルの読み込み

 特定の仕様によるCSVファイルを読み込む場合を想定してプログラムを書いてみましょう。
 今回は以下のようなケースを想定してみます。(テキストエディタで開いた状態です。)

 特定のファイルを読み込む事を想定していますので、列ごとに変数型を指定して読み込む事にします。
 Excelシートに貼り付ける時もセルの書式設定で文字列や日付型を指定出来ます。
 4列目はダブルクォーテーションで囲まれていますが、これは外して読み込む事にします。

 プログラムは以下のようになります。

プログラムコード

Sub SampleReadCSV()
    Dim filename
    filename = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                                Title:="CSVファイルの選択")     '①
    If filename = False Then Exit Sub
    

    Dim buf As String
    Dim r As Long, c As Long
    Dim arr
    
    r = 1
    Open filename For Input As #1  '②
  
    Do Until EOF(1)   '③
        Line Input #1, buf
        arr = Split(buf, ",")
        For c = 1 To UBound(arr) + 1
            If c = 1 Then       '④
                Cells(r, c).NumberFormatLocal = "@"   '書式設定を文字列に変更
                Cells(r, c) = arr(c - 1)
            ElseIf c = 4 Then   '⑤
                Debug.Print arr(c - 1)
                Cells(r, c) = "'" & Replace(arr(c - 1), """", "")
            Else                '⑥
                Cells(r, c) = arr(c - 1)
            End If
        Next c
        r = r + 1
    Loop
    Close #1
End Sub

プログラム解説

 このプログラムでは、CSVファイルを一行づつ読み込んで、1行をカンマで分割して1項目づつセルに入力していきます。
 入力の際、1列目はセルの書式設定を「文字列」にしてから入力しますので、日付型への変換は起こりません。
 また、4列目はダブルクォーテーションを取り除き、先頭に ’(アポストロフィ)を付けて入力していますので、こちらも日付型への変換は起こりません。
 
 ①は、ファイルダイアログを呼び出してファイルをユーザーに選択してもらう処理です。
 ②でファイルを読み込んでいます。
 ③は、ファイルの終端に来るまで読込を繰り返す処理になります。
 続く④⑤⑥の部分で必要に応じて、文字列の加工、セルの書式設定を変更を施して値を代入しています。

まとめ

 今回は特定の仕様に応じたCSVファイルの読み込みをプログラミングしました。
 尚、ここでは必要最低限度の変換しか行っていません。
 例えば、4列目の値で両端以外にダブルクォーテーションが含まれる場合でもダブルクォーテーションは削除されます。
 また、各項目に区切り文字のカンマが含まれるようなケースでは、思ったような結果が得られないでしょう。

 このように、場合によってはエラーとなるケースがあります。
 全ての不具合が起こらないようにするためには、プログラムも複雑になり、保守も大変になります。
 
 ある程度の想定で良しとする事で、プログラミングのコストを下げる事ができますので、実用性を踏まえた上で検討すると良いと思います。

タイトルとURLをコピーしました