プロが教えるわが家の防犯対策術!

住所録にキーワードを入力することで、
対応する番号を検索してくれるような計算シートを作りたいのですが、
どうすればいいのか分からず困ってます。

例えば、下記のような住所録から、
"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のような関数は使えそうに無いです。

関数でもマクロでも構わないのでいい方法があればご教授願います。
宜しくお願いいたします。

A 回答 (4件)

NO3です。


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

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

お礼日時:2007/08/15 13:04

次の方法をお試し下さい。


=VLOOKUP(*"JAP*鈴木*一郎*",$B$1:$C$6,2,FALSE)
又は、セルにキーワードを入力されている場合、=VLOOKUP("*"&セル1&"*"&セル2&"*"&セル3&"*",$B$1:$C$6,2,0)
    • good
    • 0

ワークシート関数を自作するのは、いかがですか?



下記のようなコードを 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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/15 08:22

問題が簡単化されていて、深みの難しさが見えない。

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

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

お礼日時:2007/08/15 08:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!