• ベストアンサー

シートのボタンからフォーム出した場合、チェックボタンの動作がうまくいきません

フォーム上の2つのチェックボタンをトグルさせたいのですが、シート上に設定したコマンドボタンからフォームを表示させると、トグルがうまくいきません。 尚、メニューからフォームを表示させた場合、正しく動作します。 回避させる手段はあるでしょうか? これはエクセルの仕様なのでしょうか? Excel2003です(英語版)。英語版Windows7Proです。 フォームのVBA Private Sub UserForm_Initialize()   CheckBox1.Value = True   CheckBox2.Value = False End Sub Private Sub CheckBox1_Click()   CheckBox1.Value = True   CheckBox2.Value = False End Sub Private Sub CheckBox2_Click()   CheckBox2.Value = True   CheckBox1.Value = False End Sub シートのVBA Private Sub CommandButton4_Click()   sb_UserForm1Show End Sub 標準モジュール Sub sb_MenuCreate()   sb_MenuDelete   Dim myMnu As Object   Dim Cap_P As String   Cap_P = "Prototype"   Set myMnu = CommandBars("Worksheet menu bar").Controls.Add(Type:=msoControlPopup, Before:=3)   With myMnu     .Caption = Cap_P   End With   sb_Menu01 Cap_P, "Delete This Menu", "sb_MenuDelete"   sb_Menu01 Cap_P, "RecoverTest", "RecoverTest"   sb_Menu01 Cap_P, "Clear DataBase", "sb_ClearDatabaseConf"   sb_Menu01 Cap_P, "Show All Data", "sb_ShowAllData"   sb_Menu01 Cap_P, "Remove Autofilter", "sb_RemoveAutofilter"   sb_Menu01 Cap_P, "Add Autofilter", "sb_AddAutofilter"   sb_Menu01 Cap_P, "Remove Sub Total", "sb_RemoveSubtotal"   sb_Menu01 Cap_P, "Add Sub Total", "sb_AddSubtotal"   sb_Menu01 Cap_P, "Load Form", "sb_UserForm1Show"   sb_Menu01 Cap_P, "Import to FishDataBase", "sb_Main01" End Sub Sub sb_Menu01(Cont_P As String, Cap_P As String, On_Act As String) 'Menu Create submodule   With CommandBars("Worksheet menu bar").Controls(Cont_P)     .Controls.Add(Type:=msoControlButton, Before:=1).Caption = Cap_P     .Controls(Cap_P).OnAction = On_Act   End With End Sub Sub sb_UserForm1Show()   UserForm1.Show End Sub

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

そのような処理に適したオプションボタンがあるにも拘らず なぜ、チェックボックスを使うのか、ん? という感じではありますが、、、 ま、それは置いといて。。。。 提示のコードではCheckBoxのClickイベントが発生し続けるので 質問の動作は当たり前の動作になります。  Private Sub UserForm_Initialize()    CheckBox1.Value = True  ●CheckBox1のClickイベント発生 ▼  Private Sub CheckBox1_Click()    CheckBox1.Value = True  ●CheckBox1のClickイベント発生 ▲ ▼~▲のClickイベントが発生し続けるのでストップしているように見えるわけです。 これは、CheckBox1,2のClickイベントの最初に、 MsgBox "box1"など入れてみれば確認できますね。 で、CheckBoxのClickイベントを止めてやればいいわけですが、 UserFormには、Application.EnableEventsなどのメソッドがないので 普通はフラグを使ったりしますが、 今回の場合は、Changeイベントの性質を利用してもできます。 ●Changeイベントを使う方法 '-------------------------------------------- Private Sub UserForm_Initialize()    CheckBox1.Value = True End Sub '------------------------------- Private Sub CheckBox1_Change()    CheckBox2.Value = Not CheckBox1.Value End Sub '------------------------------- Private Sub CheckBox2_Change()    CheckBox1.Value = Not CheckBox2.Value End Sub '--------------------------------------------- UserForm_Initializeでチェックするのは、CheckBox1だけで十分だと思います。   ●また、フラグを使う方法は、Clickイベントの部分で   If Flag = True Then Exit Sub などとしてClickイベントの処理をジャンプする方法です。 これはご自分で考えてみてください。 最初でも言いましたが、 今回のような処理は、オプションボタンを使うべきかと。 ま、いろいろ理由はあるのでしょうが。。。 以上です。

believe_me
質問者

お礼

回答ありがとうございます。 オプションボタンを使わなかったのは、添付写真には写っていませんがもう一組選択箇所があって、オプションボタンが使えないと思い、チェックボタンにしたわけです。 皆様のご指摘の後、調べた結果フレームを使えば何組でもオプションボタンを使えることが先ほどわかりました。 どうもお騒がせしました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

チェックボックスを使って、 オプションボタンと同様の動作を実現したい というところでしょうか? ExcelVBA は、あまり得意ではないのですが 力まかせにやってみました。 もっと良い方法があるかもしれません。 Private Sub UserForm_Initialize()   CheckBox1.Value = True   CheckBox2.Value = False End Sub Private Sub CheckBox1_AfterUpdate()   If Not Me.CheckBox1 Then     Me.CheckBox1 = True   Else     Me.CheckBox2 = False   End If End Sub Private Sub CheckBox2_AfterUpdate()   If Not Me.CheckBox1 Then     Me.CheckBox2 = True   Else     Me.CheckBox1 = False   End If End Sub

believe_me
質問者

お礼

回答ありがとうございます。 オプションボタンを使わなかったのは、添付写真には写っていませんがもう一組選択箇所があって、オプションボタンが使えないと思い、チェックボタンにしたわけです。 皆様のご指摘の後、調べた結果フレームを使えば何組でもオプションボタンを使えることが先ほどわかりました。 どうもお騒がせしました。

すると、全ての回答が全文表示されます。

関連するQ&A