VBA Filter関数入門|1次元配列・2次元配列の活用術

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

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


・データを手動で絞り込むのが面倒で効率が悪い

条件に合う要素だけを簡単に抽出する方法を知りたい

・大量データを自動的に操作し、作業時間を短縮したい

こうしたお悩みを解決する方法が
「VBAのFilter関数を使った配列操作です!


この記事では、「VBAを使って1次元配列や2次元配列をフィルターする方法」を分かりやすく解説します。

Filter関数を使用すると、配列から特定の値を簡単に抽出でき、部分一致や完全一致など柔軟な条件でのフィルターが可能です。
また、1次元配列・2次元配列のデータ操作を自動化し、作業時間を大幅に短縮できます。
これにより、大量データの効率的な処理が実現し、手作業の負担が軽減されます。

初心者でも実践できるように、簡単なコード例を交えながら説明します。
この記事を読むことで、次のことができるようになります。


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\ スキルアップの第一歩!VBA講座はこちらから /

目次

この記事を読むことで「できるようになる」こと

スポンサーリンク

VBAの配列操作で「フィルター」を使うメリット

配列を操作する際、目的のデータを抽出するために「条件で絞り込む」作業が必要になることがよくあります。

例えば
  • 顧客リストから特定の地域だけを取り出す
  • セールスデータから特定の売上金額以上のものを抽出する

VBAでは、Filter関数やループ処理を使うことで、これらのフィルタリング作業を簡単かつ効率的に実現できます。

ただし、ループ処理を使う場合、データ量が多いと時間がかかることがあります。Filter関数を使えば、一行で条件を適用できるため、コードが簡潔になり処理速度も向上します。

フィルターで出来ること

VBAの「Filter関数」の基礎|使い方をマスターしよう

VBAのFilter関数は、配列から特定の条件に一致する要素を簡単に抽出するための強力なツールです。

このセクションでは、Filter関数の基本的な使い方を解説します。

初心者でも理解しやすいように、構文や実例を交えながら説明します。

Filter関数の基本構文

Filter関数の基本構文
スクロールできます
引数必須/任意説明
sourceArray必須フィルタリング対象の1次元配列
match必須抽出条件となる文字列
[include]任意Trueの場合、条件に一致する要素を抽出。
Falseの場合、一致しない要素を抽出(デフォルトはTrue)。
[compare]任意大文字小文字を区別するか、またはどのように比較するかを指定
(デフォルトはvbBinaryCompare)。

より詳しい情報は、Microsoft公式のFilter 関数を参照してください。

compare引数について解説

compare引数を使うことで、大文字小文字を区別するかどうか、または比較方法を柔軟に設定できます。

比較方法説明
vbBinaryCompare0大文字小文字を区別するバイナリ比較を実行(デフォルト設定)。
vbTextCompare1大文字小文字を区別せずに比較を実行。
vbUseCompareOption-1Option 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
1. 基本例:特定の文字列を部分一致で抽出の結果

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
2. 大文字小文字を区別する比較の結果

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
3. 大文字小文字を区別しない比較の結果
スポンサーリンク

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次元配列とは?という方はこちら

あわせて読みたい
VBAで2次元配列をマスターする:データの効率的な管理と操作方法 「VBAで複雑なデータを扱う際、2次元配列はどうやって使うんだろう…」そんな疑問を持っていませんか? ・データをExcelシートのように整理して管理したい・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

実行結果

使用例:特定の値を含む行を抽出の結果

コードの動作概要

STEP
フィルター条件の設定

フィルター対象の列番号(filterCol)とフィルター条件(filterKey)を設定します。

このコードでは、カテゴリ列(2列目)を対象に「果物」に一致する行を抽出する設定です。

タイトル行を結果に含めるか(includeTitle)も設定可能です。

STEP
入力配列の境界を取得

LBoundおよびUBound関数を使用して、入力配列の行数と列数を取得します。

これにより、動的に配列を操作できるようになります。

