ユーザーフォームやフレームに動的にコントロールを追加する(Addメソッド)

Visual Basic Editor の画面からユーザーフォームに色々なコントロールを設置しておくことができますが、プログラムの中で必要なコントロールのオブジェクトを動的に作成しユーザーフォームに追加することもできます。ここでは Excel VBA を使ってユーザーフォームに動的にコントロールを追加する方法について解説します。

(Last modified: )

ユーザーフォームに動的にコントロールを追加する

あらかじめ設置することが分かっているコントロールであれば、ユーザーフォームに Visual Basic Editor の画面からコントロールを追加しておくことができます。

ユーザーフォームに動的にコントロールを追加する(1)

今回はユーザーフォームを用意しておき、 VBA のプログラムの中で動的にコントロールを追加してみます。プログラムの中でコントロールを追加するには Controls コレクションの Add メソッドを使用します。

Set myCtl = Controls.Add(ProgID [, Name [, Visible ]])

Controls コレクションにはユーザーフォームに追加されているすべてのコントロールが含まれます。このコレクションに Add メソッドを使って新しいコントロールを追加します。戻り値として追加したコントロールのオブジェクトを返します。

Add メソッドの 1 番目の引数に追加するコントロールの種類を文字列の値として指定します。指定可能な値は次の通りです。

コントロールの種類ProgID値
チェックボックスForms.CheckBox.1
コンボボックスForms.ComboBox.1
コマンドボタンForms.CommandButton.1
フレームForms.Frame.1
イメージForms.Image.1
ラベルForms.Label.1
リストボックスForms.ListBox.1
マルチページForms.MultiPage.1
オプションボタンForms.OptionButton.1
スクロールバーForms.ScrollBar.1
スピンボタンForms.SpinButton.1
タブストリップForms.TabStrip.1
テキストボックスForms.TextBox.1
トグルボタンForms.ToggleButton.1

例えばラベルとテキストボックスを 1 つずつユーザーフォームに追加するには次のように記述します。

Controls.Add("Forms.Label.1")
Controls.Add("Forms.TextBox.1")

Add メソッドの省略可能な 2 番目の引数に追加するコントロールのオブジェクト名を指定できます。省略した場合は自動的に名前が設定されます。また省略可能な 3 番目の引数に追加するコントロールを表示するかどうかを「True」または「False」で指定します。デフォルトの値は「True」でコントロールは表示されます。

例えばオブジェクト名を指定してラベルとテキストボックスを 1 つずつユーザーフォームに追加するには次のように記述します。

Controls.Add("Forms.Label.1","Label1")
Controls.Add("Forms.TextBox.1","TextBox1")

追加したコントロールに対して位置やサイズなどのプロパティに対して値を設定します。

Set myLabel = Controls.Add("Forms.Label.1","Label1")
myLabel.Caption = "こんにちは"
サンプルコード

簡単なサンプルで試してみます。ユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャを作成し、その中で動的にコントロールを追加します。

Initialize イベントに対するイベントプロシージャの使い方については「ユーザーフォームを表示する直前に発生するイベント(Initializeイベント)」を参照されてください。

ユーザーフォームのコントロールが何もないところをダブルクリックしてください。

ユーザーフォームに動的にコントロールを追加する(2)

ユーザーフォームの規定のイベントである Click イベントに対するイベントプロシージャが表示されます。

ユーザーフォームに動的にコントロールを追加する(3)

今回はユーザーフォームの Initialize イベントに対するイベントプロシージャ使用するので、コードウィンドウで次のようにイベントプロシージャを追加で記述してください。

Option Explicit

Private Sub UserForm_Initialize()
    Dim myText As Object
    Dim myButton As Object

    Set myText = Controls.Add("Forms.TextBox.1", "TextBox1")
    Set myButton = Controls.Add("Forms.CommandButton.1", "CommandButton1")

    With myText
        .Top = 10
        .Left = 10
        .Height = 20
        .Width = 100
    End With

    With myButton
        .Top = 40
        .Left = 10
        .Height = 20
        .Width = 50
        .Caption = "Click"
    End With
End Sub

ユーザーフォームに動的にコントロールを追加する(4)

これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

ユーザーフォームに動的にコントロールを追加する(5)

ユーザーフォームが表示されました。テキストボックスとコマンドボタンが 1 つずつユーザーフォームに追加されていることが確認できます。

ユーザーフォームに動的にコントロールを追加する(6)

このように Controls コレクションの Add メソッドを使うことでユーザーフォームに動的にコントロールを追加することができます。

フレームに動的にコントロールを追加する

コントロールを追加できるのはユーザーフォームだけではなくフレームにもコントロールを追加することができます。特にフレームではオプションボタンを追加することで、同じフレームに追加されたオプションボタンは同じグループとして排他的に選択が行えるようになります。

例えばフレームのオブジェクト名が Frame1 だった場合に、フレームにオプションボタンを追加するには次のように記述します。

Frame1.Controls.Add("Forms.OptionButton.1")
サンプルコード

簡単なサンプルで試してみます。先ほどのサンプルと同じようにユーザーフォームの Initialize イベントに対するイベントプロシージャを次のように記述してください。

Option Explicit

Private Sub UserForm_Initialize()
    Dim myFrame As Object
    Dim opt1 As Object
    Dim opt2 As Object

    Set myFrame = Controls.Add("Forms.Frame.1")
    
    With myFrame
        .Top = 18
        .Left = 24
        .Width = 160
        .Height = 40
        .Caption = "選択してください"
    End With
    
    Set opt1 = myFrame.Controls.Add("Forms.OptionButton.1")
    Set opt2 = myFrame.Controls.Add("Forms.OptionButton.1")

    With opt1
        .Top = 10
        .Left = 10
        .Height = 20
        .Width = 60
        .Caption = "Yes"
    End With

    With opt2
        .Top = 10
        .Left = 80
        .Height = 20
        .Width = 60
        .Caption = "No"
    End With
End Sub

フレームに動的にコントロールを追加する(1)

フレームに動的にコントロールを追加する(2)

これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

フレームに動的にコントロールを追加する(3)

ユーザーフォームが表示されました。ユーザーフォームにはフレームが追加され、追加されたフレームにはオプションボタンが 2 つ追加されています。

フレームに動的にコントロールを追加する(4)

フレームに追加されたオプションボタンは同じグループとなるのでいずれか一つしか選択できなくなります。

フレームに動的にコントロールを追加する(5)

フレームに動的にコントロールを追加する(6)

-- --

Excel VBA を使ってユーザーフォームに動的にコントロールを追加する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。