0

これを使用して、コード内からコマンドボタンを作成しました。

Public Sub createForm(label As String)
Dim control As control
Dim controlbutton As CommandButton

'set control for the first label on the page
Set control = UserForm1.Controls.Add("Forms.Label.1", "Text", True)
With control
    .Caption = label
    .Left = 25
    .Top = 10
    .Height = 20
    .Width = 200
    .Visible = True
End With

'set control for the enter button
Set controlbutton = UserForm1.Controls.Add("Forms.CommandButton.1", "Enter", True)
With controlbutton
    .Caption = "Enter"
    .Name = "Enter"
    .Left = 45
    .Top = 80
    .Height = 30
    .Width = 50
    .Visible = True
End With

'set control for the cancel button
Set controlbutton = UserForm1.Controls.Add("Forms.CommandButton.1", "CancelButton", True)
    With controlbutton
        .Caption = "Cancel"
        .Left = 105
        .Top = 80
        .Height = 30
        .Width = 50
        .Visible = True
    End With


    'UserForm1.Controls.Add "Forms.TextBox.1", "Name1", True
    'UserForm1!Name1.Text = "Hi"
End Sub

しかし、ボタンがクリックされたときに何かができるようにしたいと思います。これは私がしました:

Sub CancelButton_Click()

    UserForm1.Name = "Closed"

End Sub

イベントが実行されなかったため、これは機能しませんでした。これらはすべてフォームコード内で実行されます。初期化などがありますが、これはカスタム関数です。ボタンを作成して表示しますが、クリックしたときにイベントを実行できません。

キャンセルボタンをクリックするとフォームが閉じます。

4

1 に答える 1

3

まず、コードをの中に入れる必要があります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がそれに「対話」できるようにしました。

于 2013-03-21T14:04:13.727 に答える