CSVファイルはデータのやり取りや保存に広く使われており、Excelでもよく利用される形式のひとつです。手動でインポートすることも可能ですが、業務で大量のファイルを処理する際には、自動化できると大きな時間短縮になります。
そこで今回は、Excel VBAを使ってCSVファイルを読み込む方法を基本から応用まで詳しく解説します。初学者の方にもわかりやすいように、実際のコード例を交えながら丁寧に説明していきます。
VBA(Visual Basic for Applications)とは、ExcelなどのOffice製品に組み込まれているマクロ言語です。
CSVファイルは「Comma Separated Values」の略で、カンマで区切られたテキストデータです。たとえば以下のような内容です:
名前,年齢,住所
田中太郎,30,東京都
山田花子,28,大阪府
VBAを使えば、こうしたCSVファイルを自動でExcelに読み込むことができます。VBAで読み込む方法には複数のやり方がありますが、主に以下の方法があります:
Workbooks.Open
を使う方法(簡単)Openステートメント
を使って1行ずつ読み込む方法(柔軟)QueryTables
を使う方法(高度)それぞれ順番に見ていきましょう。
まずは最もシンプルな方法です。CSVファイルはExcelでもそのまま開けるので、VBAでも同様に Workbooks.Open
を使って開くことができます。
Sub OpenCSV()
Dim csvPath As String
csvPath = "C:\Users\user\Desktop\data.csv" ' CSVファイルのパスを指定
Workbooks.Open Filename:=csvPath
End Sub
この方法の特徴:
より細かくデータをコントロールしたい場合には、Open
ステートメントを使ってCSVファイルを1行ずつ読み込む方法がおすすめです。
Sub ReadCSV()
Dim csvPath As String
Dim lineData As String
Dim row As Long
Dim items As Variant
csvPath = "C:\Users\user\Desktop\data.csv"
row = 1
Open csvPath For Input As #1
Do Until EOF(1)
Line Input #1, lineData
items = Split(lineData, ",")
Dim col As Integer
For col = 0 To UBound(items)
Cells(row, col + 1).Value = items(col)
Next col
row = row + 1
Loop
Close #1
End Sub
この方法の特徴:
QueryTablesは、外部データのインポートに使える機能です。CSV読み込みにも利用できます。
Sub ImportCSVwithQueryTable()
Dim ws As Worksheet
Dim qt As QueryTable
Dim csvPath As String
csvPath = "C:\Users\user\Desktop\data.csv"
Set ws = ThisWorkbook.Sheets(1)
Set qt = ws.QueryTables.Add(Connection:="TEXT;" & csvPath, Destination:=ws.Range("A1"))
With qt
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFilePlatform = xlWindows
.TextFileParseType = xlDelimited
.Refresh
End With
End Sub
この方法の特徴:
VBAではShift-JISが標準ですが、CSVがUTF-8で保存されている場合、文字化けすることがあります。UTF-8対応が必要な場合はADODBやFSOでの読み込みを検討するとよいでしょう。
ユーザーにファイルを選んでもらう場合は以下のようにします:
Sub SelectAndOpenCSV()
Dim filePath As String
filePath = Application.GetOpenFilename("CSVファイル (*.csv), *.csv")
If filePath <> "False" Then
Workbooks.Open Filename:=filePath
End If
End Sub
既存データを消さないよう、読み込み位置や上書き処理には十分注意しましょう。
業務では、1ファイルだけでなく複数のCSVファイルを一括で処理したい場面もあります。以下は指定フォルダ内のCSVをすべて読み込んで、シートごとに分けて読み込む例です。
Sub ImportAllCSVs()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim i As Integer
folderPath = "C:\Users\user\Desktop\CSVフォルダ\"
fileName = Dir(folderPath & "*.csv")
i = 1
Do While fileName <> ""
Set wb = Workbooks.Open(folderPath & fileName)
wb.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
wb.Close False
fileName = Dir
i = i + 1
Loop
End Sub
方法 | 難易度 | 特徴 |
---|---|---|
Workbooks.Open | ★☆☆ | 簡単で実装しやすい |
Openステートメント | ★★☆ | 柔軟な読み込みが可能 |
QueryTables | ★★★ | 詳細設定ができ、応用が広い |
読み込むCSVの内容や業務フローに合わせて、最適な方法を選びましょう。特に日常的にCSVを扱う場合、自動化しておくだけで作業効率が飛躍的に向上します。