即効テクニック |
UserFormにオプションボタン(OptionButton)を配置したとき、どのオプションボタンがオンになっているかを判定するには次のようにします。 なお、ここでは3つのオプションボタンが配置されていて、コマンドボタン(CommandButton)のクリックで判定するものとします。
Private Sub CommandButton1_Click() Dim buf As String If OptionButton1 Then buf = OptionButton1.Caption Else If OptionButton2 Then buf = OptionButton2.Caption Else buf = OptionButton3.Caption End If End If MsgBox buf & " が選択されています" End Subあるいは次のようにSelect Caseを使う手もあります。Private Sub CommandButton1_Click() Dim buf As String Select Case True Case OptionButton1 buf = OptionButton1.Caption Case OptionButton2 buf = OptionButton2.Caption Case OptionButton3 buf = OptionButton3.Caption End Select MsgBox buf & " が選択されています" End Sub判定すべきオプションボタンが3つ程度でしたら問題ありませんが、もっと多くの、たとえば数十個のオプションボタンではどうでしょう。 言語版のVisual Basic 6.0にはこうしたケースで便利なコントロール配列という機能がありましたが、残念ながらVBAではコントロール配列を使えません。
こんなときは、Controlsコレクションを使いましょう。 Controlsコレクションは、UserForm上に配置されたすべてのコントロールをメンバーに持つコレクションです。 次のコードは、UserFormに配置されたすべてのコントロール名をイミディエイトウィンドウに出力します。
Private Sub CommandButton1_Click() Dim c As Object For Each c In Controls Debug.Print c.Name Next c End Sub実行結果は、 OptionButton1 OptionButton2 OptionButton3 CommandButton1 のようになります。 また、コレクション内のメンバーは、次のように操作できます。Private Sub CommandButton1_Click() If Controls("OptionButton1").Value = True Then MsgBox "OptionButton1が選択されています" Else MsgBox "OptionButton1が選択されていません" End If End Subこれを応用すると、オプションボタンが数十個配置されていたとしても、次のように判定することが可能です。Private Sub CommandButton1_Click() Dim I As Long, buf As String For I = 1 To 20 If Controls("OptionButton" & i).Value = True Then buf = Controls("OptionButton" & i).Name Exit For End If Next I MsgBox buf & " が選択されています" End Sub上記のコードは、オプションボタンが20個配置されているケースですが、次のようにFor Eachステートメントで、すべてのオプションボタンを判定することもできますね。Private Sub CommandButton1_Click() Dim c As Object, buf As String For Each c In Controls If c.Value = True And InStr(c.Name, "OptionButton") > 0 Then buf = c.Name Exit For End If Next c MsgBox buf & " が選択されています" End Sub