はじめに
VBAのユーザーフォームで、ラベルの文言やテキストボックスの値をコードで変更する場合、通常は Label1.Caption = "テキスト"
のように、コントロールの名前を直接記述します。しかし、この方法では、操作したいコントロールの名前がプログラムの実行時まで分からない、といった動的な処理に対応できません。
例えば、「TextBox1
から TextBox10
までをループで一括クリアしたい」という場合、コントロールの名前を文字列として扱い、Controls
コレクションを通じてアクセスする方法が非常に有効です。
この記事では、ユーザーフォーム上のコントロールを、その名前(文字列)を使って間接的に操作する、応用的で便利なテクニックを解説します。
名前でコントロールを操作するVBAサンプルコード
このマクロは、DataForm
という名前のユーザーフォーム上にある StatusLabel
という名前のラベルコントロールの Caption
(表示テキスト)を書き換えます。
このコードは、ユーザーフォームのモジュール内、または標準モジュールからフォームを指定して実行できます。ここでは、フォームを表示するマクロの中で、表示直前にプロパティを設定する例をご紹介します。
標準モジュールの完成コード
' フォームのコントロールを名前で指定してプロパティを変更する
Sub ShowFormAndSetControl()
Dim formToShow As Object
Dim targetControlName As String
' 対象のフォームとコントロール名を設定
Set formToShow = DataForm
targetControlName = "StatusLabel"
' --- Controlsコレクションを使い、名前でコントロールを操作 ---
' コントロールが存在するか確認
On Error Resume Next
Dim ctrl As Object
Set ctrl = formToShow.Controls(targetControlName)
On Error GoTo 0
If Not ctrl Is Nothing Then
' コントロールのプロパティを変更
formToShow.Controls(targetControlName).Caption = "準備完了"
formToShow.Controls(targetControlName).ForeColor = RGB(0, 128, 0) '深緑
Else
MsgBox "指定されたコントロール「" & targetControlName & "」は見つかりません。", vbCritical
Exit Sub
End If
' フォームを表示
formToShow.Show
End Sub
実行前の準備
DataForm
という名前のユーザーフォームを作成します。- その上に「ラベル」コントロールを配置し、プロパティウィンドウで
(Name)
をStatusLabel
に変更しておきます。
コードの解説
formToShow.Controls(targetControlName)
このコードが、この記事の核心部分です。
formToShow.Controls
:DataForm
のControls
コレクションにアクセスしています。このコレクションには、フォーム上に配置された全てのコントロール(ボタン、ラベル、テキストボックス等)が含まれています。(targetControlName)
:Controls
コレクションの中から、引数で渡された文字列(この例では"StatusLabel"
)と一致するName
プロパティを持つコントロールを探し出します。
これにより、formToShow.Controls("StatusLabel")
は StatusLabel
というコントロールそのものを指すことになります。そのため、その後ろに .Caption
や .ForeColor
といったプロパティを繋げて、直接操作するのと同じように値を変更できるのです。
インデックス番号による指定
Controls
コレクションは、Controls(0)
のようにインデックス番号でコントロールを指定することも可能です。これは、フォームにコントロールが追加された順番(TabIndexとは異なる)になりますが、コントロールの追加や削除で順番が変わりやすく不安定なため、通常は名前で指定する方が確実です。
まとめ
今回は、ユーザーフォームのコントロールを、その名前(文字列)を使って動的に操作する方法を解説しました。
- フォームの
Controls("コントロール名")
という構文で、特定のコントロールにアクセスできる。 - この方法を使うと、ループ処理で複数のコントロールを扱ったり、変数を使って操作対象のコントロールを切り替えたりすることが可能になる。
例えば、For i = 1 To 10 ... Controls("TextBox" & i).Value = "" ... Next
のように記述すれば、複数のテキストボックスを効率的に一括処理できます。
このテクニックをマスターすると、ユーザーフォームで実装できることの幅が大きく広がります。ぜひ、より高度なツール開発に挑戦してみてください。