こんにちは、VBA講師の山下です。実務で最も要望が多いのが「特定の条件でデータを絞り込む」作業ではないでしょうか。今回は、単なるフィルタリングを超えた、実戦的なデータ抽出テクニックを解説します。
なぜ「オートフィルタ」をそのまま記録してはいけないのか
マクロの記録でフィルタ操作を行うと、コードには具体的な値がベタ書きされます。しかし、実務では「昨日入力されたデータ」や「目標値を上回った売上」のように、条件が動的に変化します。
ここで重要なのは、フィルタをかけること自体よりも「どの行を抽出するか」という判定ロジックを配列としてメモリ上で完結させることです。
セル範囲を配列に読み込み、高速に判定する
多くの初心者は、ループで1行ずつセルを参照し、条件に合致したらコピペするというコードを書きます。これはデータ量が増えると非常に低速です。
実務で私が推奨するのは、以下の手順です。
1. 処理対象の範囲をVariant型の配列に一気に格納する
2. メモリ上の配列内で条件判定を行い、抽出対象の行番号だけを保持する
3. 最後に、必要な行だけをまとめて転記(または削除・加工)する
具体的な事例:複数条件での抽出
例えば、「部署が営業部」かつ「売上が100万円以上」という条件でデータを抽出する場合、コードの書き出しは以下のようになります。
コードの考え方
If 文の中に条件を詰め込むのではなく、判定用のフラグ変数を用意するのがコツです。
Dim data As Variant
data = Range(“A1”).CurrentRegion.Value
‘ この配列をループで回し、条件判定を行う
For i = 2 To UBound(data, 1)
If data(i, 2) = “営業部” And data(i, 3) >= 1000000 Then
‘ ここで抽出処理を行う
End If
Next i
次回予告
今回は「判定ロジック」の基礎となる考え方をお伝えしました。次回は、この「抽出した行をどうやって効率的に別シートへ書き出すか」という、実務で差がつくテクニックを深掘りしていきます。
VBAは「書く」ことより「いかに効率よくメモリを扱うか」が重要です。ぜひ今のうちに、セルを直接触らないコーディングの感覚を掴んでおいてくださいね。
