ギリガンよりも簡単な方法があります。大変な作業のようですが、実際はそうではありません。私のソリューションでは、サブフォームデータシートとして連続フォームを使用する必要があります。私のサブフォームには、EquipmentとManufacturerと呼ばれる2つのルックアップコンボボックスがあります。どちらも、データソースに長整数キーを保持するだけです。メーカーは、機器で選択されたものでフィルタリングする必要があります。Manufacturer.RowSourceをフィルタリングするのは、Manufacturer_GotFocusイベントだけです。
プライベートサブManufacturer_GotFocus()
If Nz(Me.Equipment, 0) > 0 Then
Me.Manufacturer.RowSource = GetMfrSQL() '- gets filtered query based on Equipment
Else
Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If
サブ終了
Manufacturer_LostFocusで、Manufacturer.RowSourceをすべてのManufacturersにもリセットしました。サブフォームを最初にクリックすると、実際にはフィールドを更新していなくても、Manufacturerを含むすべてのコントロールに対してGotFocusイベントが発生するため、これを行う必要があります。
プライベートサブManufacturer_LostFocus()
Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
サブ終了
ManufacturerのEnterイベントで、Equipmentにフォーカスが設定されていない場合は、Equipmentが選択されているかどうかを確認する必要があります。
プライベートサブManufacturer_Enter()
If Nz(Me.EquipmentID, 0) = 0 Then
'-- Must select Equipment first, before selecting Manufacturer
Me.Equipment.SetFocus
End If
サブ終了
また、Form_Currentイベント(つまり、Me.Manufacturer.Requery)でManufacturerコンボボックスを再クエリする必要があり、このサブフォームのCycleプロパティを「CurrentRecord」に設定する必要があります。
簡単そうに見えますが、まだ終わっていません。また、ユーザーがManufacturerコンボボックスに移動したが、選択を行わずに親フォームのどこかをクリックした場合に備えて、親フォームのSubForm_ExitイベントでManufacturer.RowSourceをすべてのManufacturersにリセットする必要があります。コードサンプル(親形式):
Private Sub sFrmEquip_Exit(整数としてキャンセル)
Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
サブ終了
まだきれいではないものが1つあります。[製造元]をクリックしてデータシートグリッドに複数の行がある場合、現在の行の製造元を変更している間、他の行の[製造元]フィールドは空白になります(コンボボックスの下のデータはそのままです)。このフィールドから移動すると、他のメーカーフィールドのテキストが再び表示されます。