【VBA】ユーザーフォームのコントロールを名前(文字列)で操作する方法

目次

はじめに

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

実行前の準備

  1. DataForm という名前のユーザーフォームを作成します。
  2. その上に「ラベル」コントロールを配置し、プロパティウィンドウで (Name)StatusLabel に変更しておきます。

コードの解説

formToShow.Controls(targetControlName)

このコードが、この記事の核心部分です。

  • formToShow.Controls: DataFormControls コレクションにアクセスしています。このコレクションには、フォーム上に配置された全てのコントロール(ボタン、ラベル、テキストボックス等)が含まれています。
  • (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 のように記述すれば、複数のテキストボックスを効率的に一括処理できます。

このテクニックをマスターすると、ユーザーフォームで実装できることの幅が大きく広がります。ぜひ、より高度なツール開発に挑戦してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次