「配列の特定の条件に合う要素だけを取り出したい」
このように悩んだことはありませんか?

・データを手動で絞り込むのが面倒で効率が悪い
・条件に合う要素だけを簡単に抽出する方法を知りたい
・大量データを自動的に操作し、作業時間を短縮したい



こうしたお悩みを解決する方法が
「VBAのFilter関数」を使った配列操作です!
この記事では、「VBAを使って1次元配列や2次元配列をフィルターする方法」を分かりやすく解説します。
Filter関数を使用すると、配列から特定の値を簡単に抽出でき、部分一致や完全一致など柔軟な条件でのフィルターが可能です。
また、1次元配列・2次元配列のデータ操作を自動化し、作業時間を大幅に短縮できます。
これにより、大量データの効率的な処理が実現し、手作業の負担が軽減されます。
初心者でも実践できるように、簡単なコード例を交えながら説明します。
この記事を読むことで、次のことができるようになります。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ スキルアップの第一歩!VBA講座はこちらから /
この記事を読むことで「できるようになる」こと
- VBAで配列をフィルター処理したら何が便利か?確認する
- Filter関数の基礎を習得する
- Filter関数の注意ポイントを把握する
- Filter関数が使用できない2次元配列はどうしたらいいか?を確認する
- Filter関数の使用例を確認する
VBAの配列操作で「フィルター」を使うメリット
配列を操作する際、目的のデータを抽出するために「条件で絞り込む」作業が必要になることがよくあります。
- 顧客リストから特定の地域だけを取り出す
- セールスデータから特定の売上金額以上のものを抽出する
VBAでは、Filter関数やループ処理を使うことで、これらのフィルタリング作業を簡単かつ効率的に実現できます。
ただし、ループ処理を使う場合、データ量が多いと時間がかかることがあります。Filter関数を使えば、一行で条件を適用できるため、コードが簡潔になり処理速度も向上します。


VBAの「Filter関数」の基礎|使い方をマスターしよう
VBAのFilter関数は、配列から特定の条件に一致する要素を簡単に抽出するための強力なツールです。
このセクションでは、Filter関数の基本的な使い方を解説します。
初心者でも理解しやすいように、構文や実例を交えながら説明します。
Filter関数の基本構文


引数 | 必須/任意 | 説明 |
---|---|---|
sourceArray | 必須 | フィルタリング対象の1次元配列。 |
match | 必須 | 抽出条件となる文字列。 |
[include] | 任意 | True の場合、条件に一致する要素を抽出。False の場合、一致しない要素を抽出(デフォルトはTrue )。 |
[compare] | 任意 | 大文字小文字を区別するか、またはどのように比較するかを指定 (デフォルトは vbBinaryCompare )。 |
より詳しい情報は、Microsoft公式のFilter 関数を参照してください。
compare引数について解説
compare引数を使うことで、大文字小文字を区別するかどうか、または比較方法を柔軟に設定できます。
比較方法 | 値 | 説明 |
---|---|---|
vbBinaryCompare | 0 | 大文字小文字を区別するバイナリ比較を実行(デフォルト設定)。 |
vbTextCompare | 1 | 大文字小文字を区別せずに比較を実行。 |
vbUseCompareOption | -1 | Option Compare ステートメントの設定に従う(Binary またはText のどちらか)。 |
Filter関数の使用例
1. 基本例:特定の文字列を部分一致で抽出
以下は、「文字列に"パイ"
が含まれる要素を抽出する」例です。
Sub FilterBasicExample()
Dim fruits As Variant
Dim result As Variant
Dim i As Long
'// 配列を定義
fruits = Array("リンゴ", "ミカン", "バナナ", "パイナップル", "ブドウ")
'// "パイ"を含む要素を抽出
result = Filter(fruits, "パイ")
'// 抽出結果をメッセージボックスで表示
For i = LBound(result) To UBound(result)
Debug.Print result(i)
Next i
End Sub


2. 大文字小文字を区別する抽出
compare引数のデフォルト設定(vbBinaryCompare
)では、大文字小文字を区別して検索します。
Sub FilterWithCaseSensitivity()
Dim fruits As Variant
Dim result As Variant
Dim i As Long
'// 配列を定義
fruits = Array("Apple", "apple", "APPLE", "Banana")
'// "apple" を抽出(大文字小文字を区別)
result = Filter(fruits, "apple", True, vbBinaryCompare)
'// 抽出結果をメッセージボックスで表示
For i = LBound(result) To UBound(result)
Debug.Print result(i)
Next i
End Sub


