コメントの中で、lamcroは、コームボックスボックスにレコードセットがあるかどうかの問題について観察しています。
フォームのVBコードに侵入し、CBコントロールを「ウォッチを追加」すると、レコードセットプロパティがそこにあります。私はそれ自身の特性を入力して見ることさえできます。
ウォッチリストを設定すると表示されますが、コンボボックスのレコードセットにアクセスしたり、コードで変更したりすることはできません。コンボボックスをフィルタリングするには、そのRowsourceを操作する必要があります。
これは、次の2つの方法のいずれかで実行できます。
- イベントを使用して、その場でコンボボックスに新しいRowsourceを割り当てる、または
- 他のコンボボックスのRowsourceのWHERE句で、値をフィルタリングするコントロールへの参照を使用します。
cmbComboBox1があり、その中の値を選択するときに、cmbCombBox2にリストされている値を、cmbComboBox1で選択された値に従ってフィルター処理するとします。方法1の場合、最初のコンボボックスのAfterUpdateを使用して、2番目の行ソースを設定します。
Private Sub cmbComboBox1_AfterUpdate()
Dim strRowsource As String
strRowsource = "SELECT * FROM MyTable"
If Not IsNull(Me!cmbComboBox1) Then
strRowsource = strRowsource & " WHERE MyField = " & Me!cmbComboBox1
End If
Me!cmbComboBox2.Rowsource = strRowsource
End Sub
2番目の方法を使用するには、代わりに、最初の値のテストに基づく2番目のコンボボックスのRowsourceを定義します。
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
これは、最初のコンボボックスに値がある場合は行ソースをフィルタリングし、値がある場合はフィルタリングしません。つまり、最初のコンボボックスに値が選択されるまで、フィルタリングされていないリストが表示されます。
次に、cmbComboBox1のAfterupdateイベントで、2番目のコンボボックスを再クエリします。
Private Sub cmbComboBox1_AfterUpdate()
Me!cmbComboBox2.Requery
End Sub
フォームコントロールへの参照が適切に解決されるようにするために、パラメーターを定義することもおそらく良い考えです。したがって、Rowsourceは次のようになります。
PARAMETERS [Forms]![MyForm]![cmbComboBox1] Long;
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
(自動番号PKでフィルタリングしていると仮定すると、データ型が異なる場合は、もちろん、異なるデータ型を使用します)
動的なRowsource割り当てを使用する傾向があります。これは、Accessのさまざまなバージョン間で問題が少ないことがわかったためです(つまり、フォーム上のコントロールへの参照は、Accessのすべてのバージョンで同じように解決されるわけではありません)。