CSVファイル操作 VBAで自動化 VBA一覧 ファイル・印刷操作

【VBA】CSVをフィルター処理する方法|読み込み・抽出・絞り込みを安全に自動化する実務ガイド

業務でCSVファイルを扱う場面は非常に多く、
Excel VBAを使った自動処理では、次のような要件が頻繁に登場します。

  • CSVを読み込んで条件に合う行だけ抽出したい
  • 不要なデータをフィルターで除外したい
  • 特定条件のデータだけ別シート・別CSVに出力したい
  • 毎日大量のCSVを同じ条件で処理したい

一見すると、

CSVをExcelに開いて
フィルターをかければいいだけ

のように思えますが、
VBAでCSV×フィルターを扱う処理は、実務ではトラブルが非常に多い のが実情です。

  • フィルターが正しく効かない
  • 文字化けする
  • 行数が多いと極端に遅い
  • フィルター結果が0件でエラーになる
  • CSVの構造差で処理が止まる

この記事では、
Excel VBAにおける 「CSV × フィルター処理」 をテーマに、

  • CSV処理でよくある落とし穴
  • VBAでCSVを扱う代表的な方法
  • フィルター処理の実装パターン
  • 実務で安定する設計の考え方
  • 大量CSV・RPA連携を見据えた対応策

を、コード例中心・実務目線 で徹底解説します。

目次

✅ VBAで「CSVをフィルターする」とはどういう処理か

※最初に考え方を整理します。

・CSVは「Excelシート」とは性質が違う

CSVは単なる テキストファイル であり、

  • セルの型がない
  • 書式がない
  • フィルター機能を持たない

という特徴があります。

そのため、
VBAでCSVをフィルターする とは、

CSVを何らかの形で
「処理しやすい構造」に変換した上で
条件抽出を行う

という意味になります。


・代表的なCSVフィルターの考え方

CSVをフィルターする方法は、大きく分けて次の3つです。

  1. Excelに読み込んでAutoFilterを使う
  2. 配列に読み込んでVBAで条件判定する
  3. テキストとして1行ずつ読み込み、条件で振り分ける

それぞれに
向いているケース・向いていないケース
があります。


✅ CSV×フィルターでよくある失敗

※ここを知らないと遠回りします。

・Excelに開いてそのまま処理している

Workbooks.Open "sample.csv"

この方法は簡単ですが、

  • 文字化け
  • 桁落ち
  • 日付の誤変換

が起きやすく、
実務では危険 です。


・フィルター結果0件で止まる

Range("A2:A100").SpecialCells(xlCellTypeVisible)

CSVデータでは、

  • 条件不一致
  • 空行
  • ヘッダーずれ

により、
0件フィルターが頻発 します。

例外処理なしでは不安定です。


✅ 方法①:CSVをExcelに読み込んでフィルターする

※最も分かりやすい方法です。

・処理の流れ

  1. CSVを指定シートに読み込む
  2. ヘッダーを設定
  3. AutoFilterで条件抽出
  4. フィルター結果を処理

・CSVを安全に読み込む基本構造

Workbooks.OpenText _
    Filename:="C:\data\sample.csv", _
    DataType:=xlDelimited, _
    Comma:=True

この方法を使うことで、

  • 区切り文字指定
  • 文字化け回避

が可能になります。


・フィルター処理の基本例

With ActiveSheet
    .Range("A1").AutoFilter Field:=3, Criteria1:="OK"
End With

この時点で、
CSVデータがExcelのフィルター対象 になります。


・メリット / デメリット

メリット

  • ExcelのAutoFilterが使える
  • 見た目で確認しやすい

デメリット

  • 行数が多いと遅い
  • Excel依存が強い
  • 一時ファイル管理が必要



✅ 方法②:CSVを配列に読み込んでフィルターする

※実務で最も安定しやすい方法です。

・考え方

CSVを一度すべて読み込み、

  • 1行ずつ配列に格納
  • 条件に合う行だけ処理

という形で、
VBA側でフィルター処理を行う 方法です。


・CSVを配列に読み込む基本例

Dim fso As Object
Dim ts As Object
Dim line As String
Dim data() As String

Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.OpenTextFile("C:\data\sample.csv")

Do Until ts.AtEndOfStream
    line = ts.ReadLine
    data = Split(line, ",")
    
    ' data(0), data(1), data(2) …
Loop

ts.Close

・条件付きフィルターの例

If data(2) = "OK" Then
    ' 条件一致行の処理
End If

