• ベストアンサー

where条件式であいまい検索がしたいです。

宜しくお願いします。 仕様環境:WinVISTA access2007 検索のやり方で戸惑っているのですが、 マクロを使って中にWhere条件式を書いています。 ちなみにこれです。↓ ・マクロ:フィルタの実行  [Forms]![メインフォーム]![番号検索]=[顧客番号] Or [Forms]![メインフォーム]![名前検索]=[名前] ・マクロ:再クエリ つまりテキストボックスに探したい顧客番号(「番号検索」というボックス)や、 名前(「名前検索」というボックス)を入れてコマンドボタンで検索をすれば、 「OR」を使っているので、どちらかに該当すれば検索できます(これはOKでした)。 またクエリとVBAは使っていません(VBAに関しては疎いので・汗) ここで質問なんですが、「名前」を検索する際に「完全一致」でないと検索できません。 これをlike~から始まるワイルドカードを使って「あいまい検索」にしたいのですが、 この条件式の中でどこを修正すればよいのでしょうか? いろんなところに入れて試したのですができません。 ちなみに[名前]の前後ともにあいまい(*)にしたいと思っています。 どうかお知恵をお貸しください、宜しくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

横レス失礼致します。 > 「番号検索だけで検索をかけると検索ができない」(名前検索フィールドは空白で) とのことですが、ひょっとしてレコード全件が表示されている、という状況ではないでしょうか。 だとすると、それは正常な動作かと思います。 というのは、名前検索フィールドが空白だと、Orの後の条件文は   [名前] Like "**" という式になりますので、「名前が空白でないもの」を抽出していることになるからです。 (つまり、Or条件の一方が常に成り立つので、番号検索の値に関係なく全件を表示、と) 30246kikuさんの引用項のNo.4での私の引用項  http://oshiete1.goo.ne.jp/qa5108301.html のような、テキストボックスの入力状況による場合分けは、マクロでも可能です。 検索条件を指定するテキストボックスが空白のこともあり得る場合、結果的にこの方が 上記のような誤解をしにくくなりますし、通常、Orで複数の条件をつなげるよりも動作も 速くなりますので、よろしければ試してみて下さい。 ※マクロで「条件」列を表示させるには、マクロのデザインビューで『デザイン』リボンの   『表示/非表示』内の『条件』をオン(オレンジ表示)にします。 【マクロ1行目】 番号検索・名前検索とも空白の場合  条件: Len([Forms]![メインフォーム]![番号検索] & "")=0 And Len([Forms]![メインフォーム]![名前検索] & "")=0  アクション: コマンドの実行  コマンド: フィルタ/並べ替えの解除 【マクロ2行目】 名前検索のみ入力ありの場合  条件: Len([Forms]![メインフォーム]![番号検索] & "")=0 And Len([Forms]![メインフォーム]![名前検索] & "")>0  アクション: フィルタの実行  Where条件式: [名前]=[Forms]![メインフォーム]![名前検索] 【マクロ3行目】 番号検索のみ入力ありの場合  条件: Len([Forms]![メインフォーム]![番号検索] & "")>0 And Len([Forms]![メインフォーム]![名前検索] & "")=0  アクション: フィルタの実行  Where条件式: [顧客番号]=[Forms]![メインフォーム]![番号検索] 【マクロ4行目】 番号検索・名前検索とも入力ありの場合  条件: Len([Forms]![メインフォーム]![番号検索] & "")=0 And Len([Forms]![メインフォーム]![名前検索] & "")=0  アクション: フィルタの実行  Where条件式: [顧客番号]=[Forms]![メインフォーム]![番号検索] Or [名前]=[Forms]![メインフォーム]![名前検索]  ※顧客番号と名前の双方を満たすものを抽出する(→件数を絞り込む)場合は、   このWhere条件式の「Or」を「And」に書き換えます。

23tomo-u
質問者

補足

