• ベストアンサー

複数キーワードを含むセルを検索するには、どうすればいいのでしょうか?

住所録にキーワードを入力することで、 対応する番号を検索してくれるような計算シートを作りたいのですが、 どうすればいいのか分からず困ってます。 例えば、下記のような住所録から、 "JAP" "鈴木" "一郎"というキーワードを入力すると 「xxx01」を出力してくれるようなものを作りたいのです。 ______________________________________ A |       B       |   C ______________________________________ 1|JAPAN 鈴木一郎   | xxx01 2|JAP 鈴木二郎    | xxx02 3|JAP 鈴木三郎    | xxx03 4|JAPAN 佐藤一郎  | xxx04 5|AMERICA 鈴木一郎 | xxx05 6|AME 佐藤一郎    | xxx06 ______________________________________ 上記のとおり、"JAP"だったり"JAPAN"だったり、表記ゆれがあるので VLOOKUPのような関数は使えそうに無いです。 関数でもマクロでも構わないのでいい方法があればご教授願います。 宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.4

NO3です。 *(アスタリスク)が文字列から飛び出していましたので、訂正致します。 =VLOOKUP("*JAP*鈴木*一郎*",$B$1:$C$6,2,FALSE)

tricky18
質問者

お礼

この方法を試したらとてもうまくいきました。 本当にありがとうございます。 大変助かりました。

その他の回答 (3)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

次の方法をお試し下さい。 =VLOOKUP(*"JAP*鈴木*一郎*",$B$1:$C$6,2,FALSE) 又は、セルにキーワードを入力されている場合、=VLOOKUP("*"&セル1&"*"&セル2&"*"&セル3&"*",$B$1:$C$6,2,0)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

ワークシート関数を自作するのは、いかがですか? 下記のようなコードを VBE の標準モジュールに貼り付けます。 それから、D1 セルに次の数式を入力します。 =KWD(B1,”JAP 鈴木 一郎”,” “) 第一引数は、調べる対象となるセルまたは文字列 第二引数は、キーワード文字列となるセルまたは文字列 第三引数は、第二引数のキーワードをどの文字で要素に分解するか をそれぞれ指定します。全ての要素が含まれれば、関数は True を 返します。例えば、リストが2行目から始まるとしたら、検索キー ワードの入力セルをB1として、 =KWD(B2,$B$1,” “) のように指定します。 あとは、オートフィルタで抽出できますよね。 # この回答は「任意の文字列に複数のキーワードが全て含まれるか?」を # 調べる一手法を紹介するものです。 #1 ご回答にあるとおり、この手の処理は、例えば末尾の不要スペース・ 表記のゆれ等が障害となリ得ます。したがって、 ・ データ側を正規化する ・ 検索プログラム側で対処する 下記の例だと InStr で vbTextCompare とし、大文字・小文字を区別 しないようにしてます。このようなことです。 のいずれかの対策が必要になりますので、この辺りも考えてみてください。 ' // 標準モジュール ' // [対象]に[キーワード]を[区切り文字]で分解した全ての要素 ' // が含まれるとき True を返す Public Function KWD( _     ByVal 対象 As Variant, _     ByVal キーワード As String, _     ByVal 区切り文字 As String _ ) As Boolean      Dim vKeys As Variant, vKey  As Variant   Dim bFlag As Boolean      If Len(キーワード) = 0 Then Exit Function   vKeys = Split(キーワード, 区切り文字)   bFlag = True   For Each vKey In vKeys     If InStr(1, 対象, vKey, vbTextCompare) <= 0 Then       bFlag = False       Exit For     End If   Next   KWD = bFlag End Function

tricky18
質問者

お礼

関数の作成方法まで教えていただき、 ありがとうございます。 早速試してみます。ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

問題が簡単化されていて、深みの難しさが見えない。質問者にも整理されていないのではと思うが。 (1)関数は、2つ(1つ見つかってそれ以下の行)目以後の該当を見つけにくい(式がやたら複雑) (2)例題では 国部 苗字部 名前部 のような一見納得する例になっていますが、実際例はそうでなく、もっと多かったり、予想外の該当箇所があるかもしれないと思う。 ーー そういう理由から (1)VBAを使わざるを得ないのでは。 Findメソッドやワイルドカードなども使えるので、その検索語を、「含む」かどうかは、割り出せると思う。 ただ例での3点からの語で見つかった時に限り、見つかったと断定してxxx01を返して良いのか。 表記のゆれは、上記の表の中に取り込まれているのか、など不安な面あり。 FindメソッドやInStr関数の使い方を学べば、後はVBAの一般知識でこなせると思う。 検索して、何点が見つかったか、見つかったものをストックし、最終に最有力を決めるなどが必要なようで、面倒ですね。 この辺を文章で明確に定式化して表現するのは、質問者の役割です。 業者に頼むときはSEなりがするでしょうが。

tricky18
質問者

お礼

住所録そのものが不完全なものだったので、 表記ゆれなどは自分が入力するキーワードで カバーできるようにしたかったんですが。 VBAでいくつかの関数を組み合わせて、検索をかけるしか手が無いようですね。 ありがとうございました。

関連するQ&A