📘 Excel逆引き事典

【VBA】CSVファイルを配列を使って高速にコピーする方法

日々の業務で大量のCSVファイルからデータを取り込む作業がある方、その手間を一発で解決します。この記事では、配列を使用して高速にCSVファイルを読み込み、ExcelシートへコピーするVBAマクロを作成します。

サンプルコード

VBA
Option Explicit
Sub CSVToArray()
    Dim ws As Worksheet, csvFilePath As String, data() As Variant
    Set ws = ThisWorkbook.Sheets("Sheet1")
    csvFilePath = "C:\path\to\your\file.csv"
    Application.ScreenUpdating = False '画面更新を停止
    data = ReadCSVToArray(csvFilePath)
    If IsArray(data) Then
        ws.Cells(1, 1).Resize(UBound(data, 1), UBound(data, 2)).Value = data
    End If
    Application.ScreenUpdating = True '画面更新を再開
End Sub

Function ReadCSVToArray(filePath As String) As Variant()
    Dim fileNum As Integer, line As String, lines() As String, i As Long
    ReDim Preserve lines(0)
    fileNum = FreeFile
    Open filePath For Input As #fileNum
    Do While Not EOF(fileNum)
        Line Input #fileNum, line
        If Len(line) > 0 Then ReDim Preserve lines(UBound(lines) + 1): lines(UBound(lines)) = line
    Loop
    Close #fileNum
    ReadCSVToArray = SplitLinesIntoArray(lines)
End Function

Function SplitLinesIntoArray(lines() As String) As Variant()
    Dim data() As Variant, i As Long, j As Long, splitLine() As String
    ReDim data(1 To UBound(lines), 1 To 100) '仮の列数を指定
    For i = LBound(lines) To UBound(lines)
        splitLine = Split(lines(i), ",")
        For j = LBound(splitLine) To UBound(splitLine)
            data(i + 1, j + 1) = splitLine(j)
        Next j
    Next i
    ReDim Preserve data(1 To i, 1 To j)
    SplitLinesIntoArray = data
End Function

よくある質問

Q 元に戻せますか?

A.
VBAの実行結果は「元に戻す」が効きません。必ずバックアップを取ってから実行してください。

Q エラーが出たら?

A.
シート名や列番号が正しいか確認してください。