【Excel vb】CSVの不要な列を除いてExcelに取り込む方法

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

以下に、Excel VBAを使って「CSVファイルを読み込み、不要な列をスキップしてExcelシートへ転記する」サンプルマクロの一例を示します。

基本的な考え方は、テキストファイルとしてCSVを行単位で読み込み、Split関数で区切って配列に落とし込み、必要な列だけをExcelシートに書き込むという流れです。

実際にご利用になる際は、ご自身の環境に合わせてパスや不要な列番号などを調整してください。

マクロの概要

  1. 読み込みたいCSVのファイルパスcsvFilePath で指定します。
  2. CSVの区切り文字(一般的にはカンマ,)を delimiter で指定します。TSVの場合はタブ文字vbTab等に置き換えます。
  3. 取り込みたい列の番号columnsToKeep で指定します。VBAの配列は0番始まりなので、
    • CSVの「1列目」は Array(0)
    • CSVの「2列目」は Array(1)
    • CSVの「4列目」は Array(3)
      のようになります。不要な列はこの配列に含めなければ取り込まれません。
  4. 出力を開始するセル位置を startRowstartCol で指定します。

※「この列とこの列は取って、この列はスキップしたい」といったニーズに合わせて columnsToKeep を調整してください。

ポイント&アレンジ例

「ヘッダー行をスキップしたい」場合は、最初の行だけ読み飛ばすロジックを追加すればOKです。たとえば rowCount = startRow の前あたりで Line Input #fileNo, textLine を一度実行して読み飛ばすなど工夫してください。

「最大列数や動的に列数を把握したい」場合は、読み込んだ配列 splUBound(spl) で列数(インデックスの最大値)を確認できますので、その情報を使って必要列を判定する方法もあります。

「貼り付け先をシート名指定で行いたい」場合は Sheets("Sheet名").Cells(rowCount, startCol + (i)).Value = ... とするなど、Cells の前に対象シートを付けてください。

このマクロをベースに、不要な列を省いて取り込みたい場合は

    • すべての列を配列に読み込む
    • 一部の列のみをExcelに書き込む

という形になります。ぜひカスタマイズしてご利用ください。

サンプルコード

Sub ImportCsvSkippingColumns()

    '---【設定項目】--------------------------------------------
    ' 1. CSVファイルのパスを指定
    Dim csvFilePath As String
    csvFilePath = "C:\temp\testdata.csv"  '←ご自身のCSVの場所に合わせて変更してください
    
    ' 2. CSVファイルの区切り文字(一般的にはカンマ)を指定
    Dim delimiter As String
    delimiter = ","
    
    ' 3. 取り込みたい列(インデックス)を指定
    '    例: CSVの1列目・2列目・4列目のみ取り込みたい場合 → 配列(0,1,3)
    '    VBAの配列は0始まりなので、CSVの1列目ならインデックス0になります
    Dim columnsToKeep As Variant
    columnsToKeep = Array(0, 1, 3)  ' この例では1列目,2列目,4列目を取り込み
    
    ' 4. データの貼り付け先を開始するセルを指定
    Dim startRow As Long
    Dim startCol As Long
    startRow = 1   ' 行方向の開始位置 (ヘッダを入れたい場合は2などにする)
    startCol = 1   ' 列方向の開始位置
    '---------------------------------------------------------
    
    Dim fileNo As Integer
    Dim textLine As String
    Dim spl() As String
    Dim i As Long
    Dim rowCount As Long
    
    ' CSVファイルを開く
    fileNo = FreeFile
    Open csvFilePath For Input As #fileNo
    
    rowCount = startRow
    
    ' 行の終わりまで読み込み
    Do Until EOF(fileNo)
        Line Input #fileNo, textLine
        
        ' 区切り文字で分割して配列に格納
        spl = Split(textLine, delimiter)
        
        ' 必要な列だけをExcelに出力
        ' columnsToKeepに指定した順で貼り付ける
        For i = LBound(columnsToKeep) To UBound(columnsToKeep)
            Cells(rowCount, startCol + (i)).Value = spl(columnsToKeep(i))
        Next i
        
        rowCount = rowCount + 1
    Loop
    
    Close #fileNo
    
    MsgBox "CSVの取り込みが完了しました。"
End Sub

にほんブログ村 IT技術ブログ IT技術メモへ

コメント

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