【VBAリファレンス|実務向け】脱・ループ処理!Filter関数で配列操作をスマートにこなす技術

スポンサーリンク

こんにちは、VBA講師です。日々の業務で「大量のデータの中から、特定のキーワードを含む行だけを抽出したい」という場面、よくありますよね。多くのエンジニアが真っ先に思いつくのは、Forループで配列を一つずつ回し、If文で判定する方法ではないでしょうか。

もちろんその方法でも動きますが、コードが長くなりがちで、実行速度の面でも改善の余地があります。今回は、配列操作の隠れた名手「Filter関数」を使って、実務のコードを劇的に短く、そして速くする方法を伝授します。

Filter関数は「一致する要素だけを抜き出す」ための道具

Filter関数は、配列の中から特定の文字列を含む要素だけを抽出し、新しい配列として返してくれる関数です。構文は「Filter(ソース配列, 検索文字列, [含めるか除外するか], [比較モード])」と非常にシンプルです。

実務で差がつく活用事例:ステータス管理

例えば、数百件あるタスクリストの配列から「完了」という文字が含まれる項目だけを抽出したいとします。

【従来の書き方(ループ処理)】
Dim i As Long, result() As String, count As Long
For i = LBound(tasks) To UBound(tasks)
If InStr(tasks(i), “完了”) > 0 Then
ReDim Preserve result(count)
result(count) = tasks(i)
count = count + 1
End If
Next i

これに対し、Filter関数を使うとどうなるでしょうか。

【Filter関数を使った書き方】
Dim result() As String
result = Filter(tasks, “完了”, True, vbTextCompare)

たった1行です。これだけで、条件に一致する要素のみが格納された新しい配列が生成されます。コードの可読性が上がるだけでなく、ループ処理を何度も回す必要がないため、大量データを扱う際の処理速度も向上します。

知っておくべき「落とし穴」と対策

実務で使う際に注意すべき点が二つあります。

一つ目は、「0から始まるインデックス」です。Filter関数で作成された配列は、元の配列が何番から始まっていようと、必ず0番目から始まります。元のデータのインデックス番号を保持したい場合は、ループ処理との併用が必要になるため注意してください。

二つ目は、「完全一致ではない」という点です。Filter関数は「部分一致」で検索します。例えば「完了」で検索すると「未完了」も引っかかってしまいます。もし完全一致が必要な場合は、フィルタリング後に再度チェックを入れるか、あるいはDictionaryオブジェクトの併用を検討しましょう。

まとめ:適材適所の判断力を養う

Filter関数は「文字列の抽出」においては最強のツールですが、数値の判定や複雑な条件式には向きません。

「何でもループで回す」という癖から一歩進んで、「この処理はFilterで1行にできないか?」と考える習慣をつけてください。この視点の切り替えこそが、メンテナンス性の高いVBAコードを書くための第一歩です。ぜひ明日の業務から取り入れてみてくださいね。

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