我试图定义一个用户窗体,该窗体将根据用户创建许多列表框。在该过程中,我定义了命令按钮,该按钮应允许用户将项目从一个列表框移到另一个列表框。 命令按钮的定义如下(在循环内-参见下面的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子项,但没有成功。任何指导将不胜感激。
答案 0 :(得分:1)
命令按钮不具有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
(类模块而不是常规模块),默认情况下其名称应为Class1
。您可以更改它,但我没有。将以下代码粘贴到该模块中:
Public WithEvents btnEvents As MSForms.CommandButton
Private Sub btnEvents_click()
MsgBox "It worked"
End Sub
3-现在您可以用不同的方式呼叫UserForm1
。我更喜欢从常规模块中显式调用它们,因此创建一个常规模块并不重要,但是默认情况下它将是Module1
,将这段代码粘贴到其中,并且在您运行它时,一切应该正常运行: / p>
Sub main()
UserForm1.Show
End Sub