• ベストアンサー

エクセルVBA フォーム内のコマンドボタンを有効にする

お世話になります。 少々わかりにくいのですが、言葉で説明します。 エクセルVBAで、フォームを作成します。 UserForm1にFrameが2つあり、OptionButtonがそれぞれ2つずつフレームに入っています。(つまり、4つ中2つ選択する必要がある) フォームが読み込まれた時点ではCommandButton.Enebled=Falseにしておいて、フレーム内のオプションボタンがそれぞれ1つずつ選択された場合に初めてCommandButton.Enebled=trueになるようにしたいと思いますが、どのように記述したら実現されるのでしょうか。 わかりにくい説明でしたが、宜しくお願いします。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.3

例えば、ユーザフォームがアクティブになった時に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)

noname#140971
noname#140971
回答No.4

X Me.CommandButton1.Enabled = Ctl.Value O Me.CommandButton1.Enabled = True

sakamocchan
質問者

お礼

ご回答ありがとうございます。 これはまた全然思いつかなかった解答で勉強になりました。 フレームが二つあるので、 For Each Ctl In Me.Frame1.Controls の様にして判定し、フレーム両方でCtl.Value=Trueの時実行できるようにして、目標を実現できました。 ありがとうございましたm(__)m

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

#01です >ただ、確かに長いですね… OptionButtonがClickされたタイミングでCommandButtonの操作をするのですから、OptionButtonの数だけSub~End Subを書かなければならないのは当然ではないでしょうか 1つのSub~End Subでは実現できませんよ

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

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

sakamocchan
質問者

お礼

早速のご回答ありがとうございます^^ 確かに上記コードで動きます。ありがとうございましたm(__)m ただ、確かに長いですね…ボタンが少ないので、これで済みますが、多いと大変なことになりそうです>< こういう動作というのはスマートに書く方法がないのでしょうか? 結構ありがちな動作かと思ったのですが…orz