【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.
シート名や列番号が正しいか確認してください。