• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アクセスで大分類・中分類・小分類を作っています。)

コンボボックスを連動させて、大分類・中分類・小分類を作成する方法を教えてください

このQ&Aのポイント
  • アクセスで大分類・中分類・小分類を作成していますが、データ入力後に中分類を変更しても、大分類や小分類がそのままで登録されてしまいます。
  • 大分類にSELECT DISTINCT 配置署所 FROM ボンベ管理クエリ、中分類にSELECT DISTINCT 署所記号番号 FROM ボンベ管理クエリ WHERE 配置署所=[大分類]、小分類にSELECT [ボンベID], [容器記号番号] FROM ボンベ管理クエリ WHERE 配置署所=[大分類] AND 署所記号番号=[中分類]を設定しています。
  • また、中分類と小分類のコンボボックスにはPrivate Sub 小分類_Enter() Me.小分類.Requeryを書き込んでいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.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つの処理をまとめましたが、個別に記述しても良いと思います。 ※※ 検証等は十分に行ってください。また、不具合等あれば修正してください。

endo5412
質問者

お礼

ありがとうございます。とても参考になりました。すべての問題が解消したような気がします。  ご親切にありがとうございました。

その他の回答 (1)

回答No.1

中分類、小分類ではなく、 大分類のChangeイベントあたりで中分類をリセット。 中分類のChangeイベントあたりで小分類をリセット。 ではないでしょうか。 但し、Changeイベントは、同一値を選択した場合にも 発生するようなので、無駄なリセットがされないように 工夫は必要でしょう。

endo5412
質問者

お礼

ありがとうございます。参考にしたいとおもいます。

関連するQ&A