VBAでCSVファイルを読み込む方法をご説明します。
CSVファイルを読み込むには大きく分けて、「Excel同様に読み込む」、「Open」ステートメントを使う方法と、Excelの標準機能の「QueryTable 」を使う方法があります。
今回は『「Open」ステートメントを使う方法』をご説明します。
「Excel同様に読み込む」については、拡張子をxlsxからcsvに書き換えるだけですので、「指定したファイルを読み込む」をご覧ください。
また、手動で読み込む方法やCSVとは?については「CSVファイルの正しい読み込み方」をご覧ください。
1.CSVファイルを開く
CSVファイルを開くには「Open」ステートメントを使用します。
「Open」ステートメントの構文は次の通りです。
Open ファイル名 For 処理 As #ファイル番号
「ファイル名」はファイルパスを指定しなければ、カレントフォルダを指定したことなりますので、予めカレントフォルダを指定するか、フォルダパス&ファイル名で指定します。
「処理」は次の方法があります。
- Input(読み込み)
- Output(書き込み)
- Append(追記)
今回は「Input」を使用します。
「Input」は直接セルへ出力できないため、必ず変数に代入してから出力します。
「ファイル番号」は1ファイルであれば「#1」と数値で指定します。
複数のファイルを取り扱うケースでは、使用可能な番号を取得する「FreeFile関数」を使用します。
2.書式を指定せず読み込むサンプルコード
次のコードはCSVを開いて、1行ずつ読み込むサンプルコードです。
もっとも一般的な方法かと思います。
※下記コードでは「001」は「1」になります。
Sub Sample1()
Dim FileNum As Integer
Dim i As Integer
Dim n As Integer
Dim myStr() As String
Dim myRec As String
FileNum = FreeFile
i = 0
Open "C:\Sample\Book1.csv" For Input As #FileNum
Do While Not EOF(FileNum)
i = i + 1
Line Input #FileNum, myRec
myStr = Split(myRec, ",")
For n = 0 To UBound(myStr)
Cells(i, n + 1) = myStr(n)
Next n
Loop
Close #FileNum
End Sub
コードの説明
「Open “C:\Sample\Book1.csv” For Input As #FileNum」で指定したファイルを取得しています。
「Do While Not EOF(FileNum)」で最終行になるまでループしています。
「Line Input #FileNum, myRec」で取得したデータを1行ずつ読み込んでいます。
「myStr = Split(myRec, “,”)」で読み込んだ行を「,」カンマで文字列区切りをしています。
「For n = 0 To UBound(myStr) – 1」で区切られた文字列数分ループしてセルに出力しています。
「Close #FileNum」でファイルを閉じます。
3.書式を指定して読み込むサンプルコード
数値を文字列としてCSVを開きたい場合は次のコードになります。
「Columns(1).NumberFormat = “@”」で文字列指定したい列の書式を文字列にします。
複数列指定する場合は「Range(“A:F”).NumberFormat = “@”」と範囲指定します。
それ以外の列でも日付等も個別に書式を指定する事で、表示形式を変更できます。
Sub Sample2()
Dim FileNum As Integer
Dim i As Integer
Dim n As Integer
Dim myStr() As String
Dim myRec As String
FileNum = FreeFile
i = 0
Open "C:\Sample\Book1.csv" For Input As #FileNum
Columns(1).NumberFormat = "@"
Do While Not EOF(FileNum)
i = i + 1
Line Input #FileNum, myRec
myStr = Split(myRec, ",")
For n = 0 To UBound(myStr) - 1
Cells(i, n + 1) = myStr(n)
Next n
Loop
Close #FileNum
End Sub
また、「For n~Next n」の列数をループする部分はループ数が増えてしまうため、出力回数を減らすために次の様に記載できます。
Range(Cells(i, 1), Cells(i, UBound(myStr) + 1)) = myStr
4.CSVファイルを読み込む注意点
CSVファイルを文字区切りで読み込む際に注意があります。
これは「カンマ区切り」や「タブ区切り」に関わらず、区切り文字が区切りたくない文字列内に含まれてしまっている場合に、予定外の区切りを行ってしまう事です。
特に「1,000」などは含まれる可能性が高いため、注意が必要です。