【VBA】配列から特定の文字列を検索して別配列へ抽出する方法
配列 tbl1 の5列目のデータが指定された文字列と一致する行を抽出し、それを別の配列 tbl2 に格納するためのコードを以下に示します。この例では、tbl1 と tbl2 は配列として扱われています。
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 |
処理の流れ
このマクロは以下の手順で処理を行います。
- 元データ配列
tbl1の行数・列数を取得 - 抽出結果格納用の配列
tbl2を準備 tbl1の全行をループ- 5列目の値が検索文字列と一致するか判定
- 一致した行を
tbl2にコピー - 抽出結果をシートへ出力
抽出条件を変更する方法
現在は以下の部分で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ファイルを読み込んで条件抽出