回答ありがとうございます。 おかげさまで丸写しで出来ました(苦笑) がんばって理解している最中です。 ついでに、名前の欄はあいまい検索にして、 またフィルタ実行時から、解除するためのリセットボタン (コマンドボタン)も設置し良好です。 LEN関数ですね、調べました。 「指定した文字列の長さを調べる」とのことで。。 つまり条件に顧客番号が空白だった場合とそうでない時をいれた訳ですね。 「=0」と「>0」で。勉強になりました。 申し訳ないですが、もう少しお伺いさせてください。 まず、この式の中で2つ聞きたいのですが・・、 ・マクロ1行目はどういう効果があるのですか? ・また条件の中に「& ""」という文章が入っていますが、これは何を表わしているのですか? 例えると、 Len([Forms]![メインフォーム]![番号検索] & "")=0 ですが、LEN関数で文字を指定してそれが0と一致する場合と読みとれますが、 &""の意味がどうしてもわかりません(純粋にわからないのです) もう一つ、恐縮なのですが僕の画像で、 番号検索に「001」と入力、 名前検索に「稲本 吾郎」と入力します。 これを同時に出す方法はあるのでしょうか? 画像が貼れないので、イメージだけでもこんな感じで。 (検索結果) 001 木山 拓哉 東京都 005 稲本 吾郎 山梨県 もし良ければご教示ください。 あ、あと最後に、30246kikuさんとDexMachinaさんで どっちに”良回答”をつければいいかわからないです(笑) (どっちとも参考&勉強になったので) 宜しくお願いします。

その他の回答 (5)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.6

No.3、DexMachinaです。 名前はあいまい検索にしていない、4行目はCopy&Pasteした後で「=0」を「>0」に修正する のを忘れてる、追加するつもりだったLen関数と「& ""」の説明はすっぽかす・・・ すみません、寝惚けてたか酔っ払ってたのか、というぐらい、ひどい回答でした(汗) (2番目(「=0 → >0」)を正しく記述していれば、「001 又は 稲本 吾郎」はきちんとできていたわけで・・・) 既に30246kikuさんが説明されていますが、若干の補足も交えてということで・・・ > ・マクロ1行目はどういう効果があるのですか? No.4で30246kikuさんからも「アクション:全レコードの表示 でも同じですか?」と 訊かれていますが、その通りで、[番号検索]や[名前検索]で一旦絞り込んだ後の 解除(全件表示)を意図したものです。 (「全レコードの表示」にしなかったのは、その存在を失念していたためです(汗)  動作に違いはなかったと記憶しています) > ・また条件の中に「& ""」という文章が入っていますが、これは何を表わしているのですか? [名前検索]の値がNullだった場合に、空文字(長さ0の文字列)に変換しています。 これは、Len関数の引数がNullだった場合、戻り値が0ではなくNullになってしまう (=「Len(~)=0」も「Len(~)>0」も不成立扱いになる)ことへの対策です。 http://oshiete1.goo.ne.jp/qa4850675.html​ 【追加情報1】   [名前] Like "*" & [Forms]![メインフォーム]![名前検索] & "*" の代わりに   [名前] Like [Forms]![メインフォーム]![名前検索] というように「"*"」を削除した上で「Like」を使用すると、「名前検索」欄にそれぞれ   「森」と入力  → 「森」での完全一致検索に、   「森*」と入力 → 「森田」「森山」等、「森」での先頭一致検索に、   「*森」と入力 → 「杉森」「三森」等、「森」での後方一致検索に、   「*森*」と入力→ 「森」「森田」「杉森」等、「森」でのあいまい検索に、 というような使い方もできますので、併せて参考まで。 (もっとも、これはユーザーが「*」の使い方を覚えるか、フォーム上に説明文を出して  おいてそれを見てもらう、といったことが必要になってしまいますが) 【追加情報2】 > VBAにも挑戦してみたいと思っています。 自分で組むなどして動作を理解したマクロがある場合、Accessの「マクロをVisual Basicに変換」を使用してみるのも、取っ掛かりとしてはいいかもしれません。 (VBAとして効率のいいコードにするには、そこから手を加える必要はありますが) Accessの画像左端で対象マクロを選択すると、『データベース ツール』リボンの 『マクロ』内の『マクロをVisual Basic に変換』ボタン(→添付画像の赤丸のボタン)が 有効になりますので、その状態でクリックすればVBAに変換されますので、試してみる のもいいかもしれません。 > どっちに”良回答”をつければいいかわからないです(笑) 個人的には気にしていますが、そこはどうぞご自由に(笑) 「気にしている」というのは、「わかりやすく簡潔な回答ができたか」ということへの ひとつの目安にしているから、ですので。 ・・・まあ、No.3のようなポカをやっているようではダメなんですけれどね・・・(汗)

23tomo-u
質問者

お礼

