Filter関数は検索結果のデータを全て配列で取得できるので、次や前へと移動し検索する必要がありません。
ここではVBAで配列を確保し、そこからFilter関数を使い検索するサンプル シートを作成します。
構文 : Filter(SourceArray, Match, Include, Compare)
引数 |
内容 |
SourceArray |
検索する1次元の配列を指定します。 文字列の配列にします。 |
Match |
検索する文字列です。 |
Include |
(省略可)
True : 検索する文字列を含む(既定値)
False : 検索する文字列を含まない |
Compare |
(省略可)省略すると大文字と小文字を区別します。 |
配列からFilter関数で検索するVBA
シートに2つのコマンドボタンとテキストボックス コントロールを配置しました。
[配列にデータをセット]ボタンをクリックすると、配列を確保しデータをセットします。
[配列からデータ検索]ボタンをクリックすると、Filterで検索し見つかったデータをテキストボックスに表示します。
コマンドボタンのクリックイベントで実行するVBAです。
VBAについて
・Private vAy As Variant でシート全体で使用する配列を宣言しています。
■ CommandButton1_Click
・Redimで要素が10から1300の配列を確保しています。
・Forループで文字列データを配列にセットしています。
■ CommandButton2_Click
・IsArrayで配列が確保されているかチェックしています。 もしCommandButton1が実行されていなければ、ここでエラー回避できます。
・Filterで「EL55」を検索し、見つかった結果をvByの配列に入れます。
・LBound(vBy)とUBound(vBy)で配列の要素の最小から最大を取得し、Forループでテキストボックスに表示します。
Option Explicit
Private vAy As Variant
Private Sub CommandButton1_Click()
Dim i As Long
ReDim vAy(10 To 1300)
For i = 10 To 1300
vAy(i) = "EXCEL" & i & "VBA"
Next
End Sub
Private Sub CommandButton2_Click()
Dim vBy As Variant
Dim i As Long
If IsArray(vAy) = False Then
MsgBox "配列にデータをセットを実行してください"
Exit Sub
End If
テキスト1 = Null
vBy = Filter(vAy, "EL55")
For i = LBound(vBy) To UBound(vBy)
テキスト1 = テキスト1 & vBy(i) & vbCrLf
Next
End Sub
実行結果です。
「EL55」が含まれるデータが検索され表示されています。
このようにFilterを使うと、検索結果をまとめて取得できるので、色々と使い道がありそうです。
さらに「含まない」の検索はアプリでも見ないので、使ってみたいと思います。