- ベストアンサー
エクセルVBA フォーム内のコマンドボタンを有効にする
お世話になります。 少々わかりにくいのですが、言葉で説明します。 エクセルVBAで、フォームを作成します。 UserForm1にFrameが2つあり、OptionButtonがそれぞれ2つずつフレームに入っています。(つまり、4つ中2つ選択する必要がある) フォームが読み込まれた時点ではCommandButton.Enebled=Falseにしておいて、フレーム内のオプションボタンがそれぞれ1つずつ選択された場合に初めてCommandButton.Enebled=trueになるようにしたいと思いますが、どのように記述したら実現されるのでしょうか。 わかりにくい説明でしたが、宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
例えば、ユーザフォームがアクティブになった時に0.1秒間隔でチェックする関数を起動。 無限ループにしておき、ボタンが押されたら抜け出ます。 まあ、永遠にチェックする訳じゃないのでメモリの問題は無視できると思います。 Option Explicit Private Sub UserForm_Activate() SetCmdEnabled End Sub Public Sub SetCmdEnabled() Dim Ctl As Control Do Pause 0.1 For Each Ctl In Me.Controls If InStr(1, Ctl.Name, "option", vbTextCompare) > 0 Then If Ctl.Value = True Then Me.CommandButton1.Enabled = Ctl.Value Exit Do End If End If Next Ctl Loop Until (0) End Sub <標準モジュール> Option Explicit Public Sub Pause(ByVal PauseTime As Single) Dim Finish As Single Finish = Timer + PauseTime Do DoEvents Loop Until Timer > Finish End Sub
その他の回答 (3)
X Me.CommandButton1.Enabled = Ctl.Value O Me.CommandButton1.Enabled = True
- zap35
- ベストアンサー率44% (1383/3079)
#01です >ただ、確かに長いですね… OptionButtonがClickされたタイミングでCommandButtonの操作をするのですから、OptionButtonの数だけSub~End Subを書かなければならないのは当然ではないでしょうか 1つのSub~End Subでは実現できませんよ
- zap35
- ベストアンサー率44% (1383/3079)
Frame1にOptionButton1、OptionButton2が、Frame2にOptionButton3、OptionButton4が配置されているとします。 するとマウスで操作する場合はOptionButton1とOptionButton2はどちらか一方しかTrueにできません。OptionButton3とOptionButton4も同様です。従って、以下のようなマクロでもできると思います(泥臭いですが…) Private Sub UserForm_Activate() Me.CommandButton1.Enabled = False End Sub Private Sub OptionButton1_Click() If OptionButton3.Value = True Or OptionButton4.Value = True Then CommandButton1.Enabled = True End If End Sub Private Sub OptionButton2_Click() If OptionButton3.Value = True Or OptionButton4.Value = True Then CommandButton1.Enabled = True End If End Sub Private Sub OptionButton3_Click() If OptionButton1.Value = True Or OptionButton2.Value = True Then CommandButton1.Enabled = True End If End Sub Private Sub OptionButton4_Click() If OptionButton1.Value = True Or OptionButton2.Value = True Then CommandButton1.Enabled = True End If End Sub Private Sub CommandButton1_Click() OptionButton1.Value = False OptionButton2.Value = False OptionButton3.Value = False OptionButton4.Value = False Me.Hide End Sub
お礼
早速のご回答ありがとうございます^^ 確かに上記コードで動きます。ありがとうございましたm(__)m ただ、確かに長いですね…ボタンが少ないので、これで済みますが、多いと大変なことになりそうです>< こういう動作というのはスマートに書く方法がないのでしょうか? 結構ありがちな動作かと思ったのですが…orz
お礼
ご回答ありがとうございます。 これはまた全然思いつかなかった解答で勉強になりました。 フレームが二つあるので、 For Each Ctl In Me.Frame1.Controls の様にして判定し、フレーム両方でCtl.Value=Trueの時実行できるようにして、目標を実現できました。 ありがとうございましたm(__)m