- ベストアンサー
コンボボックスを連動させて、大分類・中分類・小分類を作成する方法を教えてください
- アクセスで大分類・中分類・小分類を作成していますが、データ入力後に中分類を変更しても、大分類や小分類がそのままで登録されてしまいます。
- 大分類にSELECT DISTINCT 配置署所 FROM ボンベ管理クエリ、中分類にSELECT DISTINCT 署所記号番号 FROM ボンベ管理クエリ WHERE 配置署所=[大分類]、小分類にSELECT [ボンベID], [容器記号番号] FROM ボンベ管理クエリ WHERE 配置署所=[大分類] AND 署所記号番号=[中分類]を設定しています。
- また、中分類と小分類のコンボボックスにはPrivate Sub 小分類_Enter() Me.小分類.Requeryを書き込んでいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そのフォームは単票でしょうか。 帳票なら以下の方法ではできません(コントロールを重ねないと不可能だと思います。) 現状のフォームをコピーし、コピーした方で動作確認してみます。 レコードが更新されても良いようにバックアップは取っておきます。 コピーした方のフォームに記述してあるイベント関係のものをすべて削除し、 以下の記述と置き換えてみます。 Private Function EnterCheck() Dim vN As Variant Dim i As Long, j As Long vN = Array("大分類", "中分類", "小分類") For i = LBound(vN) To UBound(vN) If (Me.ActiveControl Is Me(vN(i))) Then For j = LBound(vN) To i - 1 If (IsNull(Me(vN(j)))) Then Me(vN(j)).SetFocus Exit Function End If Next Exit For End If Next With Me.ActiveControl .Requery .Dropdown End With End Function Private Function UpdateCheck() Dim vN As Variant Dim i As Long, j As Long vN = Array("大分類", "中分類", "小分類") For i = LBound(vN) To UBound(vN) If (Me.ActiveControl Is Me(vN(i))) Then For j = i + 1 To UBound(vN) Me(vN(j)) = Null Next If (i <> UBound(vN)) Then Me(vN(i + 1)).SetFocus Exit Function End If Exit For End If Next End Function Private Sub Form_Load() Dim vN As Variant Dim i As Long vN = Array("大分類", "中分類", "小分類") For i = LBound(vN) To UBound(vN) With Me(vN(i)) .ValidationRule = "Is Not Null" .OnEnter = "=EnterCheck()" .AfterUpdate = "=UpdateCheck()" End With Next End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) If (IsNull(Me.小分類)) Then Cancel = True End Sub ※※ 操作は、必ず "大分類" → "中分類" → "小分類" の順であるとします。 ※ Enter 時の動き どのコンボボックスの Enter でも同じ処理を走ります。 まず、Enter になったのは「誰」を求めます。 求まったら、前操作のコンボボックスが入力されているか確認します。 値が設定されていなければ、そのコンボボックスにフォーカスを移動します。 値が設定されていれば、 Requery 後 Dropdown 表示します。 ※ AfterUpdate 時の動き どのコンボボックスの AfterUpdate でも同じ処理を走ります。 まず、AfterUpdate になったのは「誰」を求めます。 求まったら、後操作のコンボボックス値を Null に変更します。 次のコンボボックスにフォーカスを移動します。 ※ フォームのオープン時 各コンボボックスに上記関数を実行する様、イベントに設定していきます。 また、入力規則に念のため Is Not Null を設定しておきます。 既に値が設定されていて、Delキー 等で削除された場合エラーとなるように・・・ ※ フォームの更新前処理 コンボボックスは、必ず "大分類" → "中分類" → "小分類" の順と決めたので、 最後の Me.小分類 が Null なら Cancel = True として、更新を拒否します。 ※ コンボボックス3つの処理をまとめましたが、個別に記述しても良いと思います。 ※※ 検証等は十分に行ってください。また、不具合等あれば修正してください。
その他の回答 (1)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
中分類、小分類ではなく、 大分類のChangeイベントあたりで中分類をリセット。 中分類のChangeイベントあたりで小分類をリセット。 ではないでしょうか。 但し、Changeイベントは、同一値を選択した場合にも 発生するようなので、無駄なリセットがされないように 工夫は必要でしょう。
お礼
ありがとうございます。参考にしたいとおもいます。
お礼
ありがとうございます。とても参考になりました。すべての問題が解消したような気がします。 ご親切にありがとうございました。