プロが教える店舗&オフィスのセキュリティ対策術

Acces97にて下記のようなデータベースを使用しております。

 テーブル:銀行コード一覧(銀行コード、銀行名、支店コード、支店名、支店住所)
 クエリー:Q-銀行名検索、Q-支店名検索
 フォーム:F-銀行名検索、F-支店名検索

今は検索したいフィールド毎にクエリーとフォームが作ってあり、同じようなクエリーとフォームが複数ある状態です。
 <クエリー>
  (1)Q-銀行名検索→フィールド「銀行名」に【Like "*" & [調べたい銀行名の一部入力] & "*"】設定
  (2)Q-支店名検索→フィールド「支店名」に【Like "*" & [調べたい支店名の一部入力] & "*"】設定
  ・・・以下同様のクエリー複数あり
 <フォーム>
  (1)F-銀行名検索にQ-銀行名検索を設定
  (2)F-支店名検索にQ-支店名検索を設定
  ・・・以下同様のフォーム複数あり

今回作りたいのは、1つのフォーム内に検索したいフィールド分の検索ボタンを作り、検索したい項目をテキストボックス内に入力後該当ボタンをクリックすることによって入力した項目を含むデータが抽出されるというフォームです。
例えば、"東京"と入力し「支店名」ボタンをクリックすると『東京営業部』『東京中央』等"東京"を含むデータが抽出される といった具合です。

部署内にAccess作成事例集なるものがあり、それを元に下記のように作成してみました。
フォーム名を「F-銀行コード一覧」・テキストボックス名を「検索」として、「支店名」ボタンのマクロに [Forms]![F-銀行コード一覧]![検索]=[銀行コード一覧]![支店名] というアクション(フィルタの実行→Where条件式)を設定。しかし、これでは『東京』のみしか抽出されませんでした。
Like関数を利用するのかと思い Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名] としてみましたが設定できませんでした。

どのようなアクションを設定したらフォームでのあいまい検索ができるのでしょうか?

A 回答 (8件)

フムフム!



1、検索フォームのレコードソースに作成されたクエリを設定する。
2、入力された条件に基づいてフォームをリクエリする。

ということです。
ですから、マクロはこの際関係ありません。

検索したい項目毎にクエリーを作成・・・。

ではなくて、

クエリーの検索したい項目毎に抽出条件を設定。

です。

まあ、これは表現の問題で一応クリアされているとすれば、既に99%完成しています。
既に99%完成とは、「検索フォームのレコードソース=クエリ」ということです。

さて、ここからかなり怪しい記憶ですが、{Shift}{F9}か{Ctrl}{F9}で再検索(=Requery)します。
問題は、これをどのように自動化するかです。

1、コマンドボタンを検索フォームに配置。(ウィザードを使わずにただ配置)
2、同ボタンを右クリックして、次のコードを書く。

Private Sub コマンド_抽出_Click()
  Me.Requery
End Sub

作成したクエリを使うのはあくまでも検索フォーム。
この場合、「検索フォームのレコードソース=クエリ」という設定を行うという意味。
クエリを起動しても、ただ、クエリが開くだけです。

残された課題は、僅かに1行のコードを書くだけじゃないですか?
頑張って下さい。
    • good
    • 0
この回答へのお礼

返答が遅くなり申し訳ありませんでした。
あれから同僚とも試行錯誤しながら頑張ってみましたが、結局当初の理想のフォームは断念しました。

 <当初の予定>
  1つのフォーム内にテキストボックス1個、検索ボタンを項目ごとに配置→同一フォーム内にデータ抽出
 <断念後>
  ご教授いただいた【Like "*" & [Forms]!フォーム名!テキストボックス名 & "*"】を1つのクエリーに設定
  検索用フォームを作り項目ごとのテキストボックス配置(複数・あいまい検索可能)、検索ボタン1個→別フォームにデータ抽出

何度も何度もご回答をいただいたにもかかわらず理想の形には辿り着けませんでした。大変申し訳ありません。
ですが、いろいろな状況で活用できるAccessの作成方法をまた一つ学びました。これを機に応用が利くようにもっと勉強をしたいと思います。
Husky2007様には本当に感謝しております。
できることなら直接お会いしてお礼を述べたいくらいですが、この場を借りてお礼を申し上げます。
本当にありがとうございました。

お礼日時:2008/02/13 10:44

>マクロ→フィルタの実行→Where条件式に


クエリを作ったのならフィルタは必要ないと前に書きましたよ

>Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名]
こんなめちゃくちゃな式はエラーになるのは当然です

