まず、コードをの中に入れる必要がありますUserForm
。次に、すべてのボタンクリックイベントを処理するクラスを追加する必要があります。「vbauserformaddcontrolsruntime」を検索すると、ここSOでさえ、いくつかの良い答えが見つかります。特定の状況に対して行うことは次のとおりです。
最初にVBEに、新しいものを挿入しClass module
て「clsButton 」と呼びます。このモジュール内に、次のコードを追加します。
Public WithEvents btn As MSForms.CommandButton
Private Sub btn_Click()
If btn.Caption = "Cancel" Then
MsgBox "Cancel"
ElseIf btn.Caption = "Enter" Then
MsgBox "Enter"
End If
End Sub
WithEventsキーワードはbtn
、クリックされたときにイベントをトリガーするオブジェクトを宣言します。Caption
上記のようにプロパティを使用することも、プロパティを使用して、Tag
実際にイベントをトリガーしたボタンを区別することもできます。
次に、変更したコードをユーザーフォームに追加する必要があります。
Public cButton As clsButton
Public coll As New Collection
Private Sub UserForm_Activate()
Dim controlbutton As CommandButton
Set controlbutton = Me.Controls.Add("Forms.CommandButton.1", "Enter", True)
With controlbutton
.Caption = "Enter"
.Name = "Enter"
.Left = 45
.Top = 80
.Height = 30
.Width = 50
.Visible = True
Set cButton = New clsButton
Set cButton.btn = controlbutton
coll.Add cButton
End With
Set controlbutton = Me.Controls.Add("Forms.CommandButton.1", "CancelButton", True)
With controlbutton
.Caption = "Cancel"
.Left = 105
.Top = 80
.Height = 30
.Width = 50
.Visible = True
Set cButton = New clsButton
Set cButton.btn = controlbutton
coll.Add cButton
End With
End Sub
2つのパブリック変数を宣言します。1つは作成したクラスのインスタンスを保持し、コレクションはユーザーフォームの存続期間中クラスインスタンスを保持します。UserForm_Activateイベントでは、ボタンごとにクラスの新しいインスタンスをインスタンス化し、それをコレクションに追加します。
次に、フォームを実行してボタンをクリックします。
ComboBox
編集:これは、ミックスにを追加するというリクエストへの応答です。このコードは、ComboBoxをに追加し、ボタンをclsButton
変更してComboBoxの現在の値を表示します。Enter
Public WithEvents btn As msforms.CommandButton
Public cbo As msforms.ComboBox
Private Sub btn_Click()
If btn.Caption = "Cancel" Then
MsgBox "Cancel"
ElseIf btn.Caption = "Enter" Then
MsgBox cbo.Value
End If
End Sub
フォームコードを変更して、ComboBoxを作成し、いくつかの値を入力して、選択範囲をその項目に設定します。次に、Enter
ボタンが作成されると、cbo
プロパティがそのクラスインスタンスに設定されます。[キャンセル]ボタンのコードは変更されていません。
Public cButton As clsButton
Public coll As New Collection
Private Sub UserForm_Activate()
Dim controlButton As msforms.CommandButton
Dim controlCombo As msforms.ComboBox
Dim i As Long
Set controlCombo = Me.Controls.Add("Forms.ComboBox.1", "Combo", True)
With controlCombo
For i = 1 To 10
.AddItem i
Next i
.ListIndex = 0
End With
Set controlButton = Me.Controls.Add("Forms.CommandButton.1", "Enter", True)
With controlButton
.Caption = "Enter"
.Name = "Enter"
.Left = 45
.Top = 80
.Height = 30
.Width = 50
.Visible = True
Set cButton = New clsButton
Set cButton.btn = controlButton
Set cButton.cbo = controlCombo
coll.Add cButton
End With
Set controlButton = Me.Controls.Add("Forms.CommandButton.1", "CancelButton", True)
With controlButton
.Caption = "Cancel"
.Left = 105
.Top = 80
.Height = 30
.Width = 50
.Visible = True
Set cButton = New clsButton
Set cButton.btn = controlButton
coll.Add cButton
End With
End Sub
したがって、要約すると、ComboBoxをクラスに追加し、Enterボタンのクラスインスタンスを追加して、btnがそれに「対話」できるようにしました。