3. 大文字小文字を区別しない抽出
大文字小文字を区別せずに検索したい場合、compare
引数をvbTextCompare
に設定します。
Sub FilterWithoutCaseSensitivity()
Dim fruits As Variant
Dim result As Variant
Dim i As Integer
'// 配列を定義
fruits = Array("Apple", "apple", "APPLE", "Banana")
'// "apple" を抽出(大文字小文字を区別しない)
result = Filter(fruits, "apple", True, vbTextCompare)
'// 抽出結果をメッセージボックスで表示
If Not IsEmpty(result) Then
For i = LBound(result) To UBound(result)
MsgBox result(i)
Next i
Else
MsgBox "条件に一致する要素がありませんでした。"
End If
End Sub


Filter関数を使う際に知っておきたい3つの注意ポイント
注意ポイント1 : Filter関数は、1次元配列のみ対応
Filter関数は1次元配列専用です。
2次元配列やそれ以上の次元では動作しないため、これらを扱う場合はループ処理を使ってフィルタリングを行いましょう。
注意ポイント2 : 一致しない場合の挙動
条件に一致する要素がない場合、Filter関数は空の配列を返します。
このとき、配列の結果をそのまま使うとエラーになる可能性があるため、事前にIsEmpty
関数を使って確認するのがおすすめです。
例:結果が空かどうかを確認するコード
Sub CheckFilterResult()
Dim myArray As Variant
Dim result As Variant
'// 配列を定義
myArray = Array("リンゴ", "ミカン", "バナナ", "パイナップル", "ブドウ")
'// "スイカ" を条件として抽出(条件に一致しない要素を想定)
result = Filter(myArray, "スイカ")
'// 抽出結果を確認
On Error Resume Next
If LBound(result) > UBound(result) Then
MsgBox "条件に一致する要素が見つかりませんでした。"
Else
MsgBox "抽出完了!"
End If
On Error GoTo 0
End Sub


注意ポイント3. compare引数のデフォルト値
compare引数を指定しない場合、デフォルトでvbBinaryCompare
が適用されます。
これは、大文字小文字を区別するバイナリ比較が行われる設定です。
大文字小文字を区別しない検索を行いたい場合は、vbTextCompare
を指定してください。
VBAで2次元配列をフィルターする方法 | Filter関数は使用できません
VBAで2次元配列をフィルターする際、Filter関数は1次元配列専用であるため使用できません。
そこで、代わりにループ処理と一時配列を組み合わせることで、条件に一致するデータを抽出する方法を解説します。
- 2次元配列を指定した条件でフィルタリングする
- タイトル行を含めるオプションの設定
- フィルタリング結果を動的に配列へ格納する
そもそも2次元配列とは?という方はこちら


使用例:特定の値を含む行を抽出
以下は、2次元配列から特定の列の値でフィルターをかけるコード例です。
具体的なコード
Sub Filter2DArrayInOneProcedure()
Dim data(1 To 5, 1 To 3) As Variant
Dim resultArray() As Variant
Dim tempArray() As Variant
Dim filterCol As Long
Dim filterKey As String
Dim includeTitle As Boolean
Dim i As Long, j As Long, k As Long
Dim resultIndex As Long
Dim minRow As Long, maxRow As Long
Dim minCol As Long, maxCol As Long
'// サンプルデータの設定
data(1, 1) = "商品名": data(1, 2) = "カテゴリ": data(1, 3) = "価格"
data(2, 1) = "リンゴ": data(2, 2) = "果物": data(2, 3) = 100
data(3, 1) = "バナナ": data(3, 2) = "果物": data(3, 3) = 150
data(4, 1) = "にんじん": data(4, 2) = "野菜": data(4, 3) = 80
data(5, 1) = "オレンジ": data(5, 2) = "果物": data(5, 3) = 120
'// フィルター条件の設定
filterCol = 2 '// フィルター対象列(カテゴリ)
filterKey = "果物" '// フィルター条件
includeTitle = True '// タイトル行を含む場合はTrue
'// 入力配列の境界を取得
minRow = LBound(data, 1)
maxRow = UBound(data, 1)
minCol = LBound(data, 2)
maxCol = UBound(data, 2)
'// 結果配列の初期化
ReDim resultArray(1 To 1, minCol To maxCol)
resultIndex = 0
'// タイトル行を含める場合
If includeTitle Then
resultIndex = resultIndex + 1
For j = minCol To maxCol
resultArray(1, j) = data(minRow, j)
Next j
End If
'// フィルタリング処理
For i = minRow + IIf(includeTitle, 1, 0) To maxRow
If data(i, filterCol) Like filterKey Then
'// 一時配列で行を追加
resultIndex = resultIndex + 1
ReDim tempArray(1 To resultIndex, minCol To maxCol)
'// 元の結果を一時配列にコピー
For j = minCol To maxCol
If resultIndex > 1 Then
For k = 1 To resultIndex - 1
tempArray(k, j) = resultArray(k, j)
Next k
End If
'// 現在の行をコピー
tempArray(resultIndex, j) = data(i, j)
Next j
'// 一時配列を結果配列に再コピー
ReDim resultArray(1 To resultIndex, minCol To maxCol)
For k = 1 To resultIndex
For j = minCol To maxCol
resultArray(k, j) = tempArray(k, j)
Next j
Next k
End If
Next i
'// 結果の表示
If resultIndex = 0 Then
Debug.Print "条件に一致するデータがありません。"
Else
For i = LBound(resultArray, 1) To UBound(resultArray, 1)
For j = LBound(resultArray, 2) To UBound(resultArray, 2)
Debug.Print resultArray(i, j);
Next j
Debug.Print
Next i
End If
End Sub
実行結果


