我有一个要求,我必须在我的工作表上动态放置activex控件,因为有太多的控件要放在userform上。
我已经找到了一种方法:
Worksheets(1).OLEObjects.Add ClassType:="Forms.ListBox.1"
但是如何将函数/宏分配给与该控件关联的各种事件。例如。如果我在运行时动态插入旋转按钮,可以如何编程其事件。
答案 0 :(得分:1)
以下是一个例子:
Option Explicit
Public Sub test()
MsgBox "Hello"
End Sub
Public Sub AddWorksheetEventCode()
'Tools > references > Microsoft Visual Basic for Applications Extensibility 5.3
'Trust access to VBA model
Dim wb As Workbook
Dim wsNew As Worksheet
Set wb = ThisWorkbook
Dim xPro As VBIDE.VBProject
Dim xCom As VBIDE.VBComponent
Dim xMod As VBIDE.CodeModule
Dim xLine As Long
Set wsNew = wb.Worksheets("Sheet1")
With wsNew
.OLEObjects.Add ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=40, Top:=40, _
Width:=150, Height:=20
'<==== This section adds the event to the project
Set xPro = wb.VBProject
Set xCom = xPro.VBComponents("Sheet1") '<== Defining the location to add
Set xMod = xCom.CodeModule
With xMod
xLine = .CreateEventProc("Click", "CommandButton1") '<== Defining the event to add
xLine = xLine + 1
.InsertLines xLine, "test" '<== Defining the text within the event code i.e. calling the sub
End With
End With
End Sub
在上面我有一个名为test
的标准模块中的现有程序。这是我要与CommandButton关联的子(宏)。
根据您的问题,据我了解,您想要
.OLEObjects.Add
部分添加了命令按钮。
Set xPro = wb.VBProject
向下的部分是构造事件(CommandButton Click)的内容,并使用调用子test
的命令填充该事件。 VBIDE是您以编程方式交互以创建项目组件(如事件)的方式。
VBIDE是定义所有对象的对象库 组成VBProject和Visual Basic编辑器的值。 <子> source 子>
a。定义要添加的位置
Set xCom = xPro.VBComponents("Sheet1")
b。定义要添加的事件
xLine = .CreateEventProc("Click", "CommandButton1")
c。在事件代码中定义文本,即调用sub
.InsertLines xLine, "test"
更好的是定义一个类来处理所有这些。在那里定义方法等。
设置对象属性的示例;首先,在添加时将对象放入变量中,然后在稍后使用其属性时引用该变量,例如
Dim b As Object
With wsNew
Set b = .OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=40, Top:=40, _
Width:=150, Height:=20)
Set xPro = wb.VBProject
Set xCom = xPro.VBComponents("Sheet1")
Set xMod = xCom.CodeModule
With xMod
xLine = .CreateEventProc("Click", "CommandButton1")
xLine = xLine + 1
.InsertLines xLine, "test"
End With
End With
b.Height = 150
<强>警告:强>
了解@MathieuGuindon提出的重要观点 - 这个metaprogramming容易出错,你无法简单地调试。