Excel VBA|CSVから必要な列だけを指定して取り込む方法

スポンサーリンク
この記事は約5分で読めます。

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 として指定します。

このマクロで行う処理

  1. CSVファイルのパスを指定する。
  2. CSVの区切り文字を指定する。
  3. columnsToKeep に取り込みたい列番号を指定する。
  4. CSVファイルを1行ずつ読み込む。
  5. Split 関数で1行をカンマ区切りに分割する。
  6. 指定した列だけを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で除外列を指定する方法を使うと、より柔軟に対応できます。

コメント

タイトルとURLをコピーしました