VB6/VBA で csv ファイルを読み込む方法はいくつかあります。
なお、検証で使用する csv ファイルは以下内容にて作成されていると仮定します。
【検証用 csv ファイル内容】
"名前","住所","電話番号"
"てすと太郎","東京都港区XX-XX-XX","111-1111-1111"
"てすと次郎","埼玉県さいたま市XX-XX-XX","222-2222-2222"
"てすと三郎","神奈川県横浜市XX-XX-XX","333-3333-3333"
Openステートメントでファイルを開いて読み込む
Open ステートメントでファイルを開いて読み書きする場合は、まず Open ステートメントでテキストファイルを開き、Input # ステートメントでテキストを一行ずつ項目ごとに読み込み、最後に Close ステートメントでファイルを閉じるといった処理を行います。
【サンプルコード1】
Public Sub sample1()
Dim intNo As Integer 'ファイルNo
Dim lngCount As Long 'データ数
Dim strItem1() As String '項目1用配列
Dim strItem2() As String '項目2用配列
Dim strItem3() As String '項目3用配列
'csvファイルオープン
intNo = FileSystem.FreeFile()
Open "C:\tmp\sample.csv" For Input As #intNo
'csvファイルの読み込み
lngCount = 0
Do Until EOF(intNo)
'配列のリサイズ
ReDim Preserve strItem1(lngCount) As String
ReDim Preserve strItem2(lngCount) As String
ReDim Preserve strItem3(lngCount) As String
'データを各配列に読み込み
Input #intNo, strItem1(lngCount), strItem2(lngCount), strItem3(lngCount)
lngCount = lngCount + 1
Loop
'csvファイルクローズ
Close #intNo
'読み込んだ値を確認
Dim i As Long
For i = 0 To UBound(strItem1)
Debug.Print strItem1(i), strItem2(i), strItem3(i)
Next i
End Sub
上記サンプルは「C:\tmp\sample.csv」を読み込み、配列に格納後、読み込んだデータをデバッグ表示しています。今回のサンプルではcsvの項目数が 3 つであるため、配列も 3 つ用意していますが、csv の項目数に応じて配列数は増減します。
FileSystemObjectで読み込む
FileSystemObject を使用して csv ファイルを読み込む場合は、まず FileSystemObject のインスタンスを生成し、そのインスタンスの OpenTextFile メソッドで csv ファイルを TextStream としてオープンします。TextStream は AtEndOfStream プロパティでファイルの終わりを検知し、ReadLine メソッドで一行ずつテキストを読み込みます。
【条件】
- 「Microsoft Scripting Runtime」を参照設定する必要がある。(scrrun.dllが必要)
【サンプルコード2】
Public Sub sample2()
Dim intNo As Integer 'ファイルNo
Dim lngCount As Long 'データ数
Dim tmpData() As String '一時保存用配列
Dim strItem1() As String '項目1用配列
Dim strItem2() As String '項目2用配列
Dim strItem3() As String '項目3用配列
Dim fso As New FileSystemObject
Dim ts As TextStream
'ファイルオープン
Set ts = fso.OpenTextFile("C:\tmp\sample.csv")
'ファイル読み込み
lngCount = 0
With ts
Do Until .AtEndOfStream
'配列のリサイズ
ReDim Preserve strItem1(lngCount) As String
ReDim Preserve strItem2(lngCount) As String
ReDim Preserve strItem3(lngCount) As String
'一行データを読み込み、カンマ区切りで配列に変換
tmpData = Split(.ReadLine, ",")
'読み込んだデータの前後の「"」を削除して配列に格納
strItem1(lngCount) = Mid(tmpData(0), 2, Len(tmpData(0)) - 2)
strItem2(lngCount) = Mid(tmpData(1), 2, Len(tmpData(1)) - 2)
strItem3(lngCount) = Mid(tmpData(2), 2, Len(tmpData(2)) - 2)
lngCount = lngCount + 1
Loop
End With
'ファイルクローズ
ts.Close
Set ts = Nothing
'読み込んだ値を確認
Dim i As Long
For i = 0 To UBound(strItem1)
Debug.Print strItem1(i), strItem2(i), strItem3(i)
Next i
End Sub
上記サンプルは「C:\tmp\sample.csv」を読み込み、読み込んだデータをデバッグ表示しています。ReadLine メソッドで読み込んだ一行テキストを、Split 関数でカンマ区切りの配列に変換し、その後、各項目の前後に付加されてるダブルクォーテーションを削除しています。
【注意事項】
上記例では Split 関数でカンマ区切りでデータを切り出していますが、文字列の中にカンマが含まれていた場合正しく動作しません。ダブルクォーテーションで囲われた文字列内のカンマを許可する場合は、自前で解析関数を実装する必要があります。