Excel VBAを使って、CSVファイルから必要な列だけを指定してExcelに取り込む方法を紹介します。
今回のマクロでは、columnsToKeep に取り込みたい列番号をあらかじめ指定し、その列だけをExcelシートへ転記します。
CSVファイルの中から決まった列だけを取り込みたい場合や、不要な列を毎回手作業で削除している場合に便利です。
このマクロでできること
このマクロでは、CSVファイルのすべての列を取り込むのではなく、必要な列だけを選んでExcelへ書き込みます。
たとえば、CSVに次のような列があるとします。
1列目:ID
2列目:名前
3列目:部署
4列目:メールアドレス
5列目:電話番号
このうち、1列目・2列目・4列目だけを取り込みたい場合は、VBAコード内で次のように指定します。
columnsToKeep = Array(0, 1, 3)
VBAの配列は0から始まるため、Excel上の1列目は 0、2列目は 1、4列目は 3 として指定します。
このマクロで行う処理
- CSVファイルのパスを指定する。
- CSVの区切り文字を指定する。
columnsToKeepに取り込みたい列番号を指定する。- CSVファイルを1行ずつ読み込む。
Split関数で1行をカンマ区切りに分割する。- 指定した列だけをExcelシートへ書き込む。
columnsToKeepの指定方法
取り込みたい列は、次の部分で指定します。
columnsToKeep = Array(0, 1, 3)
これは、CSVの1列目・2列目・4列目を取り込む指定です。
| Excel上の列番号 | VBAで指定する番号 |
|---|---|
| 1列目 | 0 |
| 2列目 | 1 |
| 3列目 | 2 |
| 4列目 | 3 |
たとえば、2列目・3列目・5列目だけを取り込みたい場合は、次のように変更します。
columnsToKeep = Array(1, 2, 4)
このサンプルでは
Split 関数でCSVを分割しています。そのため、セル内にカンマが含まれるCSVや、ダブルクォーテーションで囲まれた複雑なCSVには対応していません。
単純なカンマ区切りCSVを想定したサンプルです。
マクロの例
以下が、CSVから必要な列だけを指定して取り込むマクロです。
Sub ImportCsvKeepingColumns()
'---【設定項目】--------------------------------------------
Dim csvFilePath As String
csvFilePath = "C:\temp\testdata.csv" ' CSVファイルのパスを指定
Dim delimiter As String
delimiter = "," ' CSVの区切り文字
Dim columnsToKeep As Variant
columnsToKeep = Array(0, 1, 3) ' 1列目・2列目・4列目を取り込む
Dim wsDest As Worksheet
Set wsDest = ThisWorkbook.Worksheets("Sheet1")
Dim startRow As Long
Dim startCol As Long
startRow = 1
startCol = 1
'---------------------------------------------------------
Dim fileNo As Integer
Dim textLine As String
Dim spl() As String
Dim i As Long
Dim rowCount As Long
Dim writeCol As Long
Dim fileOpened As Boolean
On Error GoTo ErrHandler
' CSVファイルを開く
fileNo = FreeFile
Open csvFilePath For Input As #fileNo
fileOpened = True
rowCount = startRow
' CSVを1行ずつ読み込み
Do Until EOF(fileNo)
Line Input #fileNo, textLine
' 空行はスキップ
If Len(Trim(textLine)) > 0 Then
' 1行を区切り文字で分割
spl = Split(textLine, delimiter)
writeCol = startCol
' 指定した列だけを取り込む
For i = LBound(columnsToKeep) To UBound(columnsToKeep)
If columnsToKeep(i) <= UBound(spl) Then
wsDest.Cells(rowCount, writeCol).Value = spl(columnsToKeep(i))
Else
wsDest.Cells(rowCount, writeCol).Value = ""
End If
writeCol = writeCol + 1
Next i
rowCount = rowCount + 1
End If
Loop
Close #fileNo
fileOpened = False
MsgBox "CSVの取り込みが完了しました。", vbInformation
Exit Sub
ErrHandler:
If fileOpened Then
Close #fileNo
End If
MsgBox "エラーが発生しました:" & Err.Description, vbExclamation
End Sub
コードのポイント
取り込みたい列を指定する
取り込みたい列は、次の部分で指定しています。
columnsToKeep = Array(0, 1, 3)
この例では、CSVの1列目・2列目・4列目だけをExcelに取り込みます。
取り込み先シートを指定する
取り込み先のシートは、次の部分で指定しています。
Set wsDest = ThisWorkbook.Worksheets("Sheet1")
別のシートへ取り込みたい場合は、Sheet1 の部分を変更してください。
列数が足りない行にも対応する
CSVの行によっては、指定した列が存在しない場合があります。
そのため、次のように UBound を使って、指定した列番号が存在するか確認しています。
If columnsToKeep(i) <= UBound(spl) Then
wsDest.Cells(rowCount, writeCol).Value = spl(columnsToKeep(i))
Else
wsDest.Cells(rowCount, writeCol).Value = ""
End If
これにより、列数が足りない行があってもエラーを防ぎやすくなります。
カスタマイズのポイント
CSVファイルのパスを変更したい場合
CSVファイルのパスは、次の部分で指定しています。
csvFilePath = "C:\temp\testdata.csv"
実際に取り込みたいCSVファイルの場所に合わせて変更してください。
取り込む列を変更したい場合
取り込む列を変更したい場合は、columnsToKeep の中身を変更します。
たとえば、1列目・3列目・5列目を取り込みたい場合は、次のようにします。
columnsToKeep = Array(0, 2, 4)
書き込み開始位置を変更したい場合
書き込み開始位置は、次の部分で指定しています。
startRow = 1
startCol = 1
たとえば、3行目のA列から書き込みたい場合は、次のように変更します。
startRow = 3
startCol = 1
post-4633との違い
このページでは、columnsToKeep を使って、コード内で取り込みたい列を指定しています。
一方、別記事の「ユーザーが指定した不要列を除外してCSVを取り込む方法」では、A1セルやInputBoxを使って、ユーザーが除外したい列を指定する形にしています。
| 記事 | 指定する内容 | 向いているケース |
|---|---|---|
| この記事 | 取り込みたい列をコード内で指定 | 毎回同じ列だけを取り込みたい場合 |
| ユーザー指定版 | 除外したい列をA1セルやInputBoxで指定 | 取り込む列をユーザー側で変更したい場合 |
まとめ
Excel VBAを使うと、CSVファイルから必要な列だけを指定してExcelに取り込むことができます。
今回の方法では、columnsToKeep に列番号を指定するだけで、取り込みたい列を簡単に変更できます。
毎回同じ列だけを取り込む場合は、この方法がシンプルで使いやすいです。
一方、ユーザーが取り込む列を毎回変えたい場合は、A1セルやInputBoxで除外列を指定する方法を使うと、より柔軟に対応できます。


コメント