MS Access Tips/Sample and VBA and Blog customize etc...

フォームのすべてのフィールドを対象とする検索機能

accessのフォームの最下部にある検索機能と同じような検索をフォーム内に作りたいです。
テキストボックスに入力した文字を、ボタンを押して検索という形にしたいです。

フォームのすべてのフィールドを対象とする検索機能

難易度:

Access2007以降は、移動ボタンの右に、下図のような検索窓が実装されました。ここで値を入力すると、フォーム上の全フィールドを対象として部分一致で検索が始まります。

続けて、Enterキーを押すと次の一致するフィールドへ移動します。

移動ボタン右の検索窓

この検索窓では入力するとリアルタイムに検索しますが、とりあえずはフォームヘッダーにテキストボックスとコマンドボタンを配置して、コマンドボタンのクリックでテキストボックスの値と部分一致するフィールドへ移動するという仕様でいきましょう。

一つのフィールドを対象とする場合は、以前に下記の記事で紹介しています。

フォームに独自の検索機能を実装する

この記事では、Recordset.FindFirstメソッドを使いましたが、全フィールドが対象となると面倒です。

検索コマンドは、VBAでは DoCmd.FindRecord ですが、これは引数で対象をカレントフィールドか全フィールドか指定できるので、これで簡単にできそうだと思って、サンプルを作ってテストしてみたがうまく検索してくれません。

試行錯誤して、ようやく動くようになったのですが、そのMDBファイル内の別のフォームを見るとまったく同じようなコードがあるではないですか。

で、思い出しました。以前、同じような質問があってやはり、試行錯誤してサンプルを作成していたのを orz。

また、同じ事をくり返さないためにブログに置いておくことにしました。

フォームヘッダーかフォームフッターに テキストボックス(txtFind) とコマンドボタン(cmdFind)を配置しておきます。コマンドボタンのクリック時のイベントプロシージャを下記のように記述します。

テキスト1 は詳細セクションの先頭のテキストボックスです。

これで、txtFind に値を入力して、cmdFind をクリックすると、入力した値と一部が合致する最初のフィールドへ移動します。

DoCmd.FindRecord の1行だけで出来そうなのですが、txtFind へ移動してしまい検索に失敗します。どうもtxtFindを一番最初に検索するようです。そこで、txtFindの値を一端変数に待避させておいて、検索して、検索後、txtFind に待避した値を戻すようにしています。

また、詳細セクションのテキストボックスにフォーカスを移動させておかないとやはり検索に失敗します。

「次を検索」(cmdFindNext)ボタンも追加してみました。

txtFindが未入力の場合のエラー処理は入れてないので、必用に応じて追加してください。

2011.05.19 追記

コメントで MukkuMukuさんからいただいたアイデアで書き直しました。

拍手する

2 Comments

MukkuMuku says...""

Me.txtFind.Enabled = False
DoCmd.FindRecord Me.txtFind, ...
Me.txtFind.Enabled = True
てな感じでもいけるみたいです。だからといって特に何もないけど。
ボタンひとつで検索を実装したい件あってコーディング中でっす。

2011.05.12 03:44 | URL | #2DdjN05. [edit]
hatena says..."Re:MukkuMukuさん"

なるほど、その方が変数を用意しなくてもいいのでシンプルですね。

どうも、最近、頭堅くなってるのかな。

あっ、それから、事後報告ですが、
MukkuMukuさんのブログに勝手にリンクさせていただいてます^^;。

あかんかったら、「あかん」といってください。

2011.05.12 10:59 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/301-8e291971
該当の記事は見つかりませんでした。