回答ありがとうございます。 「*森*」←これ僕も気になっていました。 何気にaccess2002スペシャリストを持っていて、 今度2007スペシャリストを受験する予定なのですが、 試験勉強するまでは、あいまい検索は「like "*" & ~」が 一般的なのかな、と思っていたのですが、 試験にはまさしく「*森*」が出てきます、「森*」とかも。 こんな簡単にあいまい検索ができるんだー、なんて思っていました。 マクロからの変換、そしてVBエディターからの作成は 最近覚えました。といってもmsgbox程度ですが(笑)。 徐々にって感じですね。 というか、すごい知恵を使いますね。 頭ひねりっぱなしです(笑)。 本来はもっとVBAとSQL文とかも覚えたいのですが、 なにぶん、時間がかかりそうなので、ゆっくり少しづつ覚えていければと 思っています。 で、良回答なんですが・・ まず、有り難いことにどちらも丁寧に回答して頂いたと思います。 「決定打とわかり易さ」ははDexMachinaさんですが、 「きっかけ」を作ってくれたのは30246kikuさんでした。 いろいろ悩むところですが、 後世(後から同じ相談で来た人のために)にこの質問を残す 意味でもDexMachinaさんにさせて頂きます。 といっても、30246kikuさんの答えが悪いというわけでもなく、 俊敏に回答をくださったので有り難いと思っています。 ということでまた次回もお時間がありましたら、 お付き合いをお願いします。 (ちなみにもうアップしましたが・・)

23tomo-u
質問者

補足

お礼を書いてからですが、一応気付いたことがあったので書きます。 Null値と空文字(長さが0の文字列)は違うんですね! 同じに考えていたー、というか気にしてなかったー(汗)。 眼から鱗です。(涙) 以上

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#4です ポイント集めしているわけではないので、お好きなように 補足なり、お礼のところに、役に立ったのかくらい書いてもらえれば、 できれば、解決した内容を書いていただければと思っています。 私なりの解釈) > ・マクロ1行目はどういう効果があるのですか? ↓ > 解除するためのリセットボタン と同じことを、両方未入力で設定 > ・また条件の中に「& ""」という文章が入っていますが、これは何を表わしているのですか? > 例えると、 > Len([Forms]![メインフォーム]![番号検索] & "")=0 これを別の書き方すると Len(Nz([Forms]![メインフォーム]![番号検索],""))=0 で、[Forms]![メインフォーム]![番号検索] が未入力(Null値)の場合を判別する時の手法の一つ >(検索結果) > 001 木山 拓哉 東京都 > 005 稲本 吾郎 山梨県 は、 > おかげさまで丸写しで出来ました(苦笑) ということなので、マクロ4行目の条件で =0 の2か所を >0 に書き換えます。 実現するには1つの方法・書き方しかないということはない、と思っているので 書き方例) 説明上記述が長くなるので ※1 ~ ※4 を以下の記述と省略します。 ※1:Len(Nz([Forms]![メインフォーム]![番号検索],"")) ※2:[顧客番号]=[Forms]![メインフォーム]![番号検索] ※3:Len(Nz([Forms]![メインフォーム]![名前検索],"")) ※4:[名前] Like "*" & [Forms]![メインフォーム]![名前検索] & "*" 例1) 条件: ※1 =0 AND ※3 =0  アクション:コマンドの実行 コマンド:フィルタ/並べ替えの解除 条件: ※1 =0 AND ※3 >0  アクション:フィルタの実行 式: ※4 条件: ※1 >0 AND ※3 =0  アクション:フィルタの実行 式: ※2 条件: ※1 >0 AND ※3 >0  アクション:フィルタの実行 式: ※2 OR ※4 アクション:再クエリ 例2) 条件: ※1 >0 AND ※3 >0  アクション:フィルタの実行 式: ※2 OR ※4 条件: ...  アクション:再クエリ 条件: ...  アクション:マクロの中止 条件: ※1 >0   アクション:フィルタの実行 式: ※2 条件: ...  アクション:再クエリ 条件: ...  アクション:マクロの中止 条件: ※3 >0   アクション:フィルタの実行 式: ※4 条件: ...  アクション:再クエリ 条件: ...  アクション:マクロの中止 アクション:コマンドの実行 コマンド:フィルタ/並べ替えの解除 アクション:再クエリ 例1は、全部の条件をなめる?書き方 例2は、条件に合致するものを処理したらマクロを終わる完結的?書き方 条件に ... (ピリオド3つ)書けば、その条件を引き継いだ処理を記述できます。 条件には、順次絞り込んだ内容で記述できます。 (両方あったら→それぞれ片方→両方ない) だったと思います。

23tomo-u
質問者

お礼

