VBAでCSVファイルを取り込み、大量のデータを処理する際に効率的な方法として、配列にデータを格納し、最後にまとめてセルに張り付ける方法があります。以下では、この方法について解説します。
実装例
次の例では、C:\example.csvというCSVファイルからデータを取得してワークシートに張り付けます。
Sub FastLoadCSV()
Dim csvFilePath As String
Dim csvContents As String
Dim rowCount As Long
Dim colCount As Long
Dim rowData() As String
Dim dataArray() As Variant
Dim i As Long
Dim j As Long
'CSVファイルのパスを指定する
csvFilePath = "C:\example.csv"
'CSVファイルを一括読み込み
Open csvFilePath For Binary As #1
csvContents = Space$(LOF(1))
Get #1, , csvContents
Close #1
'改行コードで分割して配列に格納
Dim csvData() As String
csvData = Split(csvContents, vbCrLf)
'行数と列数を取得
rowCount = UBound(csvData) - LBound(csvData) + 1
colCount = UBound(Split(csvData(0), ",")) + 1
'配列を再定義してデータを格納
ReDim dataArray(1 To rowCount, 1 To colCount)
For i = 1 To rowCount
rowData = Split(csvData(i - 1), ",")
For j = 1 To colCount
dataArray(i, j) = rowData(j - 1)
Next j
Next i
'配列の内容をセルに貼り付ける
Range("A1").Resize(rowCount, colCount).Value = dataArray
End Sub
このVBAマクロは、指定されたCSVファイルを一括読み込みし、配列にデータを格納します。最後に、格納した配列をワークシートのセルに張り付けます。
まず、CSVファイルのパスを指定します。その後、ファイルを一括読み込みしてcsvContents変数に格納します。次に、csvContents変数の内容を改行コードで分割して、csvData配列に格納します。
その後、rowCount変数に行数、colCount変数に列数を格納します。配列dataArrayを再定義して、csvData配列から各要素を取り出してデータを格納します。最後に、ワークシートのセルに配列の内容を貼り付けます。
CSVファイルの取込み部分の解説
以下の部分は、CSVファイルを一括読み込んで、その内容を変数に格納する処理になります。
'CSVファイルを一括読み込み
Open csvFilePath For Binary As #1
csvContents = Space$(LOF(1))
Get #1, , csvContents
Close #1
1行目の Open csvFilePath For Binary As #1
では、CSVファイルをバイナリモードで開いています。ここで、#1 はファイルを開いたときに割り当てられるファイル番号で、VBAでは、ファイルを操作するときには必ず指定する必要があります。また、For Binary というオプションを指定することで、バイナリモードでファイルを開くことができます。
2行目の csvContents = Space$(LOF(1))
では、ファイルの内容を格納するための変数 csvContents
を、ファイルサイズ分のスペースを確保しています。LOF(1) は、ファイル番号1で開いたファイルのサイズを取得する関数で、この場合はCSVファイルのサイズになります。
3行目の Get #1, , csvContents
では、#1で開いたファイルの内容を csvContents
に読み込んでいます。Get文はバイナリファイルの内容を一括で読み込むために使用され、Get #ファイル番号, レコード番号, 読み込み先の変数 という形式で使用します。この場合、レコード番号を省略しているため、ファイルの先頭から全てのデータを一括で読み込んでいます。
4行目の Close #1
では、ファイル番号1で開いたファイルを閉じています。ファイルを開いたら必ずクローズする必要があるため、忘れずに実行する必要があります。