STEP
結果配列を初期化

結果を格納するための配列(resultArray)を初期化します。

必要に応じてタイトル行を結果配列にコピーします。

STEP
フィルタリング処理

Forループを使用して、条件に一致する行を1行ずつ確認します。

条件に一致した場合、一時配列(tempArray)を使用して行を動的に追加します。

一時配列の内容を結果配列にコピーし直します。

STEP
結果を出力

フィルター処理が完了したら、Debug.Printを使用して結果を出力します。

条件に一致するデータがない場合は、「条件に一致するデータがありません」と表示されます。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  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)。
    • 補助変数の宣言
      • ijk:ループ処理で行と列を操作するためのカウンタ。
      • resultIndex:結果配列の行番号を管理。
      • minRowmaxRowminColmaxCol:配列の境界を取得するための変数。
  2. 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. 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に設定すると、タイトル行を結果に含めます
    • 配列の境界を取得
      • LBoundUBoundで、配列の行・列の最小値・最大値を取得します。
    • 結果配列を初期化
      • 初期状態のresultArrayを1行分だけ確保。
      • フィルター結果が追加されるたびに動的に拡張します。
  4. If includeTitle Then
    resultIndex = resultIndex + 1
    For j = minCol To maxCol
    resultArray(1, j) = data(minRow, j)
    Next j
    End If
    • includeTitleがTrueの場合、タイトル行(1行目)を結果配列にコピーします。
      タイトル行をコピー後、resultIndexをインクリメントします。
  5. 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を使って、新しい行を追加します。
        既存の結果をすべてコピーし、新しい行を追加後、結果配列に戻します。
  6. 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講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べる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

処理結果

使用例1: 配列内の特定の文字列の頻度をカウントする

コードの動作概要

STEP
配列を定義

Array関数を使用して、複数の果物名を格納した配列fruitsを作成します。
この配列には、同じ要素「リンゴ」が複数含まれています。

STEP
条件に一致する要素を抽出

Filter関数を使用して、配列内に「リンゴ」という文字列を含む要素を抽出します。

STEP
抽出結果の確認

If Not IsEmptyで抽出結果が空かどうかを確認します。
条件に一致する要素がない場合、適切なメッセージを表示します。

STEP
頻度を計算

UBoundLBoundを使って、抽出された配列の要素数を計算します。
この要素数が文字列の頻度になります。

STEP
結果を出力

