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

コンボボックスのリストを入力値で制限する

コンボボックスのリストに表示されるデータが非常に多いので、選択するのに苦労します。そこで、コンボボックスのテキストボックス部にデータの一部を入力すると、リストのデータがそれを含むものに制限されるようにしています。↓↑キーで選択できるようにしたいですが、↓キーで選択しようとすると一番上のデータしか選択できません。

このような質問をみかけました。リストを入力値で制限する方法はWEBでさがせば見つかると思いますが、制限されたリストからマウスで選択するぶんにはいいのですが、↓キーで選択しようとしたとたんリストも制限されて、一番上しか選択できないという質問のような状況になります。

このような質問の対処法のサンプルを作成してみたので、紹介します。

コンボボックスのリストのキャプチャ

難易度:

まずは、コンボボックスのリストを制限するコード。

仕様としては、コンボボックスの値集合ソースのテーブルは、

得意先
フィールド名データ型
得意先コード数値型 主キー
得意先名テキスト型
フリガナテキスト型

というようなフィールド構成とします。

テキストボックス部にフリガナの一部を入力すると、それと部分一致で得意先にリストが制限されるようにします。

コンボボックス
プロパティ設定値
名前cmb得意先
値集合ソースSELECT 得意先名 FROM 得意先 ORDER BY フリガナ;
連結列1
自動拡張いいえ

cmb得意先の変更時のイベントプロシージャ

上記はフリガナで制限してますが、得意先名で制限してもいいかもしれません。希望に合わせてWHERE句の条件を変更してください。

さて、上記のコンボボックスでカナを一文字でも入力するとリストがドロップダウンして部分一致で制限されたリストが表示されます。そのリストから2行目以降のデータを選択しようと、↓キーを押すと、テキストボックスに1行目のデータが表示されると同時に、リストは空になって、選択できなくなります。

↓キーでの選択でも変更時イベントは発生するので、選択された値でリストが制限されれば、リストには何も表示されないことになります。

↓↑キーを押したときは、変更時イベントが発生しないようにすればいいと考えられます。

キークリック時のイベントプロシージャ

実際に、サンプルを作成して試してみると、脳内シュミレーション通りでした。フリガナの一部を入力するとリストが制限されて、上下キーでそのリストから選択できました。めでたし、めでたし。

ただ、しばらく使ってみて、↓キーを押して一端選択してから、もう一度フリガナを入力しなおすときに選択した値を消して入力し直すのもちょっとスマートさにかけると思ったので、
1行目が選択されているときに↑キーを押したら、選択する前に入力したフリガナの一部に戻ってくれると、いいんではないかと思ったので、改良してみました。

キークリック時のイベントプロシージャ

これはなかなか調子いいです。場合によっては使えそうです。機会があったら使ってみよっと。

2011.05.19 追記

当方の掲示板で質問がありました。
「コンボボックスのリストを入力値で制限する」に関して

ドロップダウンリストをマウスでクリックして項目を選択した場合、ドロップダウンリストが開いたままになるのだか、通常の動作のように閉じるようにならないか、という内容です。確かに、不自然な動作ですね。

クリックイベントでフラグをたてて、それを見て、変更時に Dropdown するかどうか判断するようにしてみました。

2016.10.08 追記

コンボボックスに連結列以外の列を表示していると、選択後にフォーカス移動するとボックスが空白になります。
その場合は、フォーカス移動時に値集合ソースを抽出条件のないものに戻しておくことで対処できます。

拍手する

7 Comments

Saru says..."帳票フォームのヘッダーにて、抽出条件として使用する場合"

いつも参考させていただいております。

この「コンボボックスのリストを入力値で制限する」も
大変使い勝手がよく、重宝しております。

こちらを利用して、
帳票フォームのヘッダーに配置して抽出条件として使わせていただいております。

その際、他の条件などでレコードが0件になっている状態で、
このコンボボックスになにか入力しようとすると、
コンボボックスの変更時イベントで
「Err 2185:コントロールがフォーカスを取得していないときに、コントロールのプロパティまたはメソッドを参照することはできません。」
というエラーが出てしまいます。

どうやらレコードが0件の状態だと、
「SELECT 得意先名, フリガナ FROM 得意先 WHERE フリガナ Like '*" & Me.cmb得意先.Text & "*' ORDER BY フリガナ;」
の「.Text」が取得できないようです。

コンボボックス自体は非連結で、
ヘッダーに配置しているのですが、
連結フォームのレコードが0件だと
フォーカスがあっても「Text」は取得できないみたいです。

上記のエラーを回避できるような
妙案がございましたら、ご助言いただけると幸いです。

2015.09.25 15:25 | URL | #- [edit]
hatena says..."re:帳票フォームのヘッダーにて、抽出条件として使用する場合"

返事が遅くなりましたが、見てくれてるかな。

0件で新規レコードがない場合、そうなります。

フォームの「追加の許可」が「いいえ」になっていたら、「はい」にしてください。

新規追加は許可したくない、という場合は、レコード移動時で新規レコードの場合は、各テキストボックスを編集ロックするなどのVBAを組んでください。

