アクセスウィザードでは、同じことをもっと簡単に行うことができます。フォームデザインでフォームウィザードをオンにし、コンボボックスボタンをクリックしてフォームのヘッダー内の場所をポイントすると、リストされているものと一致するレコードを検索するコンボボックスが自動的に作成されますドロップダウンリストに表示されます。
しかし、心の中でこれらの事を保つ:
それは(大レコードセットには推奨されていない)あなたは、テーブル全体にフォームをバインドしました場合にのみ機能します
コードそれ恐ろしいことに悪いです。
この問題を解決するにはいくつかの方法があります。あなたのフォームを表全体にバインドするのがうれしい場合は、(ウィザードで作成したコードのように)ブックマークのナビゲーションは問題ありません。しかし、私はあなたがこのコードの代わりに、ウィザードのコードを使用することをお勧めします(コンボボックスでは、検索しようとしているレコードのPK IDとバインドされた列を持っていると仮定し):
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
With Me.RecordsetClone
.FindFirst "[MyID]=" & Me!MyCombBox
If Not .NoMatch Then
If Me.Dirty Then Me.Dirty = False
Me.Bookmark = .Bookmark
End If
End With
End Sub
コンボボックスがする必要があるでしょうSQLの値集合ソースを使用し、そしてそれはのようになります。
SELECT CompanyID, CompanyName FROM Company ORDER BY CompanyName
そして、あなたは2列、最初の1バインドされた列を持つようにコンボボックスを定義するだろう、とあなたが最初の列の幅を設定したいですウィザードはこれを行い、あなたのためにセットアップします。それが間違っている唯一のことは、本当に悪いコードを書くことです。
ここで、一意の値を探していない場合は、複雑になり、別のアプローチを使用することもできます。人々を表示し、特定の会社のものを見たいと思うフォームがあるとします。その場合、CompanyNameでフィルタすることができます。その場合、上で概説したようにFind操作を実行する代わりに、フィルターを適用することができます。その場合、あなたのコンボボックスのAfterUpdateイベントは、このようなものになるだろう:会社名および無隠しIDフィールドで、
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
Me.Filter = "[CompanyName]=" & Chr(34) & Me!MyComboBox & Chr(34)
Me.FilterOn = True
End Sub
さて、その場合には、あなたのコンボボックスを持っているだろうが、一つの列なので、それはですやや異なっている。
アクセスUIによって提供されているように、この種のフィルタリングをプログラミングするのは嫌いです(CompanyNameフィールドを右クリックしてポップアップするショートカットメニューでフィルタリングする会社名を入力し、ワイルドカード、?と*を含む)。また、フィルタがすでに存在するときにフィルタリングしようとすると、混乱することがあります。 CitiCorpのみを表示しているときにJP Morgan Chaseでフィルタリングすると、何も取得できません。
代わりに、フィルターを適用する代わりにフォームのレコードソースを変更する傾向があります。これは、各検索が新しい結果セットを提供し、最も効率的なアプローチであることを意味します。最初の出発点に戻るという点では少し複雑になりますが、適切に設計されたアプリケーションでは、ユーザーのデータの部分集合のみが最初に提示されるはずです。したがって、このアプローチの問題は、原因は、ユーザーが本当に必要とするデータだけを取得する、適切で効率的なユーザーインターフェイスを構築するために解決する必要があるものです。