📘 Excel逆引き事典

【VBA】CSVファイルを配列を使って高速に別ブックとして保存する方法

手作業で大量のCSVデータをExcelブックに移行するのは大変な作業です。この記事では、配列を使用して高速にCSVファイルを別ブックとして保存する方法を紹介します。

サンプルコード

VBA
Option Explicit
Sub CSVToArrayAndSaveAsBook()
    Dim ws As Worksheet, wb As Workbook
    Dim csvFilePath As String, newWorkbookPath As String
    Dim data() As Variant
    Dim lastRow As Long, i As Long
    
    ' CSVファイルのパスを指定
    csvFilePath = "C:\Users\User\Documents\example.csv"
    
    ' 新しいExcelブックの保存先を指定
    newWorkbookPath = "C:\Users\User\Documents\output.xlsx"
    
    ' CSVデータを配列に読み込む
    data = ReadCSVToArray(csvFilePath)
    
    ' 新しいワークブックを作成
    Set wb = Workbooks.Add
    Set ws = wb.Sheets(1)
    Application.ScreenUpdating = False
    For i = 1 To UBound(data, 1)
        ws.Cells(i, 1).Resize(1, UBound(data, 2)).Value = data(i, 1) ' データをシートに書き込む
    Next i
    
    ' 新しいワークブックを保存
    wb.SaveAs newWorkbookPath
    Application.ScreenUpdating = True
End Sub

' CSVファイルから配列に読み込む関数
Function ReadCSVToArray(filePath As String) As Variant()
    Dim fileNum As Integer, lineData As String
    Dim data() As String, tempRow() As String
    Dim i As Long, j As Long
    
    ' ファイルを開く
    fileNum = FreeFile
    Open filePath For Input As #fileNum
    ReDim data(1 To 1, 1 To 256) ' 初期化
    i = 0
    Do While Not EOF(fileNum)
        Line Input #fileNum, lineData
        tempRow = Split(lineData, ",")
        For j = LBound(tempRow) To UBound(tempRow)
            data(i + 1, j + 1) = tempRow(j)
        Next j
        i = i + 1
    Loop
    ReDim Preserve data(1 To i, 1 To UBound(data, 2))
    ReadCSVToArray = data
End Function

よくある質問

Q 元に戻せますか?

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

Q エラーが出たら?

A.
CSVファイルのパスや列番号が正しいか確認してください。