将 Sub 分配给动态定义的 CommandButton
Assign Sub to dynamically defined CommandButton
我正在尝试定义一个用户窗体,它根据用户创建多个列表框。在该过程中,我定义了命令按钮,允许用户将项目从一个列表框转移到另一个列表框。
命令按钮定义如下(在一个循环内 - 请参阅下面的 i):
With .Designer.Controls.Add("Forms.CommandButton.1", Name:="GroupButton1" & i)
.Top = 40 * (i - 1) + 10
.Left = 100
.Width = 20
.Height = 10
.BackColor = RGB(220, 105, 0)
.Caption = ">>"
.Font.Size = 8
.OnClick = "GroupButton1" & i & "_Click"
End With
我尝试使用.OnClick 和.OnAction 来分配相应的_Click sub,但没有成功。任何指导将不胜感激。
命令按钮没有 OnClick
属性,这就是它不起作用的原因。使用设计器手动构建控件的方式不同于动态构建控件的方式。
这个问题真的很烦人,幸好我最终解决了它,但是我不会走这条路,因为情况很难控制,代码也比较复杂。如果您使用工作表作为控制按钮的基础,那么创建宏并为其分配宏会容易得多,在这种情况下您只需使用 .OnAction
属性。
所以请仔细遵循这些说明:
1- 创建一个用户窗体,其中将动态构建按钮和其他控件。在我的示例中,它的名称是 UserForm1
。右键单击它,选择 view code
并准确粘贴此代码。
Option Explicit
Dim btnArray() As New Class1
Sub CreateButton()
Dim i As Long
Dim cmdBtn As MSForms.CommandButton
i = 1
For i = 1 To 3
Set cmdBtn = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & i)
With cmdBtn
.Name = "GroupButton1" & i
.Top = 40 * (i - 1) + 10
.Left = 100
.Width = 50 'I changed it
.Height = 25 'I changed it
.Caption = ">>"
.Font.Size = 8
ReDim Preserve btnArray(1 To i)
Set btnArray(i).btnEvents = cmdBtn
End With
Next
End Sub
Private Sub UserForm_Initialize()
Call Me.CreateButton
End Sub
2- 创建一个 Class Module
(class 模块而不是常规模块),默认情况下它的名称应该是 Class1
。你可以改变它,但我没有。将以下代码粘贴到该模块中:
Public WithEvents btnEvents As MSForms.CommandButton
Private Sub btnEvents_click()
MsgBox "It worked"
End Sub
3- 现在您可以通过不同的方式调用 UserForm1
。我更喜欢从常规模块中显式调用它们,因此创建一个常规模块,它的名称无关紧要,但默认情况下它将是 Module1
,将此代码粘贴到那里,当你 运行 它时,一切都应该完美运行:
Sub main()
UserForm1.Show
End Sub
我正在尝试定义一个用户窗体,它根据用户创建多个列表框。在该过程中,我定义了命令按钮,允许用户将项目从一个列表框转移到另一个列表框。 命令按钮定义如下(在一个循环内 - 请参阅下面的 i):
With .Designer.Controls.Add("Forms.CommandButton.1", Name:="GroupButton1" & i)
.Top = 40 * (i - 1) + 10
.Left = 100
.Width = 20
.Height = 10
.BackColor = RGB(220, 105, 0)
.Caption = ">>"
.Font.Size = 8
.OnClick = "GroupButton1" & i & "_Click"
End With
我尝试使用.OnClick 和.OnAction 来分配相应的_Click sub,但没有成功。任何指导将不胜感激。
命令按钮没有 OnClick
属性,这就是它不起作用的原因。使用设计器手动构建控件的方式不同于动态构建控件的方式。
这个问题真的很烦人,幸好我最终解决了它,但是我不会走这条路,因为情况很难控制,代码也比较复杂。如果您使用工作表作为控制按钮的基础,那么创建宏并为其分配宏会容易得多,在这种情况下您只需使用 .OnAction
属性。
所以请仔细遵循这些说明:
1- 创建一个用户窗体,其中将动态构建按钮和其他控件。在我的示例中,它的名称是 UserForm1
。右键单击它,选择 view code
并准确粘贴此代码。
Option Explicit
Dim btnArray() As New Class1
Sub CreateButton()
Dim i As Long
Dim cmdBtn As MSForms.CommandButton
i = 1
For i = 1 To 3
Set cmdBtn = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & i)
With cmdBtn
.Name = "GroupButton1" & i
.Top = 40 * (i - 1) + 10
.Left = 100
.Width = 50 'I changed it
.Height = 25 'I changed it
.Caption = ">>"
.Font.Size = 8
ReDim Preserve btnArray(1 To i)
Set btnArray(i).btnEvents = cmdBtn
End With
Next
End Sub
Private Sub UserForm_Initialize()
Call Me.CreateButton
End Sub
2- 创建一个 Class Module
(class 模块而不是常规模块),默认情况下它的名称应该是 Class1
。你可以改变它,但我没有。将以下代码粘贴到该模块中:
Public WithEvents btnEvents As MSForms.CommandButton
Private Sub btnEvents_click()
MsgBox "It worked"
End Sub
3- 现在您可以通过不同的方式调用 UserForm1
。我更喜欢从常规模块中显式调用它们,因此创建一个常规模块,它的名称无关紧要,但默认情况下它将是 Module1
,将此代码粘贴到那里,当你 运行 它时,一切都应该完美运行:
Sub main()
UserForm1.Show
End Sub