コードの動作概要
フィルター対象の列番号(filterCol
)とフィルター条件(filterKey
)を設定します。
このコードでは、カテゴリ列(2列目)を対象に「果物」に一致する行を抽出する設定です。
タイトル行を結果に含めるか(includeTitle
)も設定可能です。
LBound
およびUBound
関数を使用して、入力配列の行数と列数を取得します。
これにより、動的に配列を操作できるようになります。
結果を格納するための配列(resultArray
)を初期化します。
必要に応じてタイトル行を結果配列にコピーします。
Forループを使用して、条件に一致する行を1行ずつ確認します。
条件に一致した場合、一時配列(tempArray
)を使用して行を動的に追加します。
一時配列の内容を結果配列にコピーし直します。
フィルター処理が完了したら、Debug.Print
を使用して結果を出力します。
条件に一致するデータがない場合は、「条件に一致するデータがありません」と表示されます。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Public Sub Filter2DArrayInOneProcedure()
Dim data(1 To 5, 1 To 3) As Variant
Dim resultArray() As Variant
Dim tempArray() As Variant
Dim filterCol As Long
Dim filterKey As String
Dim includeTitle As Boolean
Dim i As Long, j As Long, k As Long
Dim resultIndex As Long
Dim minRow As Long, maxRow As Long
Dim minCol As Long, maxCol As Long- サブルーチンの開始
Public Sub Filter2DArrayInOneProcedure()
でサブルーチンを開始します。
このプロシージャ内で、2次元配列をフィルターする全ての処理が完結します。
- データ用の2次元配列を定義
data
配列を定義し、行と列の範囲を1〜5行、1〜3列とします。
各列の内容は「商品名」「カテゴリ」「価格」に対応します。
- 結果用の動的配列と一時配列を定義
- フィルタリング後の結果を格納するための
resultArray
と、動的に配列を拡張するためのtempArray
を定義。
- フィルタリング後の結果を格納するための
- フィルター条件用の変数を宣言
filterCol
:フィルター対象の列番号(1列目、2列目など)。filterKey
:抽出条件の文字列(例:果物)。includeTitle
:タイトル行を結果に含めるかのフラグ(True/False)。
- 補助変数の宣言
i
、j
、k
:ループ処理で行と列を操作するためのカウンタ。resultIndex
:結果配列の行番号を管理。minRow
、maxRow
、minCol
、maxCol
:配列の境界を取得するための変数。
- サブルーチンの開始
- data(1, 1) = “商品名”: data(1, 2) = “カテゴリ”: data(1, 3) = “価格”
data(2, 1) = “リンゴ”: data(2, 2) = “果物”: data(2, 3) = 100
data(3, 1) = “バナナ”: data(3, 2) = “果物”: data(3, 3) = 150
data(4, 1) = “にんじん”: data(4, 2) = “野菜”: data(4, 3) = 80
data(5, 1) = “オレンジ”: data(5, 2) = “果物”: data(5, 3) = 120- 2次元配列
data
に、以下のサンプルデータを直接設定します。- 商品名、カテゴリ、価格の3列。
「果物」カテゴリの商品を抽出する条件を設定します。
- 商品名、カテゴリ、価格の3列。
- 2次元配列
- filterCol = 2
filterKey = “果物”
includeTitle = True
minRow = LBound(data, 1)
maxRow = UBound(data, 1)
minCol = LBound(data, 2)
maxCol = UBound(data, 2)
ReDim resultArray(1 To 1, minCol To maxCol)
resultIndex = 0- フィルター条件を設定
filterCol
で、フィルター対象列を指定(2列目:カテゴリ)。filterKey
で、フィルター条件を設定(「果物」を含む行を抽出)。includeTitle
をTrueに設定すると、タイトル行を結果に含めます。
- 配列の境界を取得
LBound
とUBound
で、配列の行・列の最小値・最大値を取得します。
- 結果配列を初期化
- 初期状態の
resultArray
を1行分だけ確保。 - フィルター結果が追加されるたびに動的に拡張します。
- 初期状態の
- フィルター条件を設定
- If includeTitle Then
resultIndex = resultIndex + 1
For j = minCol To maxCol
resultArray(1, j) = data(minRow, j)
Next j
End IfincludeTitle
がTrueの場合、タイトル行(1行目)を結果配列にコピーします。
タイトル行をコピー後、resultIndex
をインクリメントします。
- For i = minRow + IIf(includeTitle, 1, 0) To maxRow
If data(i, filterCol) Like filterKey Then
resultIndex = resultIndex + 1
ReDim tempArray(1 To resultIndex, minCol To maxCol)
For j = minCol To maxCol
If resultIndex > 1 Then
For k = 1 To resultIndex – 1
tempArray(k, j) = resultArray(k, j)
Next k
End If
tempArray(resultIndex, j) = data(i, j)
Next j
ReDim resultArray(1 To resultIndex, minCol To maxCol)
For k = 1 To resultIndex
For j = minCol To maxCol
resultArray(k, j) = tempArray(k, j)
Next j
Next k
End If
Next i- 条件に一致する行を確認
data(i, filterCol)
がfilterKey
と一致する場合に処理を実行します。
- 一時配列を使用して行を追加
- 一時配列
tempArray
を使って、新しい行を追加します。
既存の結果をすべてコピーし、新しい行を追加後、結果配列に戻します。
- 一時配列
- 条件に一致する行を確認
- If resultIndex = 0 Then
Debug.Print “条件に一致するデータがありません。”
Else
For i = LBound(resultArray, 1) To UBound(resultArray, 1)
For j = LBound(resultArray, 2) To UBound(resultArray, 2)
Debug.Print resultArray(i, j);
Next j
Debug.Print
Next i
End If
End Sub- フィルター結果が存在する場合、
Debug.Print
でイミディエイトウィンドウに出力します。
条件に一致するデータがない場合は「条件に一致するデータがありません」と表示します。
- フィルター結果が存在する場合、
VBAのFilter関数を使った使用例をご紹介
ここでは、VBAのFilter関数を使って、配列の情報を取得する使用例を紹介します。
以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
使用例1: 配列内の特定の文字列の頻度をカウントする
Filter関数を使って、配列内に特定の文字列がいくつ含まれているかをカウントする方法を解説します。
このコードでは、「リンゴ」という単語が配列内に何回出現するかを確認します。
コード例 | 配列内の特定の文字列の頻度をカウントする
Sub CountStringFrequency()
Dim fruits As Variant
Dim result As Variant
Dim count As Long
'// 配列を定義
fruits = Array("リンゴ", "ミカン", "リンゴ", "バナナ", "リンゴ", "ブドウ")
'// "リンゴ"を含む要素を抽出
result = Filter(fruits, "リンゴ")
'// 抽出結果の要素数をカウント
If Not IsEmpty(result) Then
count = UBound(result) - LBound(result) + 1
MsgBox "配列内の「リンゴ」の数は " & count & " 個です。", vbInformation
Else
MsgBox "配列内に「リンゴ」は含まれていません。", vbExclamation
End If
End Sub
処理結果


