即効テクニック

ユーザーフォーム関連のテクニック

複数のコントロールを操作する

(Excel 97/2000/2002/2003/2007)

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