【Excel VBAでCSVファイル取込む方法】

ExcelVBA

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で開いたファイルを閉じています。ファイルを開いたら必ずクローズする必要があるため、忘れずに実行する必要があります。