コードの動作概要
Array関数を使用して、複数の果物名を格納した配列fruits
を作成します。
この配列には、同じ要素「リンゴ」が複数含まれています。
Filter関数を使用して、配列内に「リンゴ」という文字列を含む要素を抽出します。
If Not IsEmpty
で抽出結果が空かどうかを確認します。
条件に一致する要素がない場合、適切なメッセージを表示します。
UBound
とLBound
を使って、抽出された配列の要素数を計算します。
この要素数が文字列の頻度になります。
計算した頻度をメッセージボックスで表示します。
このコードで使用している機能
- Dim (変数)
fruits
,result
,i
の各変数を宣言。
- Array (配列を定義)
- 配列を定義します。
- Filter関数 (配列を検索)
- 配列の要素をFilter関数で抽出し、頻度を計算。
- If Not IsEmpty
- 配列が空でないかを確認。
- For Next (ループ処理)
- 結果配列の各要素を出力。
- Ubound・Lbound (配列の要素を取得)
- 配列内の要素を取得します。
- MsgBox (メッセージボックス)
- 結果をメッセージボックスに出力。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub CountStringFrequency()
- サブルーチンの開始を示します。
このマクロは、配列内の特定の文字列の出現回数をカウントして表示します。
- サブルーチンの開始を示します。
- Dim fruits As Variant
- 配列「fruits」を格納するための変数「fruits」を宣言します。
- Variant型を使用することで、柔軟に配列を扱うことができます。
- Dim result As Variant
- フィルタリング結果を格納するための変数「result」を宣言します。
Filter関数の結果(指定した条件に一致する要素の配列)がここに格納されます。
- フィルタリング結果を格納するための変数「result」を宣言します。
- Dim count As Long
- 抽出した要素の個数をカウントするための変数「count」を宣言します。
Long型を使用することで、大きな値にも対応可能です。
- 抽出した要素の個数をカウントするための変数「count」を宣言します。
- fruits = Array(“リンゴ”, “ミカン”, “リンゴ”, “バナナ”, “リンゴ”, “ブドウ”)
- 配列「fruits」を定義して、果物名を格納します。
この配列には「リンゴ」が複数回含まれており、これを条件としてフィルタリングします。
- 配列「fruits」を定義して、果物名を格納します。
- result = Filter(fruits, “リンゴ”)
- Filter関数を使用して、配列「fruits」から「リンゴ」を含む要素を抽出します。
抽出結果は、新しい配列「result」に格納されます。 - 「Filter(fruits, “リンゴ”)」の動作
- 「fruits」配列内で「リンゴ」を含む要素をすべて検索します。
該当する要素がない場合は空の配列を返します。
- 「fruits」配列内で「リンゴ」を含む要素をすべて検索します。
- Filter関数を使用して、配列「fruits」から「リンゴ」を含む要素を抽出します。
- If Not IsEmpty(result) Then
- 「Not IsEmpty(result)」を使用して、抽出結果「result」が空でないことを確認します。
Filter関数が空の配列を返す場合、「result」は空として認識されます。
条件が「True」の場合、抽出された要素の個数を計算します。
- 「Not IsEmpty(result)」を使用して、抽出結果「result」が空でないことを確認します。
- count = UBound(result) – LBound(result) + 1
- 配列の要素数を計算します。
UBound(result)
:配列「result」の最大インデックスを取得します。LBound(result)
:配列「result」の最小インデックスを取得します。
- + 1を加えることで、配列の要素数を正確に算出します。
- 例えば、「result」配列が{“リンゴ”, “リンゴ”, “リンゴ”}の場合
UBound(result)
= 2LBound(result)
= 0- 要素数 =
2 - 0 + 1 = 3
- 配列の要素数を計算します。
- MsgBox “配列内の「リンゴ」の数は ” & count & ” 個です。”, vbInformation
- メッセージボックスに、抽出結果の要素数を表示します。
“配列内の「リンゴ」の数は ” & count & ” 個です。”- “リンゴ”という文字列が配列内にいくつ含まれているかを表示します。
例えば、「リンゴ」が3回出現している場合は「配列内の『リンゴ』の数は 3 個です。」と表示されます。 - 「vbInformation」は、情報アイコン付きのメッセージボックスを表示する指定です。
- “リンゴ”という文字列が配列内にいくつ含まれているかを表示します。
- メッセージボックスに、抽出結果の要素数を表示します。
- Else
- 配列「result」が空の場合に実行される処理です。
条件If Not IsEmpty(result)
がFalseの場合、Else
ブロックの処理が実行されます。
- 配列「result」が空の場合に実行される処理です。
- MsgBox “配列内に「リンゴ」は含まれていません。”, vbExclamation
- メッセージボックスに、「配列内に『リンゴ』は含まれていません。」と表示します。
vbExclamation
は、警告アイコン付きのメッセージボックスを表示する指定です。
- メッセージボックスに、「配列内に『リンゴ』は含まれていません。」と表示します。
- End If
- If文の終了を示します。
- End Sub
- マクロの終了を示します。
総括・ポイント
このコードは、特定の文字列が配列内に何回含まれているかを簡単に調べるための実践的な例です。
同様の手法を使えば、Excelでのデータ分析や検索タスクに応用することができます。
使用例2: 部分一致で複数の条件をフィルタリング
Filter関数とループを組み合わせて、配列内のデータを複数の条件で部分一致検索する方法を解説します。
この例では、「リンゴ」と「バナナ」を含む要素を抽出します。
コード例 | 部分一致で複数の条件をフィルタリング
Sub FilterMultipleConditions()
Dim fruits As Variant
Dim result As Variant
Dim i As Long
Dim keywords As Variant
Dim combinedResult As Collection
'// 配列を定義
fruits = Array("リンゴ", "ミカン", "バナナ", "パイナップル", "リンゴ", "バナナ", "ブドウ")
'// 条件となるキーワードを定義
keywords = Array("リン", "ナナ")
Set combinedResult = New Collection
'// 各キーワードでフィルタリング
For i = LBound(keywords) To UBound(keywords)
result = Filter(fruits, keywords(i))
If Not IsEmpty(result) Then
Dim j As Long
For j = LBound(result) To UBound(result)
On Error Resume Next '// 重複を防ぐ
combinedResult.Add result(j), CStr(result(j))
On Error GoTo 0
Next j
End If
Next i
'// 結果を表示
If combinedResult.count > 0 Then
For i = 1 To combinedResult.count
Debug.Print combinedResult(i)
Next i
Else
Debug.Print "条件に一致する要素がありませんでした。"
End If
End Sub
処理結果