2015.09.30 14:17 | URL | #5uE6dEgY [edit]
Saru says..."re:re:帳票フォームのヘッダーにて、抽出条件として使用する場合"

hatena様
ご返信ありがとうございます。

やはり0件で新規レコードがない場合は駄目ですか。

>フォームの「追加の許可」が「いいえ」になっていたら、「はい」にしてください。
後出しになってしまい申し訳ないのですが、
帳票フォームのレコードソースは
グループ化していたり、サブクエリを使用していたりして、
基本的に更新不可の状態のものが多いです。

そのため、「追加の許可」を「はい」にしても、
新規レコードがでませんでした。

帳票フォームをサブフォームにし、
抽出条件を非連結の親フォームに配置する案も考えたのですが、
抽出条件のためにそこまでするのも・・・という気がしております。

2015.09.30 15:26 | URL | #- [edit]
hatena says..."re:re:re:帳票フォームのヘッダーにて、抽出条件として使用する場合"

> >フォームの「追加の許可」が「いいえ」になっていたら、「はい」にしてください。
> 後出しになってしまい申し訳ないのですが、
> 帳票フォームのレコードソースは
> グループ化していたり、サブクエリを使用していたりして、
> 基本的に更新不可の状態のものが多いです。
>
> そのため、「追加の許可」を「はい」にしても、
> 新規レコードがでませんでした。

やはり、そうでしたか。その場合は、

> 帳票フォームをサブフォームにし、
> 抽出条件を非連結の親フォームに配置する案も考えたのですが、
> 抽出条件のためにそこまでするのも・・・という気がしております。

その案を提案しようと思っていましたが、やはり、面倒ですよね。

Filterをかけて、0件になったら、レコードソースを下記のように書き換えるとかはどうですか。

If Me.recordset.EOF Then
  Me.RecordSource = "SELECT Null As フィールド1, Null As フィールド;"
  Me.FilterOn = False
End If

(フィールド名は実際のテーブルのものに変更してくださいね。)
実際に試していないので、うまくいくかどうかは分かりませんが。

2015.09.30 18:29 | URL | #5uE6dEgY [edit]
Saru says..."re:re:re:re:帳票フォームのヘッダーにて、抽出条件として使用する場合"

hatena様
お世話になっております。

>Filterをかけて、0件になったら、レコードソースを下記のように書き換えるとかはどうですか。
>
>If Me.recordset.EOF Then
>  Me.RecordSource = "SELECT Null As フィールド1, Null As フィールド;"
>  Me.FilterOn = False
>End If

こちらを試してみたところ、うまくいきました。
Filter実行前にレコードソースを元のクエリに戻して、
Filter結果が0件の場合は、上記の処理をする、
という形で運用できそうです。

素晴らしいアイデアを授けてくださり、
本当にありがとうございました。

2015.10.01 20:14 | URL | #- [edit]
taka says..."サブフォーム(帳票フォーム)で入力支援に使っています。"

いつも参考にさせていただいております。

Accessを使い始めて半月くらいの初心者ですが、日報管理で品番入力の支援用に本コードを利用しています。
入力支援には大変申し分ないのですが、品番を間違えた場合など修正が必要になったときに、修正した品番以外が表示されなくなる現象に遭遇いたしました。

品番:aaaa、bbbb、cccc、dddeとあった場合、dddeをddddと変更するとdddd以外がコンボボックスに表示されなくなってしまいます。
コンボボックスには、品番とその品番に対するIDを読み込んで、品番をコンボボックスに表示し、IDをテーブルに格納するようになっています。
テーブルにはIDが残っていますので、フォーム(メインフォーム)を再度開くと問題なく表示されます。

妙案がありましたら、ご助言いただければ幸いです。

2016.10.06 19:47 | URL | #- [edit]
taka says..."re:サブフォーム(帳票フォーム)で入力支援に使っています。"

> いつも参考にさせていただいております。
>
> Accessを使い始めて半月くらいの初心者ですが、日報管理で品番入力の支援用に本コードを利用しています。
> 入力支援には大変申し分ないのですが、品番を間違えた場合など修正が必要になったときに、修正した品番以外が表示されなくなる現象に遭遇いたしました。
>
> 品番:aaaa、bbbb、cccc、dddeとあった場合、dddeをddddと変更するとdddd以外がコンボボックスに表示されなくなってしまいます。
> コンボボックスには、品番とその品番に対するIDを読み込んで、品番をコンボボックスに表示し、IDをテーブルに格納するようになっています。
> テーブルにはIDが残っていますので、フォーム(メインフォーム)を再度開くと問題なく表示されます。
>
> 妙案がありましたら、ご助言いただければ幸いです。

お騒がせしました。
自己解決いたしました。
コンボ.RowSourceに抽出条件が残ったままになっていたのが原因みたいでしたので、フォーカス移動後に、whereを消した抽出条件を書き込んでみたら、問題なく動作するようになりました。

2016.10.07 07:47 | URL | #- [edit]

Leave a reply






Trackbacks

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