街中で見かけて「グッときた人」の思い出

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

A 回答 (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
    • good
    • 0

X Me.CommandButton1.Enabled = Ctl.Value


O Me.CommandButton1.Enabled = True
    • good
    • 0
この回答へのお礼

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

ありがとうございましたm(__)m

お礼日時:2007/07/27 16:33

#01です


>ただ、確かに長いですね…

OptionButtonがClickされたタイミングでCommandButtonの操作をするのですから、OptionButtonの数だけSub~End Subを書かなければならないのは当然ではないでしょうか

1つのSub~End Subでは実現できませんよ
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/27 12:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!