コードの動作概要
Array関数を使って果物名のリストを配列fruits
に格納します。
keywords
配列を作成し、検索条件(リンゴ、バナナ)を格納します。
Filter関数で1つずつ条件に一致する要素を抽出し、一時的なコレクションcombinedResult
に追加します。
On Error Resume Next
を使用して、既に追加されたデータが再び追加されないようにします。
フィルタリング結果をイミディエイトウィンドウに表示します。
このコードで使用している機能
- Dim (変数)
fruits
,result
,i
の各変数を宣言。
- Array (配列を定義)
- 配列を定義します。
- Collectionオブジェクト
- 重複を防ぎながら検索結果をまとめて格納。
- Filter関数 (配列を検索)
- 1つの配列に対して複数の条件で部分一致検索を実行。
- If Not IsEmpty
- 配列が空でないかを確認。
- For Next (ループ処理)
- 結果配列の各要素を出力。
- Ubound・Lbound (配列の要素を取得)
- 配列内の要素を取得します。
- Debug.Print
- イミディエイトウィンドウに結果を出力。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub FilterMultipleConditions()
- サブルーチンの開始を示します。
このプロシージャでは、複数の条件を使って配列をフィルタリングし、結果を表示します。
- サブルーチンの開始を示します。
- Dim fruits As Variant
- 配列「fruits」を格納するための変数を宣言します。
配列には、フィルタリング対象のデータを格納します。
- 配列「fruits」を格納するための変数を宣言します。
- Dim result As Variant
- Filter関数によるフィルタリング結果を一時的に格納するための変数を宣言します。
- Dim i As Long
- キーワード配列のインデックスを制御するための変数「i」を宣言します。
- Dim keywords As Variant
- フィルタリングの条件となるキーワード(複数)を格納するための配列「keywords」を宣言します。
- Dim combinedResult As Collection
- フィルタリング結果を重複排除して格納するための「Collection」を宣言します。
「Collection」を使うことで、重複を簡単に排除できます。
- フィルタリング結果を重複排除して格納するための「Collection」を宣言します。
- fruits = Array(“リンゴ”, “ミカン”, “バナナ”, “パイナップル”, “リンゴ”, “バナナ”, “ブドウ”)
- 配列「fruits」に果物名を格納します。
このリストの中から条件に一致する要素を抽出します。
- 配列「fruits」に果物名を格納します。
- keywords = Array(“リン”, “ナナ”)
- フィルタリング条件となるキーワードを配列「keywords」に定義します。
- ここでは、「リン」と「ナナ」を条件としています。
- 「リン」 → “リンゴ” に一致
- 「ナナ」 → “バナナ” に一致
- Set combinedResult = New Collection
- 「combinedResult」コレクションを初期化します。
このオブジェクトにフィルタリングされた結果を格納し、重複を防ぐために使用します。
- 「combinedResult」コレクションを初期化します。
- For i = LBound(keywords) To UBound(keywords)
- キーワード配列「keywords」の各要素をループ処理で取得します。
「LBound」と「UBound」を使い、キーワード配列の最初から最後までループします。
- キーワード配列「keywords」の各要素をループ処理で取得します。
- result = Filter(fruits, keywords(i))
- Filter関数を使用して、「fruits」配列から現在のキーワード「keywords(i)」に一致する要素を抽出します。
フィルタリング結果は、「result」配列に格納されます。
- Filter関数を使用して、「fruits」配列から現在のキーワード「keywords(i)」に一致する要素を抽出します。
- If Not IsEmpty(result) Then
- Filter関数の結果が空でない場合(条件に一致する要素が存在する場合)の処理を実行します。
- Dim j As Long
For j = LBound(result) To UBound(result)- 抽出された「result」配列をループで1つずつ確認します。
- On Error Resume Next
- 同じ要素をコレクションに追加する際のエラーを無視します(重複を防ぐための処理)。
- combinedResult.Add result(j), CStr(result(j))
- フィルタリング結果の現在の要素
result(j)
を「combinedResult」に追加します。
キーとしてCStr(result(j))
(文字列型に変換した値)を指定することで、重複を防ぎます。
- フィルタリング結果の現在の要素
- On Error GoTo 0
- エラー処理を通常に戻します。
- Next j
- 「result」配列の全要素を処理し終わったら、次のキーワードへ進みます。
- End If
Next i- キーワード配列「keywords」の全要素を処理し終わったら、フィルタリングを終了します。
- For i = 1 To combinedResult.Count
- コレクション「combinedResult」内の要素を順に取得し、結果をイミディエイトウィンドウに出力します。
- Debug.Print combinedResult(i)
- コレクションの要素をイミディエイトウィンドウに出力します。
- Else
- フィルタリング結果が1つもない場合、「条件に一致する要素がありませんでした。」とメッセージを表示します。
- Debug.Print “条件に一致する要素がありませんでした。”
- 条件に一致する要素がない場合、メッセージをイミディエイトウィンドウに表示します。
- End Sub
- マクロの終了を示します。
総括・ポイント
このコードは、Filter関数とCollectionオブジェクトを組み合わせて、複数の条件に一致する要素を効率的に抽出する方法を示しています。
重複を排除するロジックも含まれており、実務でのデータ整理に役立ちます。
使用例おまけ: 条件に一致しない要素の行番号を取得
このコードでは、VBAを使って、配列内で特定の条件に一致しない要素の行番号を取得する方法を解説します。
今回は、配列fruits
から「バナナ」を除外した要素の元の行番号を取得して、イミディエイトウィンドウに表示します。
コード例 | 条件に一致しない要素の行番号を取得
Sub GetExcludedRowNumbers()
Dim fruits As Variant
Dim excludedRows() As Long
Dim i As Long, count As Long
'// 配列を定義
fruits = Array("リンゴ", "ミカン", "バナナ", "パイナップル", "ブドウ")
'// 行番号を取得
count = 0
For i = LBound(fruits) To UBound(fruits)
If fruits(i) <> "バナナ" Then '// "バナナ"以外の要素をチェック
count = count + 1
ReDim Preserve excludedRows(1 To count)
excludedRows(count) = i + 1 ' 行番号を格納(1始まり)
End If
Next i
'// 結果を表示
If count > 0 Then
For i = 1 To count
Debug.Print "行番号: " & excludedRows(i)
Next i
Else
Debug.Print "条件に一致する要素がありませんでした。"
End If
End Sub
処理結果


