- ベストアンサー
AccessVBAメイン/サブフォームのチェックボックスの問題を解決する方法
- AccessVBAを使用して、メインフォーム内にサブフォームを設置しています。メインとサブの両方にチェックボックスがあり、メインには4つのオプショングループがあります。サブは表形式で設定されています。
- メインフォームのレコードソースはテーブルであり、サブフォームはテーブルの値をパラメータにしたクエリに割り当てられています。フォームを表示した状態で、メイン内のチェックボックスをクリックした後にサブ内のチェックボックスをクリックすると、メイン内のチェックが全て外れてしまう現象が発生しています。
- この現象を修正するための方法がわかりません。どなたか教えてください!複数の人間が入力するため、メインとサブの両方のレコードロックは「編集済みレコード」として設定しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
追加です。 オプショングループに渡っている値を確認 するにはメインフォームの適当なところに テキストボックスを置き、そのコントロール ソースを、 =Forms!メインフォーム名!オプショングループ名 とするとわかります。 また、適当なところにボタンを設置して そのクリックイベントに、 DoCmd.OpenTable ("定義テーブル名") としてサブフォームのチェックボックス のチェックを入れるたびにボタンを クリックして入っている値を確認します。 だいたいこのようにして現況の値の渡り かたの確認などをすればバグの一掃が 可能かと思います。 お話の感じではなんとかなりそうですね。
その他の回答 (2)
- piroin654
- ベストアンサー率75% (692/917)
同じ構造のフォームを作って、原因を考えて みましたが、コードの中身、クエリの中身が わからないので推測ですが。 オプショングループが受け取ったり 返したりする値はオプショングループ 内のコントロールに割り当てられた オプション値の範囲内です。したがって、 何らかの原因でオプショングループが "A"というテキスト型の値を受け取ると オプショングループの中のチェック ボックスは灰色になります。また オプショングループが-1とか0を受け取 るとチェックが外れます。多分サブ フォームのチェックボックスの値、 この場合は-1か0ですが、を渡して いる可能性が高い気がします。 つまり、オプショングループの中のコント ロールに割り当てられているオプション値 以外の値を受け取るとオプショングループ の中のコントロールのチェックがはずされ ます。この場合は4個ですから1から4までの 数値以外の数値が渡されて可能性が高い ということです。 サブフォームのクエリではメインフォーム のコントロールの値を参照して、サブ フォーム内の各コントロールが値を受け取 ったり、値を返したりしているので、 そのコントロールソースを通じて当然 メインフォームのオプショングループに 値の変更が反映されます。このときに 定義テーブルに何らかの値が記入されたり、 オプショングループに直接値を送ったり している可能性があります。また、 プログラムからも可能性があります。 このことからサブフォームのコントロール ソースとサブフォーム内のコントロール との値のやり取り、あるいはサブフォーム 内のコードなどを点検する必要があります。 オプショングループは非連結で使うほうが トラブルを防ぎます。問題がなければ、 定義テーブルは別個に 作成してコントロールソースの参照用に 使ったらと思いますが。
お礼
ご回答ありがとうございました!! 要するに(?)、サブフォームのコントロールソース(クエリー)と、 メインフォームのコントロールソースに同じテーブルを使用している為に競合違反(?)が起きているのかも、と理解しました。 「オプショングループは非連結で使うほうがトラブルを防ぎます。」という点については参考になりました。 メインとなるテーブルから項目を削除して別テーブルに移すのは 現時点では不可能に近いので、運用でカバーして頂こうと思います。(サブフォームから先にチェックを入れ、その後メインフォーム上のチェックボックスへチェックを入れる、等) ありがとうございました! 今後とも宜しくお願い致します。
- piroin654
- ベストアンサー率75% (692/917)
なかなかレスがつかないようですが。 仕様の確認です。 メインフォームのオプショングループ のコントロールソースはどのよう設定 されているのですか。また、イベント プロシージャはありますか。 サブフォームのコントロールソースは どのように設定されていますか。 できればサブフォームのレコード ソースも。 サブフォームの表示データはメイン フォームのチェックボックスの選択 によって変動するということなので しょうか。
補足
レスありがとうございます! メインフォームのオプショングループ のコントロールソースは、単一テーブルに定義済の項目を割り当ててあります。 また、メインフォームのチェックボックスのイベントプロシージャは、「変更時」に、レコードを編集したかどうかのフラグ(メインフォーム上にあり、可視False)をONにしています。 サブフォームの表示データは、メインフォームのチェックボックスによって変動することはありませんが、メインフォーム上のコントロールをキーとしたクエリー(メインフォームに表示しているテーブルと、もう1つ他のテーブルを使用したクエリー)を、サブフォームに割り当てており、メインフォームに表示しているレコードが変わる度にReQueryしています。 このような説明で判りますでしょうか? 宜しくお願い致します!
お礼
ありがとうございます。 メインフォーム上のチェックボックス編集時に、レコード保存が出来れば良いのですが、データ保存キャンセルという機能もあり、現状では、サブフォーム上のチェックボックス編集前にレコード保存が出来ない状況です。 もうしばらく考えますが、テーブル構造を考え直すしか方法が無さそうです。 ありがとうございました(^^