Likeを使うのなら

フィールド名 Like "*" & [パラメータ] & "*"

=を使うのなら

フィールド名 = [パラメータ]

Likeのヘルプをよく読んでください
    • good
    • 0
この回答へのお礼

返答が遅くなり申し訳ありませんでした。
あれから同僚とも試行錯誤しながら頑張ってみましたが、結局当初の理想のフォームは断念しました。

 <当初の予定>
  1つのフォーム内にテキストボックス1個、検索ボタンを項目ごとに配置→同一フォーム内にデータ抽出
 <断念後>
  ご教授いただいた【Like "*" & [Forms]!フォーム名!テキストボックス名 & "*"】を1つのクエリーに設定
  検索用フォームを作り項目ごとのテキストボックス配置(複数・あいまい検索可能)、検索ボタン1個→別フォームにデータ抽出

何度も何度もご回答をいただいたにもかかわらず理想の形には辿り着けませんでした。大変申し訳ありません。
ですが、いろいろな状況で活用できるAccessの作成方法をまた一つ学びました。これを機に応用が利くようにもっと勉強をしたいと思います。
CHRONOS_0様には本当に感謝しております。
できることなら直接お会いしてお礼を述べたいくらいですが、この場を借りてお礼を申し上げます。
本当にありがとうございました。

お礼日時:2008/02/13 10:44

>これらはモジュールを利用されてますでしょうか?



クエリのデザインのみですよ。

Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名]

との違いは、

(((銀行コード一覧.銀行名) Like "*" & [Forms]![銀行コード一覧]![抽出する銀行名] & "*")
((銀行コード一覧.支店名) Like "*" & [Forms]![銀行コード一覧]![抽出する支店名] & "*"))

と、抽出条件を[銀行名]と[支店名]とで別々に設定していることです。
クエリのデザインで設定するには、LIKE以下をそれぞれの列の抽出条件に書くかビルドすることです。

以上の6行を注視されたし!

この回答への補足

何度も何度も丁寧なご回答ありがとうございます。
上記式をクエリーの抽出条件に入れるということで、手探りながらやってみました。
フォームのレコードソースはテーブル『銀行コード一覧』にしてあります。
検索したい項目毎にクエリーを作成して、それらをぞれぞれのボタンに設定してみました。確かに条件を含むデータが抽出されましたが、マクロのアクションを『クエリーを開く』にしましたのでクエリーが開いてしまいました。
根本的に何かが違うのでしょうけど、同じフォーム内に抽出させたい場合はどうすればいいのかさっぱり分かりません。

いいかげんお怒りのことかと思いますが、ご助言いただければ幸いです。

補足日時:2008/02/12 15:47
    • good
    • 0

>"パラメータの入力"画面を出さず検索入力


>欄を常時表示しておいて、そこへ入力する形にしたいのです。
フォームにテキストボックスを置きそこに条件を入力するようにすればいいのでは
その場合は

Like "*" & Forms!フォーム名!テキストボックス名 & "*"

のように書きます
全てのテキストボックスの更新後イベントでフォームを再クエリするようにします

この回答への補足

ご回答ありがとうございました。
質問にも書きましたが、マクロ→フィルタの実行→Where条件式に
 Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名]
を設定してみましたが、
 式'Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名]'をバーズできません。
というエラーが出て先へ進みませんでした。

根本的にどこか間違いがあるのでしょうか?

補足日時:2008/02/12 14:41
    • good
    • 0

"銀行名 LIKE '" & Me.抽出する銀行名 & "*' AND " & _


         "支店名 LIKE '" & Me.抽出する支店名 & "*' "

これは、フィルタないしレコードソースの抽出条件として設定しているだけです。
これをクエリ埋め込み方式に変えると次のようです。

SELECT 銀行コード一覧.ID, 銀行コード一覧.銀行コード, 銀行コード一覧.銀行名, 銀行コード一覧.支店コード, 銀行コード一覧.支店名, 銀行コード一覧.支店住所
FROM 銀行コード一覧
WHERE (((銀行コード一覧.銀行名) Like "*" & [Forms]![銀行コード一覧]![抽出する銀行名] & "*") AND ((銀行コード一覧.支店名) Like "*" & [Forms]![銀行コード一覧]![抽出する支店名] & "*"));

このコードは、単純にクエリの抽出条件を[銀行名]と[支店名]でビルドすれば自動生成されます。
もちろん、Access97の場合、フォームからビルドしなきゃ、このような結果は得られなかったと思います。

Like "*"&[Forms]![F-銀行コード一覧]![検索]&"*"=[銀行コード一覧]![支店名]

