「またループ書くの?」という悩みへの終止符
「この1,000行あるリストから、支店ごとにデータをまとめておいて」
上司からのこんな依頼、ありますよね。VBAを覚えたての頃の私は、愚直にこう書いていました。
- 新しい配列を用意して……
- For i = 0 To UBound(元の配列) でループを回して……
- If 元の配列(i) Like “*東京支店*” Then で判定して……
- 合致したら新しい配列を ReDim Preserve で拡張して格納して……。
「……長い! 読みづらい! 疲れる!」
当時はこんなふうに思っていましたが、実はこれ、「Filter関数」を使えばたった1行で終わるんです。
この手法を知ったとき、私は自身の知識不足を痛感すると同時に、その圧倒的な効率の良さに大きな衝撃を受けました。
Filter関数は「お料理のふるい」と同じです
Filter関数を専門的に説明すると、1次元配列から特定の文字列を含む要素を抽出する関数となります。
しかし、もっと直感的に理解するなら、料理で使うふるいやストレーナーを想像してみてください。
大量のデータの中から特定のキーワードだけを、ひと振りでサッと取り出す。そんなスマートな操作をイメージしていただくと分かりやすいでしょう。
基本的な記述方法
ResultArray = Filter(SourceArray, "検索したい文字")
たったこれだけです。For文もNextもIfも必要ありません。
【実践】コピペで使える!爆速抽出コード
業務で頻出する、商品リストから特定のキーワードが含まれるものだけを抽出するサンプルコードをご紹介します。
Sub Sample_Filter()
' --- 変数の準備 ---
Dim ProductList As Variant
Dim FoundItems As Variant
Dim i As Long
' 1. 元となるデータを作成
ProductList = Array("リンゴ(青森)", "バナナ(フィリピン)", "リンゴ(長野)", "ブドウ(山梨)")
' 2. 「リンゴ」が含まれる要素だけを抽出
FoundItems = Filter(ProductList, "リンゴ")
' 3. 結果を表示
If UBound(FoundItems) = -1 Then
MsgBox "見つかりませんでした。"
Else
For i = 0 To UBound(FoundItems)
Debug.Print "抽出結果: " & FoundItems(i)
Next i
MsgBox UBound(FoundItems) + 1 & "件のデータが見つかりました。"
End If
End Sub
Filter関数を使いこなすための3つのポイント
実務で使うために、これだけは覚えておいてほしいポイントが3つあります。
- 部分一致による検索
「リンゴ」と指定すれば、「リンゴ(青森)」も「リンゴ(長野)」も柔軟に拾い上げることができます。 - 1次元配列専用であること
Rangeオブジェクトから直接取得した2次元配列には使用できません。ここが最も躓きやすいポイントですので、注意が必要です。 - 大文字・小文字の区別を設定可能
第4引数にvbTextCompareを指定することで、大文字・小文字を区別せずに検索を行うことができます。
最後に:失敗を恐れずに「楽」をしよう
以前の私は、 何でもかんでもFor文で書いていました。でも、実務の現場で求められるのは、速くて、正確で、誰が見てもわかりやすい簡潔なコードです。
Filter関数のよう便利な道具を覚えることは、決して手抜きではありません。むしろ、付加価値の高い、より重要な業務に集中するための賢い選択です。
もし「配列って難しそう……」と感じていても大丈夫です。まずはこのコードをコピペして、検索ワードを変えて試してみてください。その一歩が、日々の事務作業を変えていくはずです!
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

コメント