ユーザーフォームやフレームに動的にコントロールを追加する(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
プログラミングや開発環境構築の解説サイトを運営しています。