との違いは、

(((銀行コード一覧.銀行名) Like "*" & [Forms]![銀行コード一覧]![抽出する銀行名] & "*")
((銀行コード一覧.支店名) Like "*" & [Forms]![銀行コード一覧]![抽出する支店名] & "*"))

と、抽出条件を[銀行名]と[支店名]とで別々に設定していることです。
クエリのデザインで設定するには、LIKE以下をそれぞれの列の抽出条件に書くかビルドすることです。
だって、[銀行名]が、[銀行名]と[支店名]との複合文字列と<パターン照合>しても一致しないでしょう。
質問者のミスは、この点にあります。

rivate Sub コマンド_抽出_Click()
  Me.Requery
End Sub

この場合、コマンド_抽出_Clickのコードはこれで事足ります。
    • good
    • 0
この回答へのお礼

何度もご回答ありがとうございました。
これらはモジュールを利用されてますでしょうか?
モジュールが何なのかも理解できてない素人ですので、やはり理解できませんでした。

大変申し訳ありませんでした。

お礼日時:2008/02/12 14:41

>ひとつのクエリーに両方入れてしまうと、両方の条件を満たすデータのみしか抽出されませんよね?


いいえ大丈夫です

Like "*" & [パラメータ] & "*"

という書き方はパラメータがNull(未入力)の場合

Like "**"

となり全てのレコードがヒットしますから条件無しとみなされます
入力されたもののみが有効な条件となります
    • good
    • 0
この回答へのお礼

再度のご回答ありがとうございました。
お分かりとは思いますが、既存のクエリー(Q-支店名検索 等)は1回1回"パラメータの入力"画面が出て、そこへ入力すると抽出されたデータのフォームが出てきます。
続けて検索をしたい場合が多いので、"パラメータの入力"画面を出さず検索入力欄を常時表示しておいて、そこへ入力する形にしたいのです。

やはり基礎知識しか無い人間には難しいでしょうか?

お礼日時:2008/02/12 13:41

銀行コード一覧:



ID__銀行コード__銀行名_____支店コード__支店名__支店住所
1___101___________東京銀行__101-001_____A支店
2___101___________東京銀行__101-002_____B支店

このテーブルを基に単票フォームを作成したとします。
そして、フォームフッタに

1、コマンド_抽出。(コマンド_選択)
2、抽出する銀行名。
3、抽出する支店名。

を配置。

Private Sub コマンド_抽出_Click()
On Error Resume Next
  Me.FilterOn = False
  Me.Filter = "銀行名 LIKE '" & Me.抽出する銀行名 & "*' AND " & _
         "支店名 LIKE '" & Me.抽出する支店名 & "*' "
  Me.FilterOn = True
End Sub

Private Sub コマンド_選択_Click()
On Error Resume Next
  Me.RecordSource = "SELECT * FROM [銀行コード一覧] WHERE 銀行名 LIKE '" & Me.抽出する銀行名 & "*' AND " & _
           "支店名 LIKE '" & Me.抽出する支店名 & "*' "
  Me.Requery
End Sub

この[銀行コード一覧]の部分が、テーブル名ないしクエリ名になります。
どちらかかと言えば、後者のやり方が好きです。

この回答への補足

ご回答ありがとうございました。
え~と・・・Accessは基本知識しか理解していませんので、せっかくご回答いただいた内容がまったく理解できません。大変申し訳ありません。

誠に勝手ですが、もう少し簡単な方法は無いものでしょうか?

補足日時:2008/02/12 12:49
    • good
    • 0

フィルタの実行?


何のために
> クエリー:Q-銀行名検索、Q-支店名検索
このクエリを作ったの?
フォームのソースをこのクエリにすればフィルタは必要ありません

クエリもひとつで十分です
ひとつのクエリで
> (1)Q-銀行名検索→フィールド「銀行名」に【Like "*" & [調べたい銀行名の一部入力] & "*"】設定
> (2)Q-支店名検索→フィールド「支店名」に【Like "*" & [調べたい支店名の一部入力] & "*"】設定
この両方を書けば入力したものだけが有効となります

マクロはテキストボックスの更新後イベントにフォームの再クエリを書きます
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ひとつのクエリーに両方入れてしまうと、両方の条件を満たすデータのみしか抽出されませんよね?
その時によって調べる項目が銀行名だったり支店名だったり支店コードだったりとバラバラですので、1つのフォーム内に検索ボタンを複数配置させたいのです。

うまく説明ができなくて申し訳ありません。

お礼日時:2008/02/12 12:45

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