いつもお世話になっております。 以前も質問させていただいたのですが、結局解決できず、再度質問させていただきます。
いつもお世話になっております。 以前も質問させていただいたのですが、結局解決できず、再度質問させていただきます。 F_シーン分類にチェックボックスを27個作っているのですが、それぞれのチェックボックスにチェックがオンオフすると、T_02シーン分類表のチェックボックスのYes/Noもオンオフするという仕組みを作っています。 以前どうしてもわからずにクエリをそれぞれ作って動かすという処理をしていましたが、テーブルの名前が変わったりということがあり、どうにかやはりVBAで処理できないかと思い、いろいろ調べてみたのですが、わかりませんでした。 今は Private Sub chk_01_Click() DoCmd.SetWarnings False If Me.chk_01.Value = False Then Me.chk_03.Value = False Me.chk_04.Value = False Me.chk_05.Value = False Me.chk_06.Value = False ・・・ Me.chk_26.Value = False 'T_シーン分類表へ結果反映 DoCmd.OpenQuery "Q02_01_01_NO", acNomal ”分類が=chk_01のときT_02シーン分類表のチェックボックスがノーという更新クエリ” Else Me.chk_03.Value = True Me.chk_04.Value = True Me.chk_05.Value = True ・・・ Me.chk_25.Value = True Me.chk_26.Value = True 'T_シーン分類表へ結果反映 DoCmd.OpenQuery "Q02_02_01_YES", acNomal End If これを27個作っています。クエリも54作ってます。 どうにかこれをクエリを使わずにできないでしょうか。 以前ADO処理を・・というアドバイスをいただいたのですが、結局どのような式にしていいのかわからずこういう形になりました。 どなたかよいアドバイスをいただければとてもありがたいです。 よろしくお願いいたします。 DoCmd.SetWarnings True End Sub
更新クエリのSQLは UPDATE W_00_01_基本設定選択後商品一覧 INNER JOIN T_02シーン分類表 ON W_00_01_基本設定選択後商品一覧.小分類 = T_02シーン分類表.小分類 SET W_00_01_基本設定選択後商品一覧.不要商品flag = Yes WHERE (((W_00_01_基本設定選択後商品一覧.不要商品flag)=No) AND ((T_02シーン分類表.小分類チェック)=No) AND ((W_00_01_基本設定選択後商品一覧.商品分類flag)=Yes)); です。
Microsoft Access | Visual Basic・57閲覧・50
ベストアンサー
こんばんは。 回答します。 以下の説明に沿って作業をしてください。 手順は多くはありませんが、確実に行うことが重要です。 クラスモジュールを使った省力化の方法を紹介します。慣れたらほかでも使えると思います。 最後に説明を加えますので、そちらもよく読んでください。 あるチェックボックスをクリックした時はほかのチェックボックスも同じ値にする、というものです。 質問ではなぜか、chk_02が抜けてますが、このコードではchk_02も処理しています。 1. クラスモジュールを新規作成して、以下のコードをコピペします。 Option Compare Database Option Explicit Dim FControl As Control Dim WithEvents FCheckBox As CheckBox Public Sub Connect(Control As Control) Set FControl = Control If TypeOf Control Is CheckBox Then Set FCheckBox = Control End If FControl.AfterUpdate = "[Event Procedure]" End Sub Private Sub AfterUpdate() Dim i As Integer Dim n As String Dim flg As Boolean Dim frm As Form Set frm = FControl.Parent n = Right(FControl.Name, 2) flg = FControl.Value For i = 1 To 5 If CInt(n) <> i Then frm.Controls("chk_" & Format(i, "00")).Value = flg 'CurrentDb.Execute "UPDATE " End If Next i 'MsgBox FControl.Name End Sub Private Sub FCheckBox_AfterUpdate() AfterUpdate End Sub コードはここまで。 これを CCheckBox という名前で保存します。 2. もうひとつクラスモジュールを新規作成して、以下のコードをコピペします。 Option Compare Database Option Explicit Dim Collection As New Collection Public Sub Connect(frm As Form) Dim CCheckBox As CCheckBox Dim cnt As Control For Each cnt In frm.Controls If cnt.ControlType = 106 Then Set CCheckBox = New CCheckBox CCheckBox.Connect cnt Collection.Add CCheckBox End If Next cnt End Sub コードはここまで。 これを CCheckBoxes という名前で保存します。 3. チェックボックスがたくさんあるフォームの宣言セクションに次の一行を追加します。 Private CCheckBoxes As New CCheckBoxes 4. 同じフォームのOpenイベントに次の一行を追加します。 CCheckBoxes.Connect Me コードはここまで。 これでコードはすべてです。 これだけでご希望の処理はすべて実行できます。 ただし、上記1.のクラスモジュールのAfterUpdateプロシージャの中のFor文に注目してください。 このコードでは 1 to 5 としてありますが、5を26とか27とか適当に変えてください。 もうひとつ、 CurrentDb.Execute "UPDATE "の続きを入力して完成させてください。その上で、コメントの「‘」をはずしてください。 更新するのは、そのチェックボックスに対応するフィールドだけでいいです。 このプロシージャの最後の MsgBox はコメントアウトしてありますが、クリックしたチェックボックスの名前を表示するものです。テスト用。 DAOを使っています。参照設定をよろしく。 ちなみに、クラスモジュールは「作成」タブにあります。 クラスモジュールを使えるようになるとここまで省力化できるので参考になれば。 以上です。 不明な点があったら返信ください。
1人がナイス!しています
おはようございます。すごく初心者に優しいご説明本当にありがとうございました!!すごく分かりやすかったです。早速今日試してみてご報告させて頂きます。不明点ありましたらお言葉に甘えてまた返信させて頂きます。取り急ぎお礼申し上げます。
質問者からのお礼コメント
結局解決はしなかったのですが、色々アドバイス頂いたお礼でこちらをベストアンサーとし、この質問は終了させて頂きます。本当にありがとうございました。
お礼日時:3/8 11:28