計算した頻度をメッセージボックスで表示します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub CountStringFrequency()
    • サブルーチンの開始を示します。
      このマクロは、配列内の特定の文字列の出現回数をカウントして表示します。
  2. Dim fruits As Variant
    • 配列「fruits」を格納するための変数「fruits」を宣言します。
    • Variant型を使用することで、柔軟に配列を扱うことができます。
  3. Dim result As Variant
    • フィルタリング結果を格納するための変数「result」を宣言します。
      Filter関数の結果(指定した条件に一致する要素の配列)がここに格納されます。
  4. Dim count As Long
    • 抽出した要素の個数をカウントするための変数「count」を宣言します。
      Long型を使用することで、大きな値にも対応可能です。
  5. fruits = Array(“リンゴ”, “ミカン”, “リンゴ”, “バナナ”, “リンゴ”, “ブドウ”)
    • 配列「fruits」を定義して、果物名を格納します。
      この配列には「リンゴ」が複数回含まれており、これを条件としてフィルタリングします。
  6. result = Filter(fruits, “リンゴ”)
    • Filter関数を使用して、配列「fruits」から「リンゴ」を含む要素を抽出します。
      抽出結果は、新しい配列「result」に格納されます。
    • 「Filter(fruits, “リンゴ”)」の動作
      • 「fruits」配列内で「リンゴ」を含む要素をすべて検索します。
        該当する要素がない場合は空の配列を返します。
  7. If Not IsEmpty(result) Then
    • 「Not IsEmpty(result)」を使用して、抽出結果「result」が空でないことを確認します。
      Filter関数が空の配列を返す場合、「result」は空として認識されます。
      条件が「True」の場合、抽出された要素の個数を計算します。
  8. count = UBound(result) – LBound(result) + 1
    • 配列の要素数を計算します。
      • UBound(result):配列「result」の最大インデックスを取得します。
      • LBound(result):配列「result」の最小インデックスを取得します。
    • + 1を加えることで、配列の要素数を正確に算出します。
    • 例えば、「result」配列が{“リンゴ”, “リンゴ”, “リンゴ”}の場合
      • UBound(result) = 2
      • LBound(result) = 0
      • 要素数 = 2 - 0 + 1 = 3
  9. MsgBox “配列内の「リンゴ」の数は ” & count & ” 個です。”, vbInformation
    • メッセージボックスに、抽出結果の要素数を表示します。
      “配列内の「リンゴ」の数は ” & count & ” 個です。”
      • “リンゴ”という文字列が配列内にいくつ含まれているかを表示します。
        例えば、「リンゴ」が3回出現している場合は「配列内の『リンゴ』の数は 3 個です。」と表示されます。
      • 「vbInformation」は、情報アイコン付きのメッセージボックスを表示する指定です。
  10. Else
    • 配列「result」が空の場合に実行される処理です。
      条件If Not IsEmpty(result)がFalseの場合、Elseブロックの処理が実行されます。
  11. MsgBox “配列内に「リンゴ」は含まれていません。”, vbExclamation
    • メッセージボックスに、「配列内に『リンゴ』は含まれていません。」と表示します。
      vbExclamationは、警告アイコン付きのメッセージボックスを表示する指定です。
  12. End If
    • If文の終了を示します。
  13. 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

処理結果

使用例2: 部分一致で複数の条件をフィルタリングの結果

コードの動作概要

STEP
配列を定義

Array関数を使って果物名のリストを配列fruitsに格納します。

STEP
キーワードを設定

keywords配列を作成し、検索条件(リンゴ、バナナ)を格納します。

STEP
フィルタリング

Filter関数で1つずつ条件に一致する要素を抽出し、一時的なコレクションcombinedResultに追加します。

STEP
重複を除外

On Error Resume Nextを使用して、既に追加されたデータが再び追加されないようにします。

STEP
結果を出力