コードの動作概要
- 配列
fruits
に果物名を格納します。 - この配列を操作して、「バナナ」を除外した行番号を取得します。
- Forループを使用して、配列
fruits
の全要素を順番に確認します。 - 条件
fruits(i) <> "バナナ"
がTrue
(つまり「バナナ」以外)であれば、以下を実行します。- 行番号を
count
で管理し、動的配列excludedRows
に追加します。 - 配列
excludedRows
を動的に拡張するためにReDim Preserve
を使用します。 - 1始まりの行番号を記録します。
- 行番号を
- フィルタリングが完了した後、
excludedRows
配列をループして結果を出力します。 - 条件に一致する要素がない場合、「条件に一致する要素がありませんでした」と表示します。
このコードで使用している機能
- Dim (変数)
fruits
,result
,i
の各変数を宣言。
- Array (配列を定義)
- 配列を定義します。
- For Next (ループ処理)
- 結果配列の各要素を出力。
- Ubound・Lbound (配列の要素を取得)
- 配列内の要素を取得します。
- ReDim Preserve (動的配列)
- 動的配列を設定します。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub GetExcludedRowNumbers()
- サブルーチン「GetExcludedRowNumbers」を定義します。
このマクロは、特定の要素を除外した行番号を取得する処理を行います。
- サブルーチン「GetExcludedRowNumbers」を定義します。
- Dim fruits As Variant
- 配列を格納するための変数「fruits」を宣言します。
「Variant」型を使用しており、配列データを動的に格納可能です。
- 配列を格納するための変数「fruits」を宣言します。
- Dim excludedRows() As Long
- 条件に一致しない行番号を格納する動的配列「excludedRows」を宣言します。
Long型を指定しており、整数の行番号を格納できます。
- 条件に一致しない行番号を格納する動的配列「excludedRows」を宣言します。
- Dim i As Long, count As Long
- ループカウンタ用の変数「i」と、除外行番号の数をカウントする変数「count」を宣言します。
Long型を使用して、効率よく整数計算を行います。
- ループカウンタ用の変数「i」と、除外行番号の数をカウントする変数「count」を宣言します。
- fruits = Array(“リンゴ”, “ミカン”, “バナナ”, “パイナップル”, “ブドウ”)
- 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
条件「<>」は、「等しくない」を意味します。
- 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
- count = 0
- 変数「count」を初期化します。
「count」は、「excludedRows」配列の要素数を管理するために使用します。
- 変数「count」を初期化します。
- For i = LBound(fruits) To UBound(fruits)
- Forループを使用して、配列「fruits」の各要素を1つずつ確認します。
LBound(fruits)
- 配列fruitsの最小インデックス(0)を取得します。
UBound(fruits)
- 配列fruitsの最大インデックス(4)を取得します。
- If fruits(i) <> “バナナ” Then ‘ “バナナ”以外の要素をチェック
- 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
条件「<>」は、「等しくない」を意味します。
- 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
- count = count + 1
- 条件に一致する場合、「count」を1増加させます。
これにより、「excludedRows」配列に格納する行番号を管理します。
- 条件に一致する場合、「count」を1増加させます。
- ReDim Preserve excludedRows(1 To count)
- 動的配列「excludedRows」のサイズを拡張します。
「ReDim Preserve」を使用することで、既存の配列データを保持しながら、新しい要素を追加可能です。
配列のサイズを「1 To count」に設定して、行番号を格納できるスペースを確保します。
- 動的配列「excludedRows」のサイズを拡張します。
- excludedRows(count) = i + 1 ‘ 行番号を格納(1始まり)
- 「excludedRows」配列の「count」番目の要素に、現在の行番号(1始まり)を格納します。
「i + 1」を使用することで、VBA配列の「0」始まりのインデックスを「1」始まりの行番号に変換しています。
- 「excludedRows」配列の「count」番目の要素に、現在の行番号(1始まり)を格納します。
- End If
- If文の終了を示します。
- Next i
- Forループの次の要素に進みます。
配列「fruits」のすべての要素を確認するまで、このループが繰り返されます。
- Forループの次の要素に進みます。
- If count > 0 Then
- 条件に一致しない行番号が1つ以上存在する場合、以下の処理を実行します。
「count > 0」は、動的配列「excludedRows」が空でないことを確認する条件です。
- 条件に一致しない行番号が1つ以上存在する場合、以下の処理を実行します。
- For i = 1 To count
- 「excludedRows」配列のすべての要素(行番号)を順番に確認します。
配列の最小インデックスを「1」、最大インデックスを「count」に設定します。
- 「excludedRows」配列のすべての要素(行番号)を順番に確認します。
- Debug.Print “行番号: ” & excludedRows(i)
- 「Debug.Print」を使用して、「excludedRows」配列に格納された行番号をイミディエイトウィンドウに出力します。
“行番号: “という文字列に、現在の行番号「excludedRows(i)」を連結して表示します。
- 「Debug.Print」を使用して、「excludedRows」配列に格納された行番号をイミディエイトウィンドウに出力します。
- Next i
- 次の行番号に進みます。
「excludedRows」配列のすべての要素を出力するまで、このループが繰り返されます。
- 次の行番号に進みます。
- Else
- 「excludedRows」配列の全要素を順番に確認し、結果を出力します。
- Debug.Print “条件に一致する要素がありませんでした。”
- Debug.Printを使用して、「条件に一致する要素がありませんでした。」というメッセージをイミディエイトウィンドウに出力します。
- End If
- If文の終了を示します。
- End Sub
- マクロの終了を示します。
総括・ポイント
このコードは、Filter関数を使用して条件に一致しない要素の行番号を取得する実践例です。
特定のデータを除外して行番号を特定することで、データ分析や条件付き処理の効率化に役立ちます。
この記事のまとめ
この記事では、VBAのFilter関数を活用した配列操作の基本から応用までを詳しく解説しました。
Filter関数を使うことで、配列から特定の条件に一致する要素を簡単に抽出し、効率的なデータ操作が可能になります。
また、1次元配列だけでなく、工夫することで2次元配列や条件に一致しない要素の操作も行えるようになる方法も紹介しました。
ポイントのおさらい
- Filter関数の基本を学ぶ
- Filter関数を使用した基本的な配列操作の仕組みを解説しました。
Filter関数では、部分一致や完全一致など柔軟な条件でデータ抽出が可能です。
⇒ 「VBAの「Filter関数」の基礎|使い方をマスターしよう」をもう一度見る
- Filter関数を使用した基本的な配列操作の仕組みを解説しました。
- Filter関数の応用例を確認
- Filter関数を使った「配列内の特定の文字列の頻度カウント」や「複数条件でのフィルタリング」など、実務でも役立つ実用例を紹介しました。
⇒ 「VBAのFilter関数を使った使用例をご紹介」をもう一度見る
- Filter関数を使った「配列内の特定の文字列の頻度カウント」や「複数条件でのフィルタリング」など、実務でも役立つ実用例を紹介しました。
- Filter関数を使わない配列操作も学ぶ
- Filter関数が使えない場合でも、Forループや動的配列を活用して柔軟に配列を操作する方法を解説しました。
特に、条件に一致しない要素の行番号取得や、2次元配列のフィルタリングについても具体的なコードで説明しました。
⇒ 「VBAで2次元配列をフィルターする方法 | Filter関数は使用できません」をもう一度見る
- Filter関数が使えない場合でも、Forループや動的配列を活用して柔軟に配列を操作する方法を解説しました。
今回の学びを活用するために
今回解説したFilter関数や配列操作の手法は、VBAでのデータ整理や分析を効率化するための重要な基礎です。これを活用すれば、以下のような効果が期待できます。
- 作業時間を大幅に短縮できる
- コードの簡潔化と可読性の向上
- データ分析や処理タスクの精度を高める
実際の業務やプロジェクトで積極的に応用し、作業効率化を目指してください!
また、今回のコードや手法について詳しく復習したい場合は、以下のリンクから各セクションに戻ることができます。

