Excel VBA|CSVから必要な行と列だけを取り込むマクロ

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

Excel VBAを使って、CSVファイルから必要な行と列だけを取り込む方法を紹介します。

今回のマクロでは、B列に記載されている担当部署が「A部署」「B部署」「C部署」の行だけを対象にし、さらに不要なJ列〜M列を除外して取り込みます。

CSVの中から必要なデータだけを抜き出したい場合や、毎回手作業で不要な列を削除している場合に便利なマクロです。

CSVから必要な行と列だけを取り込む条件

Excel VBAを使って、CSVファイルから必要な行と列だけを取り込み、Excelの「Sheet1」に転記するマクロ例です。

今回は、次の2つの条件を満たすデータだけを取り込みます。

  1. B列(CSV上では2番目の列)に記載されている担当部署が「A部署」「B部署」「C部署」のいずれかである行のみ取り込む。
  2. 不要な列(CSVのJ列からM列に相当する列)を除外して取り込む。

Excel上での列名「J〜M」は、1列目がA列、2列目がB列・・・10列目がJ列、11列目がK列、12列目がL列、13列目がM列となるため、1-basedで見ると10〜13列になります。

一方、VBAで Split した配列のインデックスは0から始まるため、0-basedでは9〜12 が該当列です。

このマクロで行う処理

  1. CSVファイルを1行ずつ読み込む。
  2. Split 関数で1行をカンマ区切りに分割する。
  3. B列の部署名を確認する。
  4. 「A部署」「B部署」「C部署」の行だけを対象にする。
  5. J列〜M列を除外する。
  6. 残った列だけを Sheet1 へ書き込む。
注意:
このサンプルでは Split 関数でCSVを分割しています。
そのため、セル内にカンマが含まれるCSVや、ダブルクォーテーションで囲まれた複雑なCSVには対応していません。
単純なカンマ区切りCSVを想定したサンプルです。

マクロの例

Sub ImportCsvFilterAndExcludeCols()

    '===【設定項目】=======================================
    Dim csvFilePath As String
    csvFilePath = "C:\temp\sample.csv"  ' CSVファイルのパスを指定
    
    Dim delimiter As String
    delimiter = ","                    ' CSVの区切り文字(カンマ)
    
    ' フィルタ対象の部署リスト
    Dim deptArray As Variant
    deptArray = Array("A部署", "B部署", "C部署")  ' このいずれかを含む行だけ取り込む
    
    ' 除外する列インデックス(0-based)
    ' 例:J列〜M列 → 1-basedで10〜13列 → 0-basedで9〜12
    Dim excludeCols As Variant
    excludeCols = Array(9, 10, 11, 12)
    
    ' 転記先シート・開始セル
    Dim wsDest As Worksheet
    Set wsDest = ThisWorkbook.Worksheets("Sheet1")  ' 貼り付け先シート
    
    Dim startRow As Long: startRow = 1
    Dim startCol As Long: startCol = 1
    '===================================================
    
    Dim fileNo As Integer
    Dim textLine As String
    Dim spl() As String
    Dim currentRow As Long
    Dim colIndex As Long
    
    ' CSVファイルを開く
    fileNo = FreeFile
    Open csvFilePath For Input As #fileNo
    
    currentRow = startRow
    
    ' CSVを1行ずつ読み込み
    Do Until EOF(fileNo)
        Line Input #fileNo, textLine
        
        ' 空行はスキップ
        If Len(Trim(textLine)) > 0 Then
        
            ' 1行を区切り文字で分割
            spl = Split(textLine, delimiter)
            
            ' B列を参照するため、最低でも2列以上あるか確認
            If UBound(spl) >= 1 Then
            
                '===== [1] 部署フィルタ:B列(0-basedで spl(1))を判定 =====
                ' B列にある部署が、deptArrayのいずれかに合致するか判定
                If IsInArray(spl(1), deptArray) Then
                    
                    '===== [2] 不要列の除外:J列〜M列(0-basedで9〜12)をスキップして貼り付け =====
                    Dim writeCol As Long
                    writeCol = startCol  ' 書き込み開始列
                    
                    For colIndex = LBound(spl) To UBound(spl)
                        ' 除外する列に含まれていなければ出力
                        If Not IsInArray(colIndex, excludeCols) Then
                            wsDest.Cells(currentRow, writeCol).Value = spl(colIndex)
                            writeCol = writeCol + 1
                        End If
                    Next colIndex
                    
                    currentRow = currentRow + 1  ' 次の行へ
                End If
            
            End If
        
        End If
    Loop
    
    Close #fileNo
    
    MsgBox "CSVの取込が完了しました。"

End Sub

'----------------------------------------------------------
' 指定した値(variantValue)が配列(arr)内に存在するかを判定する関数
'    variantValue : チェック対象
'    arr          : Variant配列(Array(...)で定義)
'----------------------------------------------------------
Private Function IsInArray(ByVal variantValue As Variant, ByVal arr As Variant) As Boolean

    Dim i As Long
    
    For i = LBound(arr) To UBound(arr)
        If arr(i) = variantValue Then
            IsInArray = True
            Exit Function
        End If
    Next i
    
    IsInArray = False

End Function

マクロの流れ

  1. CSVファイルを1行ずつ読み込みます。
  2. Split 関数で行を区切り、配列 spl に格納します。
  3. 空行や列数が足りない行をスキップします。
  4. B列(0-basedで spl(1))に含まれる部署名が「A部署」「B部署」「C部署」のいずれかかを確認します。
  5. 条件に合う行だけを対象にします。
  6. 不要な列(J〜M列:0-basedで9〜12)をスキップします。
  7. 残った列だけを Sheet1 へ書き込みます。
  8. すべての行を処理したら完了メッセージを表示します。

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

コメント

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