【Access】サブフォームの項目選択時、対応するコントロールの制御方法

このQ&Aのポイント
  • サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、サブフォーム内のチェックボックスをクリックすると、対応するコンボボックスの有効無効を制御したい(ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、どのチェックボックスをクリックしても、ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。
  • 添え字を渡すことで対応するコンボボックスを制御できる方法を探しています。
  • お知恵をお貸しください。
回答を見る
  • ベストアンサー

【Access】サブフォームの項目選択時、対応するコントロールの有効無効を制御する方法

サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、 サブフォーム内のチェックボックスをクリックすると、 対応するコンボボックスの有効無効を制御したい (ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、 どのチェックボックスをクリックしても、 ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。 【テーブル名:tbl】 ID, checkbox, combobox 0, false, A 1, true, B 2, false, C 【サブフォーム名のチェックボックスのクリックイベント】 Private Sub checkbox_Click() If Me.checkbox = True Then Me.combobox.Enabled = True Else Me.combobox.Enabled = False End If End Sub 何かしら添え字を渡す事ができれば、対応できるのではと思いましたが、 どのように記述すればよいか分かりませんでした。 その為、上記のような場合、個別で制御する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 上記のような場合、個別で制御する方法 Enabledプロパティには、添え字などでレコードごとに個別制御する 機能は、残念ながらありません。 ただ、Enabledプロパティを切り替えたいコントロールが連結コントロール (→テーブル/クエリのフィールドの値を表示するコントロール)の場合は、 『条件付き書式』で対応できます。 (コマンドボタンなどのように、フィールドと関連性のないコントロールでは、  この方法は使えません) 1)サブフォームをデザインビューで開く  ※Access2002以降の場合は、メインフォームでも可。   (サブフォーム内のコントロールを選択する場合、間を空けた2回の   クリックが必要になる場合あり) 2)対象コントロール(=combobox)をクリックして選択  ※もしも実際のフォーム上でもこの名前を使用しているのでしたら、    後でエラーを呼ぶ原因になりかねないので変更しておいた方が    無難です。 3)Accessのメニューで「書式(O)→条件付き書式(D)」を選択 4)『条件付き書式設定』ダイアログが開くので、一番上の『既定の  書式設定(F)』で右端の『有効』ボタンをオフにする  →中央部の書式サンプルがグレーアウト:「Enabled=False」相当 5)『条件1(1)』で、左端のコンボボックスで「式」を選択し、式の入力  欄に「[CheckBox]=True」を指定  ※こちらの名前も、上と同様、変えることをお勧めします。 6)右端の『有効』ボタンはオンになっているはずなので、そのまま  (オフになっている場合はオンにしてください)  ⇒以上、添付画像を参照 7)その他、文字色などを変えるなら、それも合わせて設定した上で  『Ok』ボタンをクリックしてダイアログを閉じる ・・・以上です。 こちらで確認した限りでは、以上の設定のみで、特にマクロやVBAでの 対応を組むことなく、チェックボックスの更新毎に、リアルタイムでコンボ ボックスの使用可否が切り替わることを確認しました。 (Access2003/WinXP Home) 【注意】 条件付き書式でフィールド名を指定するときは、半角の角括弧( [ ] )で 囲んでやってください。 (テキスト型などのフィールドの場合に、勝手に文字列と判断されて、  「"」で囲まれるのを防ぐためです)

iroha_168
質問者

お礼

ご回答ありがとうございます。 ご提示いただいた手順で意図した動作が行われる事を確認しました。 なお、個人的な好みの問題で、条件付き書式をGUIで設定するのではなく、VBA(FormatConditions)を使用させていただきました。 また、コントロール名の変更の件、了解いたしました。 このたびはどうもありがとうございました。 以上、よろしくお願いします。

その他の回答 (1)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

テーブルにそれぞれひとつずつcheckbox, comboboxがあるんですよね ひとつしかないコントロールを複数の状態にはできません。

iroha_168
質問者

補足

ご回答ありがとうございます。 おっしゃる通り、テーブルには一つずつcheckbox、comboboxがあります。 そしてフォームにはテーブルのレコード分のcheckbox、comboboxが表示されています。 今回の質問としては、フォームに表示されているID=0のcheckboxをクリックしてONにした際、ID=0のcomboboxを有効にしたいと思っております。 またID=0のcheckboxをクリックしてOFFにした際、ID=0のcomboboxを無効にしたいと思っております。 これをID=0から最後のIDにまで適用したいと思っております。 以上、よろしくお願いします。

関連するQ&A

  • Access2007 サブフォームでフィルタリングする方法

    お世話になっております。 フォーム上に関連性のないサブフォームがあります。 フォームのコンボボックスでデータを選び検索ボタンをクリックすると、サブフォームのフィールドがコンボボックスのデータで抽出できるようにしたいと思います。 このように書いてみましたが、検索ボタンをクリックするとサブフォームの全てのデータが消えてしまい、実現できませんでした。 Me.FilterOn = True Me.Filter = "(Forms!フォーム!サブフォーム1!コンボ Like '*" & Me.フィールド & "*')" サブフォームでフィルタリングできる方法を教えていただければ幸いです。 よろしくお願いいたします。

  • エクセルVBAでユーザーフォーム

    エクセルVBAでユーザーフォーム上にオプションボタンが2つ、コンボボックスが6つあります。 OptionButton1をクリックした場合のComboboxの動きの制御について以下のように書いてみました。 これでも期待通りCombobox1~3は動き4~6は動かなくなります。 ただ、もっと別の簡単な書き方があるのではないかと思い質問しました。 宜しくお願いします。 Private Sub OptionButton1_Click() ComboBox1.Enabled = True ComboBox1.ListIndex = 0 ComboBox2.Enabled = True ComboBox2.ListIndex = 0 ComboBox3.Enabled = True ComboBox3.ListIndex = 0 ComboBox4.Enabled = False ComboBox4.ListIndex = 0 ComboBox5.Enabled = False ComboBox5.ListIndex = 0 ComboBox6.Enabled = False ComboBox6.ListIndex = 0 End Sub

  • エクセル VBA チェックボックスについて

    よろしくお願い致します。 OS:XP エクセル2003 VBAのことは、まったくの初心者です。 質問なのですが、下記のようなチェックボックス7にチェックが入れば、チェックボックス8~11に自由にチェックが入れれるようになり、逆にチャックボックス7にチェックが入ってない場合は、チェックボックス8~11のチェックはクリアされ、チェックできないものを作りました。 ここから、チェックボックス7にチェック入れたあとは、必ずチェックボックス9~11のどれかにチェックが入っている状態(ラジオボタンのような)で、チェックボックス7にチェックが入ってなかったら、8~11のチェックがクリアで尚且つ、チェックができなくなるようにするにはどうすればよいでしょうか? よろしくお願い致します。 Private Sub CheckBox7_Click() If CheckBox7.Value = True Then CheckBox8.Enabled = True CheckBox9.Enabled = True CheckBox10.Enabled = True CheckBox11.Enabled = True Else CheckBox8.Value = False CheckBox9.Value = False CheckBox10.Value = False CheckBox11.Value = False CheckBox8.Enabled = False CheckBox9.Enabled = False CheckBox10.Enabled = False CheckBox11.Enabled = False End If End Sub

  • どれか1つでもチェックされていたら無効にする

    VB2010 7 Pro SP1 8つのチェックボックスと4つのラジオボタンがあり、チェックボックスにどれか1つでも チェックが入っていたらラジオボタンを無効にし、チェックが全部外れたら ラジオボタンを有効にしたいです。 下記のようなifで出来るかと思ったのですが、フォーム、ラジオボタン、チェックボックス どれに記述しても動きません。 どこに記述すればいいでしょうか? If CheckBox1.Checked Or CheckBox2.Checked Or CheckBox3.Checked Or CheckBox4.Checked Or CheckBox5.Checked Or CheckBox6.Checked Or CheckBox7.Checked Or CheckBox8.Checked Then RadioButton4.Enabled = False RadioButton6.Enabled = False RadioButton7.Enabled = False RadioButton8.Enabled = False Else RadioButton4.Enabled = True RadioButton6.Enabled = True RadioButton7.Enabled = True RadioButton8.Enabled = True End If

  • オプションボタン選択でコンボボックス有効

    ExcelVBAでユーザーフォームを作成しているのですが、昨日までうまく動作していたことが、突然動かなくなりました。 オプション1を選択 ↓ コンボボックス1有効  ※他のコンボボックスは無効 ↓ オプション2を選択 ↓ コンボボックス2有効  ※コンボボックス1も含め他のコンボボックスは無効 という感じで動作させたいです。 書いたコードはこんな感じです。 Private Sub OptionButton1_Click () Dim i As Long Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row If OptionButton1.Value = True Then OptionButton1.Enabled = True With ComboBox1 If ComboBox1 = "" Then For i = 2 To lastRow .AddItem Worksheets("sheet1").Cells(i, 1).Value Next i End If End With ComboBox1.ListIndex = 0 ComboBox2.Enabled = False ComboBox3.Enabled = False End If End Sub コードの間違いや改善点などありましたら教えて下さい。 よろしくお願いします。

  • 【Access】テキストボックスに入力後、そのテキストボックスを無効化する方法について

    txt_IDというテキストボックスにIDを入力して、 そのIDがデータベースに存在した場合、txt_IDを無効化したいと思います。 下記にソースコードを記載しましたが、下記では Me.txt_ID.Enabled = False まで遷移した後、下記のエラーメッセージが表示されてしまいました。 「実行時エラー '2164': コントロールがフォーカスを取得しているときは、コントロールを無効にすることはできません。」 【ソースコード】 Private Sub txt_ID_BeforeUpdate(Cancel As Integer) Dim record_Existence As Boolean ' 本来はDBにアクセスして入力したIDが存在するかチェックしています。 record_Existence = True If record_Existence = True Then Me.txt_ID.Enabled = False End If End Sub その為、上記のような場合、どのようにすればコントロールを無効化できるか、 ご存知の方がいらっしゃいましたら、ご教示いただければと思います。 よろしくお願いします。

  • コンボボックスの変更に応じてテキストボックスの有効を切り替える(ExcelVBA2007)

    お世話になります。 Excel VBA 2007で質問です。 今、  Label1 ComboBox1 TextBox1  Label2 ComboBox2 TextBox2 ・・・  Label100 ComboBox100 TextBox100 のようなフォームがあるとします。 ComboBox1~100は「Any」「is」「is not」のいずれかの値が取れ、初期値はAnyとします。 TextBox の Enabled プロパティの初期値は False とします。 やりたいことは、 ComboBox が「Any」でない場合(is または is not のいずれかの場合)にのみその右隣の TextBox の Enabled プロパティを True にしたいのです。 いま、ComboBox30 を Any から is に切り替えたとします。 すると、TextBox30.Enabled を False から True にしたいのです。 ここで、ComboBox30 を is から is not に切り替えたとします。 TextBox30.Enabled は True のままです。 ここで、ComboBox30 を is not から Any に切り替えたとします。 すると、TextBox30.Enabled を True から False にしたいのです。 ComboBox のイベントハンドラで Sub ComboBox30_Change ()  If ComboBox30.Value = "Any" Then   TextBox30.Enabled = "False"  Else   TextBox30.Enabled = "True"  End If End Sub のように書けばいいことは分かっているのですが、その場合は数字だけ変えたイベントハンドラを100個書かなければなりません。 このイベントハンドラを1個にすることはできるでしょうか。 (コンボボックス100個のうちどれかが変更されたら、変更されたコンボボックスの番号を知りながら呼び出されるハンドラ) 次善の策として、 Sub ComboBox30_Change ()  userSubroutine End Sub のように書くこともできるかと思いますが、この場合、どのコンボボックスが変更されたか(どのイベントハンドラが起動されたか)を知って、userSubroutine に渡さなければなりません。 よろしくお願いします!

  • Access2007 サブフォームの新規レコードをすぐにフォームに表示させる方法

    サブフォーム上で適当なレコード(IDと商品名)を選択して、そのレコードにある入力ボタンを押すと、フォームのコンボボックス上にその商品名が出るようなフォームがあります。 すでに入力済みのIDと商品名は表示されます。 ところが、サブフォーム上でIDと商品名を新規入力して入力ボタンを押すと、フォームのコンボボックスは空白となり、商品データが表示されません。 しかし、一旦フォームを閉じて開くと、データは表示されています。 IDと商品名を新規入力して、そのままフォームのコンボボックスに反映させたいと思います。 入力ボタンはこのようにやってみました。 Private Sub 入力_Click() DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 Forms!フォーム!ID = Me.ID End Sub または、 Private Sub 入力_Click() DoCmd.RunCommand acCmdSaveRecord Forms!フォーム!ID = Me.ID End Sub ご教授いただければ幸いです。よろしくお願いいたします。

  • EXCEL VBA ユーザーフォーム内のテキストボックスを一括処理する方法について

    EXCEL VBAのユーザーフォームについて質問があります。 ユーザーフォームを作り、その中にコンボボックスを1個、テキストボックスを100個設置する。 コンボボックスの値が1のときはテキストボックス1~テキストボックス50までのEnabledをFalseに設定し、 コンボボックスの値が2のときはテキストボックス1~テキストボックス100までのEnabled をFalseに設定する。 このとき、TextBox1.Enabled = False、TextBox2.Enabled = False・・・と一つ一つ書いていくのではなく、 セルを処理するときと同様に、テキストボックスの番号を変数にして処理することは可能でしょうか。 Private Sub ComboBox1_Change()  Dim i As Integer   If ComboBox1.Value = 1 Then   For i = 1 To 50   TextBox(i).Enabled = False   Next i   ElseIf ComboBox1.Value = 2 Then   For i = 1 To 100   TextBox(i).Enabled = False   Next i   End If End Sub というような処理をイメージしているのですが、うまくいきません。どうぞよろしくお願いいたします。

  • if文からcase文への置き換え

    ピクチャボックスをクリックしたら、チェック ボックスがチェックされるメソッドを作りたいと 思っています。 Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click,PictureBox2.Click 'ここから If sender Is PictureBox1 Then If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If ElseIf sender Is PictureBox2 Then If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End If 'ここまで End Sub 上記のif文をCase文に置き換えたくて、 'ここから Select Case sender Case PictureBox1 If Me.CheckBox1.Checked = False Then Me.CheckBox1.Checked = True Else Me.CheckBox1.Checked = False End If Case PictureBox2 If Me.CheckBox2.Checked = False Then Me.CheckBox2.Checked = True Else Me.CheckBox2.Checked = False End If End Select 'ここまで 上記のように書き換えたのですが、エラーが出てしまいます(ビルドは通るのですが)。 Case文の使い方が間違っているんだとは思いますが、どこがどう 間違っているのがよくわかりません。 ご教授いただけないでしょうか?

専門家に質問してみよう