業務で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フィルターの考え方
- ✅ CSV×フィルターでよくある失敗
- ・Excelに開いてそのまま処理している
- ・フィルター結果0件で止まる
- ✅ 方法①:CSVをExcelに読み込んでフィルターする
- ・処理の流れ
- ・CSVを安全に読み込む基本構造
- ・フィルター処理の基本例
- ✅ 方法②:CSVを配列に読み込んでフィルターする
- ・考え方
- ・CSVを配列に読み込む基本例
- ・条件付きフィルターの例
- ・この方法の強み
- ✅ 方法③:CSVを直接読み込みながらフィルターする
- ・1行ずつ処理する考え方
- ✅ CSVフィルターで必ず入れるべき安全対策
- ・列数チェック
- ・ヘッダー行の除外
- ・Continue用ラベル
- ✅ フィルター結果を別シートに出力する
- ・条件一致行を書き出す例
- ✅ フィルター結果を新しいCSVに出力する
- ・出力用TextStream
- ・条件一致行だけ書き込む
- ・処理完了後
- ✅ CSVフィルター処理を高速化するポイント
- ・Excel操作を極力使わない
- ・画面更新・計算停止(Excel使用時)
- ✅ フィルター条件が複数ある場合の考え方
- ・AND条件
- ・OR条件
- ・条件は1行にまとめる
- ✅ CSVフィルター処理でよくある勘違い
- ・「フィルター=AutoFilter」
- ・「Excelに開くのが一番楽」
- ✅ RPA(UiPath)連携を前提としたCSVフィルター設計
- ✅ 実務向け:CSVフィルター処理テンプレート(完成形)
- ✅ まとめ:VBAでCSVをフィルター処理する本質
✅ VBAで「CSVをフィルターする」とはどういう処理か
※最初に考え方を整理します。
・CSVは「Excelシート」とは性質が違う
CSVは単なる テキストファイル であり、
- セルの型がない
- 書式がない
- フィルター機能を持たない
という特徴があります。
そのため、
VBAでCSVをフィルターする とは、
CSVを何らかの形で
「処理しやすい構造」に変換した上で
条件抽出を行う
という意味になります。
・代表的なCSVフィルターの考え方
CSVをフィルターする方法は、大きく分けて次の3つです。
- Excelに読み込んでAutoFilterを使う
- 配列に読み込んでVBAで条件判定する
- テキストとして1行ずつ読み込み、条件で振り分ける
それぞれに
向いているケース・向いていないケース
があります。
✅ CSV×フィルターでよくある失敗
※ここを知らないと遠回りします。
・Excelに開いてそのまま処理している
Workbooks.Open "sample.csv"
この方法は簡単ですが、
- 文字化け
- 桁落ち
- 日付の誤変換
が起きやすく、
実務では危険 です。
・フィルター結果0件で止まる
Range("A2:A100").SpecialCells(xlCellTypeVisible)
CSVデータでは、
- 条件不一致
- 空行
- ヘッダーずれ
により、
0件フィルターが頻発 します。
例外処理なしでは不安定です。
✅ 方法①:CSVをExcelに読み込んでフィルターする
※最も分かりやすい方法です。
・処理の流れ
- CSVを指定シートに読み込む
- ヘッダーを設定
- AutoFilterで条件抽出
- フィルター結果を処理
・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行にまとめる
条件が増えるほど、
- 可読性
- 保守性
が重要になります。
✅ 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自動処理 を実務に取り入れてください。