ユーザーフォームに動的にボタン等を追加する

今までユーザーフォームに配置するコマンドボタン等のコントロール類は ユーザーフォームの作成時に全てきっちり配置していました。

というかその方法しか知らなかった。

ところがコントロール類はユーザーフォームのイベントと連動して動的に、 しかも簡単に配置できる事を知ったのその備忘録。

まずはユーザーフォームを作成してコマンドボタンを1つ設置。

f:id:ExcelLover:20170730155019j:plain

このボタンをクリックする度にコマンドボタンを追加するようにしました。

f:id:ExcelLover:20170730155052j:plain

ユーザーフォームのコードは以下の通り。

Option Explicit
Dim myCol As Collection
Dim myCls As Class1

Private Sub UserForm_Initialize()
    Set myCol = New Collection
End Sub

Private Sub CommandButton0_Click()
    Dim myCmdBtn As MSForms.CommandButton
    
    Set myCmdBtn = UserForm1.Controls.Add("Forms.CommandButton.1", "CommandButton" & myCol.Count + 1, True)
    With myCmdBtn
        .Left = 10
        .Top = 10 + 20 * myCol.Count
        .Width = 150
        .Caption = "CommandButton" & myCol.Count + 1
    End With
    Set myCls = New Class1
    myCls.setBtn myCmdBtn
    myCol.Add myCls
End Sub

この内、動的にボタンを追加しているのは Set myCmdBtn = UserForm1.Controls.Add(“Forms.CommandButton.1”, “CommandButton” & myCol.Count + 1, True) の部分です。 追加したいフォームのコントロールコレクションに、追加したいコントロールを指定してやれば、フォームにコントロールが追加されます。

第1引数のコントロールを指定する文字列は以下の通り。

作成するコントロール 使用する ID
チェック ボックス (CheckBox) Forms.CheckBox.1
コンボ ボックス (ComboBox) Forms.ComboBox.1
コマンド ボタン (CommandButton) Forms.CommandButton.1
フレーム (Frame) Forms.Frame.1
イメージ (Image) Forms.Image.1
ラベル (Label) Forms.Label.1
リスト ボックス (ListBox) Forms.ListBox.1
マルチ ページ (MultiPage) Forms.MultiPage.1
オプション ボタン (OptionButton) Forms.OptionButton.1
スクロール バー (ScrollBar) Forms.ScrollBar.1
スピン ボタン (SpinButton) Forms.SpinButton.1
タブ ストリップ (TabStrip) Forms.TabStrip.1
テキスト ボックス (TextBox) Forms.TextBox.1
トグル ボタン (ToggleButton) Forms.ToggleButton.1

イベントの登録

動的に配置したボタンにはイベントが登録されていないので、このままではただの飾りになってしまう。

クラスを作成して以下のようなコードを登録

クラスを作成して以下のようなコードを登録
Option Explicit
Private WithEvents myCmdBtn As MSForms.CommandButton

Private Sub myCmdBtn_Click()
    MsgBox myCmdBtn.Caption
End Sub

Sub setBtn(Cmdbtn As MSForms.CommandButton)
    Set myCmdBtn = Cmdbtn
End Sub

witheventsキーワードを付けて変数を宣言すると、 変数の型でしているコントロールのイベントを認識することが出来ます。 この場合はCommandbuttonを指定しているのでコマンドボタンの各種イベントを 認識するクラスが作成されます。

参考記事

久しぶりに読み返してみたら、昔は読み飛ばしたであろう今回の内容を発見した。

かんたんプログラミング Excel2003 VBA コントロール・関数編

かんたんプログラミング Excel2003 VBA コントロール・関数編

イベントの共通化について。 thom.hateblo.jp