フィルタリング結果をイミディエイトウィンドウに表示します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub FilterMultipleConditions()
    • サブルーチンの開始を示します。
      このプロシージャでは、複数の条件を使って配列をフィルタリングし、結果を表示します。
  2. Dim fruits As Variant
    • 配列「fruits」を格納するための変数を宣言します。
      配列には、フィルタリング対象のデータを格納します。
  3. Dim result As Variant
    • Filter関数によるフィルタリング結果を一時的に格納するための変数を宣言します。
  4. Dim i As Long
    • キーワード配列のインデックスを制御するための変数「i」を宣言します。
  5. Dim keywords As Variant
    • フィルタリングの条件となるキーワード(複数)を格納するための配列「keywords」を宣言します。
  6. Dim combinedResult As Collection
    • フィルタリング結果を重複排除して格納するための「Collection」を宣言します。
      「Collection」を使うことで、重複を簡単に排除できます。
  7. fruits = Array(“リンゴ”, “ミカン”, “バナナ”, “パイナップル”, “リンゴ”, “バナナ”, “ブドウ”)
    • 配列「fruits」に果物名を格納します。
      このリストの中から条件に一致する要素を抽出します。
  8. keywords = Array(“リン”, “ナナ”)
    • フィルタリング条件となるキーワードを配列「keywords」に定義します。
    • ここでは、「リン」と「ナナ」を条件としています。
      • 「リン」 → “リンゴ” に一致
      • 「ナナ」 → “バナナ” に一致
  9. Set combinedResult = New Collection
    • 「combinedResult」コレクションを初期化します。
      このオブジェクトにフィルタリングされた結果を格納し、重複を防ぐために使用します。
  10. For i = LBound(keywords) To UBound(keywords)
    • キーワード配列「keywords」の各要素をループ処理で取得します。
      「LBound」と「UBound」を使い、キーワード配列の最初から最後までループします。
  11. result = Filter(fruits, keywords(i))
    • Filter関数を使用して、「fruits」配列から現在のキーワード「keywords(i)」に一致する要素を抽出します。
      フィルタリング結果は、「result」配列に格納されます。
  12. If Not IsEmpty(result) Then
    • Filter関数の結果が空でない場合(条件に一致する要素が存在する場合)の処理を実行します。
  13. Dim j As Long
    For j = LBound(result) To UBound(result)
    • 抽出された「result」配列をループで1つずつ確認します。
  14. On Error Resume Next
    • 同じ要素をコレクションに追加する際のエラーを無視します(重複を防ぐための処理)。
  15. combinedResult.Add result(j), CStr(result(j))
    • フィルタリング結果の現在の要素result(j)を「combinedResult」に追加します。
      キーとしてCStr(result(j))(文字列型に変換した値)を指定することで、重複を防ぎます。
  16. On Error GoTo 0
    • エラー処理を通常に戻します。
  17. Next j
    • 「result」配列の全要素を処理し終わったら、次のキーワードへ進みます。
  18. End If
    Next i
    • キーワード配列「keywords」の全要素を処理し終わったら、フィルタリングを終了します。
  19. For i = 1 To combinedResult.Count
    • コレクション「combinedResult」内の要素を順に取得し、結果をイミディエイトウィンドウに出力します。
  20. Debug.Print combinedResult(i)
    • コレクションの要素をイミディエイトウィンドウに出力します。
  21. Else
    • フィルタリング結果が1つもない場合、「条件に一致する要素がありませんでした。」とメッセージを表示します。
  22. Debug.Print “条件に一致する要素がありませんでした。”
    • 条件に一致する要素がない場合、メッセージをイミディエイトウィンドウに表示します。
  23. 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

処理結果

使用例おまけ: 条件に一致しない要素の行番号を取得の結果

コードの動作概要

STEP
配列を作成
  • 配列fruitsに果物名を格納します。
  • この配列を操作して、「バナナ」を除外した行番号を取得します。
STEP
フィルタリング処理
  • Forループを使用して、配列fruitsの全要素を順番に確認します。
  • 条件fruits(i) <> "バナナ"True(つまり「バナナ」以外)であれば、以下を実行します。
    • 行番号をcountで管理し、動的配列excludedRowsに追加します。
    • 配列excludedRowsを動的に拡張するためにReDim Preserveを使用します。
    • 1始まりの行番号を記録します。