回答有難うございます。 Nz関数を使ってこんなこともできるんですね! こんな使い方があったとは・・深いです・・。 あと、マクロの4行目の書き換えも成功しました。 他の書き方例も添えて頂きありがとうございました。 アイデアが全然足りないので、いろいろ勉強になります。 まだ質問したいこともありますので、 もしよろしければ、またお願いします。 (今度はマクロではできないかも) 有難うございました。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#2です #2はそういう情報もあるということで、 ご質問に > ・マクロ:再クエリ されていたのを見落としてました。 補足で > 1回は検索ができたのですが、それ以後、番号検索だけの検索ができなく・・・ ばかりが頭に残っていて、 でも、そうすると1回検索できたっていうのが腑に落ちませんね。 私は即値に展開して指定するたちなので、VBAで書いてしまいます。 (デバッグし易いですし) これを機にVBAを覚えるってことはありませんか。 DexMachinaさんへ 何度か同席いただき心強いです。 マクロ1行目は、アクション:全レコードの表示 でも同じですか?

23tomo-u
質問者

補足

回答ありがとうございます。 詳細はDexMachinaさんにかかせて頂きました。 もし何かあれば、補足等お願いします。 VBA・・確かにスキル的にマクロだけではもしかすると厳しいのかなーと いうところまで来ている気がします。 ただ、ACCESSの機能だけで、どこまでできるかっていうのも やってみたいところであります。 今年は時間的に無理ですが、来年あたりから時間が出来たら、 VBAにも挑戦してみたいと思っています。 ただ、勉強の仕方というか書籍に書いてあるのも見ていて難しいですね(苦笑) 向き不向きもあるんでしょうが・・。 一応、「魔法使いの開発工房、VBA&マクロ編」を持っているのですが。。 msgbox位はVBAで出来るんですけどね(誰でもできるか) とりあえず、目下の悩みはどちらに良回答を つければいいかわからない状態です(笑)。 では、宜しくお願いします。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

私はマクロは使わずに、必要なのもだけを条件に即値を記述(VBAにて)することをやってます。 Access2007 のマクロでフィルタ指定する時の情報があるようです。 Access 2007 のフォームでフィルタを実行する場合、抽出結果にフィルタが反映されない http://support.microsoft.com/kb/941800/ja ※ あれを書いた後に見つけたんですけどね(その後検証はしてません)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

書き方の基本(たまに例外あり)ですが、 > [Forms]![メインフォーム]![番号検索]=[顧客番号] 何々に対して、何々を比較したい、とした場合、 [顧客番号]=[Forms]![メインフォーム]![番号検索] と書きます。 後は、= 部分を変更していきます。 [顧客番号]=[Forms]![メインフォーム]![番号検索] ↓文字列の比較へ [顧客番号] Like [Forms]![メインフォーム]![番号検索] ↓前後を曖昧に [顧客番号] Like "*" & [Forms]![メインフォーム]![番号検索] & "*" データに NULL が無いようですが、あった場合以下が参考になると思います。 http://oshiete1.goo.ne.jp/qa5180535.html

23tomo-u
質問者

補足

回答ありがとうございます。 早速参考にさせて頂き、条件式での「あいまい検索」が できるようになりました。 以下、条件式です。 [顧客番号]=[Forms]![メインフォーム]![番号検索] Or [名前] Like "*" & [Forms]![メインフォーム]![名前検索] & "*" が! 貼って下さったnull値のリンクの中に「1回だけできて~」というところがありましたが、 私も同じ現象が起きました。 解説致しますと、私の画像でいえば「番号検索」というフィールドに 番号を入れて「名前検索」というフィールドに何も入れない(空白)と 1回は検索ができたのですが、それ以後、番号検索だけの検索ができなくなりました。 つまり上記の条件式にすると・・ 「名前検索(あいまい)だけで検索をかけると検索できる」(番号検索フィールドは空白で) 「番号検索と名前検索ともに入力すると検索ができる」 「番号検索だけで検索をかけると検索ができない」(名前検索フィールドは空白で) という状況になりました、、謎です。 またエラー等は発生していません。 どちらか一方、または両方に検索条件が入っている場合に検索ができる、 という意味で「Or」を使ったのですが、うまくいきません。 とりあえず、もうちょっと勉強してみます。 何か、お解りになられることがありましたらご教示ください。 (貴重なお時間を割いてご迷惑をかけてしまうのもなんなんでなくても結構です) 宜しくお願いします。

関連するQ&A