分配上单击VBA函数来动态创建的按钮上的Excel用户窗体
我在Excel用户窗体使用下面的代码创建一个按钮动态:分配上单击VBA函数来动态创建的按钮上的Excel用户窗体
With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
.Caption = "XYZ"
.name = "AButton"
.Font.Bold = True
.ForeColor = &HFF&
... blah blah blah
End With
我想一个函数分配给运行时这些按钮被点击,但我找不到一个简单的方法来做到这一点,因为没有属性作为按钮本身的一部分。
有没有办法做到这一点使用上述成语?我应该以不同的方式来讨论这件事吗?
你需要动态创建代码/事件处理程序为每个按钮。
这需要一点做的 - 在这里看到:http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html
一个更好的办法可能是创建一批在窗体上按钮(很多,你认为你需要)的时间提前。创建事件处理程序代码。首先让它们全部隐藏起来。
那么当你的窗体打开,你可以动态地改变按钮标题,使其可见和移动它们。您最初创建的事件代码将按照预期链接到激活的按钮。
我一直在寻找这一点。似乎你可以通过使用onClick属性来运行一个宏:
Command1.OnClick = "Macro1"
然后通过运行所需函数的名称创建一个宏。 这是我的破解,直到我找到更好的东西。
对于excel用户窗体控件,assingin“onClick”导致...“对象不支持此属性或方法” – PravyNandas 2017-07-24 09:59:50
在下面的代码应该是工作
Dim NewButton As OLEObject
Dim CodeModule As Object
Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
Sub Oval1_Click()
file = ActiveWorkbook.Name
Set Output = Workbooks.Add()
ActiveWorkbook.SaveAs Filename:="Try.xls"
Sheets(1).Select
ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
ActiveSheet.Buttons.Text = "DATA"
ActiveSheet.Shapes("Button 1").Select
Selection.OnAction = "Book1.xlsm!data_Click"
End Sub
Sub data_Click()
MsgBox "you have clicked me"
ActiveSheet.DrawingObjects.Delete
End Sub
我的意思是添加到用户窗体的按钮,而不是工作表 – notnot 2010-05-14 15:13:50
要在Excel形式动态地添加的控制事件;您需要首先将事件添加到类模块中。在我的例子,我要添加一个名为另clsTest类模块有一个事件,btn_click()
'#### CLASS NAMED clsTEST
Public WithEvents btn As MSForms.CommandButton
Public frm As UserForm
Dim iCount As Long
Private Sub btn_Click()
iCount = IIf(iCount < 1, 1, iCount + 1)
btn.Caption = "Count " & Str(iCount)
End Sub
'### END CLASS
正如你所看到的,这会做的唯一事情是设置标题上的按钮,然后数你点击它的次数。 接下来,在表单代码输入以下内容:
Dim mColButtons As New Collection '## SET A NEW COLLECTION
Private Sub UserForm_Activate()
'
Dim btnEvent As clsTEST
Dim ctl As MSForms.Control
'
Set ctl = Me.Controls.Add("Forms.CommandButton.1")
'
With ctl
.Caption = "XYZ"
.Name = "AButton"
END With
'
Set btnEvent = new clsTEST
Set btnEvent.btn = ctl
set btnEvent.frm = Me
'
mColButtons.add btnEvent
'End Sub
当您激活形式,它会创建一个按钮。每次点击按钮时,标题都会改变。
这对我来说很好。我想知道是否有一种方法可以向班级发送变量。例如,如果我要将.caption更改为我发送的任何内容。 Private Sub btn_Click(var1 As String) 我试过这个,但它导致“对象不支持这个属性或方法” – JahKnows 2017-02-17 16:03:38
聪明的主意!看来VBA中的所有内容都需要很聪明。 – notnot 2009-02-19 20:22:56