Excel VBA 同一検索項目内での複数キー検索


同一検索キー項目で複数の検索キーで検索します。

例えば、書名で検索する場合「日本 世界」として検索すると、2つのキーが含まれる書名が検索されます。

検索キー数は、同一項目内で書名で3つ、著者で2つ、出版社では1つまでとします。


(1) 検索キーワードの区切り文字であるスペースを全角から半角スペースに統一する。

ここではReplace関数を使用します。

【書式】 Replace関数は文字列内の特定の単語や語句を、指定された単語や語句に置換します。

Replace(対象文字列,置換前文字列,置換文字列)

例 str = Replace(検索ワード, " ", " ")


(2) 半角スペースで区切られた複数の検索キーを3つの検索キー変数に分ける。

Split関数で配列に振り分けます。そして、わかりやすい名前がついた3つの変数に代入します。

「配列」とは、同じ型の変数を同じような目的で利用する場合に便利です。

配列は変数を1つ1つ定義するのではなく、まとめて定義することができます。

詳しくは下のURLを参照してください。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_array.html

【書式】 Split関数は、ある区切り文字で区切られた文字列をその区切り文字で区切り、区切られた各文字列を一次元配列として返します。

Split(元の文字列 , 区切り文字)

例 ArrayStr = Split(str, " ")

配列を定義するには、Dim ArrayStr As Stringと書きます。ただし、今回は、要素数を固定することはできず、動的配列にします。Redimより、動的に配列のメモリを割り当てることができます。

データを残して、再割り当てを行う場合は、ReDim Preserveを使用します。

ReDim Preserve ArrayStr(2)とすると3つの器が作られますので以下の代入文でも問題なく実行されます。

しかし、この文がないと例えば分割後1つ又は2つしかデータがないときにはArrayStr(2)は存在しないのでエラーになります。


(3) 3つにわかれた検索キーを使って検索するには実用編(前半)の「あいまいな検索条件を設定( Like 演算子を使用 )」を使わずもっと簡単な検索であるInStr関数を今回は使います。

【書式】 Instr関数は文字列内で特定の文字列を検索し、最初に検出された文字の位置を返します。

InStr(検索開始位置,"検索対象文字列","検索文字列",比較モード)

【引数の説明】

検索開始位置は省略可能です。検索を開始する位置を指定します。

検索対象文字列 には、検索の対象となる文字列を指定します。

検索文字列 には、検索対象文字列の中から検索する文字列を指定します。

比較モード は省略可能です。文字列を比較するモードを指定します。

例 InStr(Ws図書.Cells(ii, "B"), 検索キーワード1)


見つかったら1以上の値を返すが見つからなかった場合は0を返す。また、検索文字列(検索キー)になにもデータが入っていない場合でも1の値を返す。これでif文の条件がand演算子のみでまとめることができます。検索キーが3つすべてはいってなくても判定できるのでInStr関数を使用します。

もちろん、検索書名欄に何も入っていないときは検索する必要はありません。

なお、サンプルデータbooks-search.xlsm「図書検索.xlsm」の標準モジュール「T05図書検索_キーワード複数」に参考コードを掲載しておきます。

【ワンポイント】

マクロの実行をF5 キーで行う場合、メイン処理のSubプロシジャー内、または先頭部分にカーソルがある必要があります。