ユーザーフォームやフレームに動的にコントロールを追加する(Addメソッド)
Visual Basic Editor の画面からユーザーフォームに色々なコントロールを設置しておくことができますが、プログラムの中で必要なコントロールのオブジェクトを動的に作成しユーザーフォームに追加することもできます。ここでは Excel VBA を使ってユーザーフォームに動的にコントロールを追加する方法について解説します。
(Last modified: )
ユーザーフォームに動的にコントロールを追加する
あらかじめ設置することが分かっているコントロールであれば、ユーザーフォームに Visual Basic Editor の画面からコントロールを追加しておくことができます。
今回はユーザーフォームを用意しておき、 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イベント)」を参照されてください。
ユーザーフォームのコントロールが何もないところをダブルクリックしてください。
ユーザーフォームの規定のイベントである Click イベントに対するイベントプロシージャが表示されます。
今回はユーザーフォームの 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
これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
ユーザーフォームが表示されました。テキストボックスとコマンドボタンが 1 つずつユーザーフォームに追加されていることが確認できます。
このように 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
これでコードの記述は完了です。では実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
ユーザーフォームが表示されました。ユーザーフォームにはフレームが追加され、追加されたフレームにはオプションボタンが 2 つ追加されています。
フレームに追加されたオプションボタンは同じグループとなるのでいずれか一つしか選択できなくなります。
-- --
Excel VBA を使ってユーザーフォームに動的にコントロールを追加する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。