STEP
結果を表示
  • フィルタリングが完了した後、excludedRows配列をループして結果を出力します。
  • 条件に一致する要素がない場合、「条件に一致する要素がありませんでした」と表示します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub GetExcludedRowNumbers()
    • サブルーチン「GetExcludedRowNumbers」を定義します。
      このマクロは、特定の要素を除外した行番号を取得する処理を行います。
  2. Dim fruits As Variant
    • 配列を格納するための変数「fruits」を宣言します。
      「Variant」型を使用しており、配列データを動的に格納可能です。
  3. Dim excludedRows() As Long
    • 条件に一致しない行番号を格納する動的配列「excludedRows」を宣言します。
      Long型を指定しており、整数の行番号を格納できます。
  4. Dim i As Long, count As Long
    • ループカウンタ用の変数「i」と、除外行番号の数をカウントする変数「count」を宣言します。
      Long型を使用して、効率よく整数計算を行います。
  5. fruits = Array(“リンゴ”, “ミカン”, “バナナ”, “パイナップル”, “ブドウ”)
    • 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
      条件「<>」は、「等しくない」を意味します。
  6. count = 0
    • 変数「count」を初期化します。
      「count」は、「excludedRows」配列の要素数を管理するために使用します。
  7. For i = LBound(fruits) To UBound(fruits)
    • Forループを使用して、配列「fruits」の各要素を1つずつ確認します。
    • LBound(fruits)
      • 配列fruitsの最小インデックス(0)を取得します。
    • UBound(fruits)
      • 配列fruitsの最大インデックス(4)を取得します。
  8. If fruits(i) <> “バナナ” Then ‘ “バナナ”以外の要素をチェック
    • 配列「fruits」の現在の要素「fruits(i)」が「バナナ」でない場合に以下の処理を実行します。
      条件「<>」は、「等しくない」を意味します。
  9. count = count + 1
    • 条件に一致する場合、「count」を1増加させます。
      これにより、「excludedRows」配列に格納する行番号を管理します。
  10. ReDim Preserve excludedRows(1 To count)
    • 動的配列「excludedRows」のサイズを拡張します。
      「ReDim Preserve」を使用することで、既存の配列データを保持しながら、新しい要素を追加可能です。
      配列のサイズを「1 To count」に設定して、行番号を格納できるスペースを確保します。
  11. excludedRows(count) = i + 1 ‘ 行番号を格納(1始まり)
    • 「excludedRows」配列の「count」番目の要素に、現在の行番号(1始まり)を格納します。
      「i + 1」を使用することで、VBA配列の「0」始まりのインデックスを「1」始まりの行番号に変換しています。
  12. End If
    • If文の終了を示します。
  13. Next i
    • Forループの次の要素に進みます。
      配列「fruits」のすべての要素を確認するまで、このループが繰り返されます。
  14. If count > 0 Then
    • 条件に一致しない行番号が1つ以上存在する場合、以下の処理を実行します。
      「count > 0」は、動的配列「excludedRows」が空でないことを確認する条件です。
  15. For i = 1 To count
    • 「excludedRows」配列のすべての要素(行番号)を順番に確認します。
      配列の最小インデックスを「1」、最大インデックスを「count」に設定します。
  16. Debug.Print “行番号: ” & excludedRows(i)
    • 「Debug.Print」を使用して、「excludedRows」配列に格納された行番号をイミディエイトウィンドウに出力します。
      “行番号: “という文字列に、現在の行番号「excludedRows(i)」を連結して表示します。
  17. Next i
    • 次の行番号に進みます。
      「excludedRows」配列のすべての要素を出力するまで、このループが繰り返されます。
  18. Else
    • 「excludedRows」配列の全要素を順番に確認し、結果を出力します。
  19. Debug.Print “条件に一致する要素がありませんでした。”
    • Debug.Printを使用して、「条件に一致する要素がありませんでした。」というメッセージをイミディエイトウィンドウに出力します。
  20. End If
    • If文の終了を示します。
  21. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、Filter関数を使用して条件に一致しない要素の行番号を取得する実践例です。

特定のデータを除外して行番号を特定することで、データ分析や条件付き処理の効率化に役立ちます。

スポンサーリンク

この記事のまとめ

この記事では、VBAのFilter関数を活用した配列操作の基本から応用までを詳しく解説しました。

Filter関数を使うことで、配列から特定の条件に一致する要素を簡単に抽出し、効率的なデータ操作が可能になります。

また、1次元配列だけでなく、工夫することで2次元配列や条件に一致しない要素の操作も行えるようになる方法も紹介しました。

ポイントのおさらい

今回の学びを活用するために

今回解説したFilter関数や配列操作の手法は、VBAでのデータ整理や分析を効率化するための重要な基礎です。これを活用すれば、以下のような効果が期待できます。

  • 作業時間を大幅に短縮できる
  • コードの簡潔化と可読性の向上
  • データ分析や処理タスクの精度を高める

実際の業務やプロジェクトで積極的に応用し、作業効率化を目指してください!

また、今回のコードや手法について詳しく復習したい場合は、以下のリンクから各セクションに戻ることができます。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次