【VBA】配列から特定の文字列を検索して別配列へ抽出する方法

配列 tbl1 の5列目のデータが指定された文字列と一致する行を抽出し、それを別の配列 tbl2 に格納するためのコードを以下に示します。この例では、tbl1tbl2 は配列として扱われています。

Sub ExtractRows()
    Dim tbl1 As Variant
    Dim tbl2 As Variant
    Dim searchValue As String
    Dim i As Long, j As Long, k as long
    Dim rowCount As Long, colCount As Long

    ' tbl1にデータを設定する(仮のデータ)
    ' 例: tbl1 = Range("A1:E10").Value
    ' 適切なデータソースに置き換えてください。

    ' 検索する文字列を設定する(例: "指定文字")
    searchValue = "指定文字"

    ' tbl1の行数と列数を取得
    rowCount = UBound(tbl1, 1)
    colCount = UBound(tbl1, 2)

    ' tbl2の初期化(最大でtbl1と同じサイズ)
    ReDim tbl2(1 To rowCount, 1 To colCount)

    ' 検索と抽出の処理
    j = 1 ' tbl2の行インデックス
    For i = 1 To rowCount
        ' 5列目(列番号4)のデータが指定文字列と一致するか確認
        If tbl1(i, 5) = searchValue Then
            ' 一致する行をtbl2に追加
            For k = 1 To colCount
                tbl2(j, k) = tbl1(i, k)
            Next k
            j = j + 1
        End If
    Next i

    ' tbl2に格納されたデータを出力する(仮の出力方法)
    ' 例: Range("G1").Resize(j - 1, colCount).Value = tbl2

End Sub

マクロの概要

このマクロは、二次元配列 tbl1 から、5列目の値が指定した検索文字列と一致する行だけを抽出し、新しい配列 tbl2 に格納するサンプルです。

Excelシート上でオートフィルターを使用する代わりに、配列上で検索を行うため、大量データでも高速に処理できます。

例えば以下のようなデータがあるとします。

No氏名部署都道府県区分
1田中営業東京A
2鈴木開発大阪B
3佐藤営業愛知A
4高橋総務東京C

検索文字列を「A」とした場合、抽出結果は次のようになります。

No氏名部署都道府県区分
1田中営業東京A
3佐藤営業愛知A

処理の流れ

このマクロは以下の手順で処理を行います。

  1. 元データ配列 tbl1 の行数・列数を取得
  2. 抽出結果格納用の配列 tbl2 を準備
  3. tbl1 の全行をループ
  4. 5列目の値が検索文字列と一致するか判定
  5. 一致した行を tbl2 にコピー
  6. 抽出結果をシートへ出力

抽出条件を変更する方法

現在は以下の部分で5列目を検索対象としています。

If tbl1(i, 5) = searchValue Then

例えば3列目を検索対象にする場合は次のように変更します。

If tbl1(i, 3) = searchValue Then





部分一致で検索する場合

現在のサンプルは完全一致検索です。

例えば「東京」を含むデータを抽出したい場合は、InStr 関数を利用します。

If InStr(tbl1(i, 5), searchValue) > 0 Then

検索文字列を

searchValue = "東京"

とすれば、

  • 東京都
  • 東京支店
  • 東京営業所

なども抽出対象になります。


高速化のポイント

シートを1行ずつ検索するよりも、一度配列へ読み込んでから処理する方が圧倒的に高速です。

tbl1 = Range("A1").CurrentRegion.Value

のようにシートのデータを配列へ取り込み、

Range("G1").Resize(j - 1, colCount).Value = tbl2

で一括出力することで、数万行規模のデータでも快適に処理できます。


応用例

このテクニックは次のような用途で活用できます。

  • 特定の担当者のデータだけ抽出
  • 指定した部署のデータだけ抽出
  • 特定商品の売上データだけ抽出
  • CSVファイルを読み込んで条件抽出

Follow me!