・この方法の強み

  • Excelを介さない
  • 大量CSVでも安定
  • フィルター0件でも止まらない

RPA・バッチ処理向け の設計です。


✅ 方法③:CSVを直接読み込みながらフィルターする

※メモリ節約・超大量データ向けです。

・1行ずつ処理する考え方

Do Until ts.AtEndOfStream
    line = ts.ReadLine
    data = Split(line, ",")
    
    If data(2) = "OK" Then
        ' 出力
    End If
Loop
  • 配列に溜めない
  • 条件に合う行だけ処理

という構造です。


・メリット

  • メモリ消費が少ない
  • 数十万行でも対応可能

・注意点

  • CSV構造が崩れると影響が大きい
  • 列数チェックが必須

✅ CSVフィルターで必ず入れるべき安全対策

※ここが実務では最重要です。

・列数チェック

If UBound(data) < 2 Then GoTo ContinueLoop

CSVは、

  • 空行
  • 不正行

が混ざることが多いため、
列数確認は必須 です。


・ヘッダー行の除外

If data(0) = "ID" Then GoTo ContinueLoop

・Continue用ラベル

ContinueLoop:

VBAには Continue Do がないため、
ラベルで制御します。

参考:【VBA】IF文で何もしない処理しない(continueステートメント)


✅ フィルター結果を別シートに出力する

※CSV→Excel連携の王道です。

・条件一致行を書き出す例

Dim r As Long
r = 2

If data(2) = "OK" Then
    Cells(r, 1).Resize(1, UBound(data) + 1).Value = data
    r = r + 1
End If

✅ フィルター結果を新しいCSVに出力する

※自動化で非常によく使われます。

・出力用TextStream

Dim outTs As Object
Set outTs = fso.CreateTextFile("C:\data\filtered.csv", True)

・条件一致行だけ書き込む

If data(2) = "OK" Then
    outTs.WriteLine line
End If

・処理完了後

outTs.Close

✅ CSVフィルター処理を高速化するポイント

※行数が増えるほど効きます。

・Excel操作を極力使わない

  • AutoFilterより配列処理
  • セル書き込み回数を減らす

・画面更新・計算停止(Excel使用時)

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

✅ フィルター条件が複数ある場合の考え方

※実務で必須です。

・AND条件

If data(2) = "OK" And data(3) <> "0" Then

・OR条件

If data(2) = "OK" Or data(2) = "対象" Then

・条件は1行にまとめる

条件が増えるほど、

  • 可読性
  • 保守性

が重要になります。

参考:【VBA】比較演算子を用いた複数条件の使用方法


✅ CSVフィルター処理でよくある勘違い

※遠回りの原因です。

・「フィルター=AutoFilter」

→ CSVではVBA判定の方が安定します。

・「Excelに開くのが一番楽」

→ 小規模限定です。


✅ RPA(UiPath)連携を前提としたCSVフィルター設計

※実務ではここが評価されます。

  • CSV構造が変わる前提
  • フィルター0件でも正常終了
  • ログ出力を入れる

VBA側でCSVをフィルターして整形 しておくことで、
RPAのシナリオは非常に安定します。


✅ 実務向け:CSVフィルター処理テンプレート(完成形)

Sub FilterCsv()

    Dim fso As Object
    Dim ts As Object
    Dim outTs As Object
    Dim line As String
    Dim data() As String
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile("C:\data\sample.csv")
    Set outTs = fso.CreateTextFile("C:\data\filtered.csv", True)
    
    Do Until ts.AtEndOfStream
        line = ts.ReadLine
        data = Split(line, ",")
        
        If UBound(data) < 2 Then GoTo ContinueLoop
        If data(0) = "ID" Then GoTo ContinueLoop
        
        If data(2) = "OK" Then
            outTs.WriteLine line
        End If
        
ContinueLoop:
    Loop
    
    ts.Close
    outTs.Close

End Sub

✅ まとめ:VBAでCSVをフィルター処理する本質

  • CSVはExcelとは別物
  • フィルター方法は3パターンある
  • 実務では配列 or 行単位処理が安定
  • 列数・0件・構造差対策が必須
  • RPA連携を見据えるとVBA処理が有利

VBAでのCSVフィルター処理は、
「楽な方法」より「壊れない方法」 を選ぶことが重要です。

ぜひ、
この記事の設計思想をベースに、
安定したCSV自動処理 を実務に取り入れてください。

参考:【VBA】CSVを保存・書き出す方法|基本から応用まで徹底解説

    -CSVファイル操作, VBAで自動化, VBA一覧, ファイル・印刷操作