如何使用activex控件动态填充excel工作表?
我需要在工作表上动态放置activex控件,因为userform上的控件太多了 我已经找到了一种方法,使用:如何使用activex控件动态填充excel工作表?,excel,vba,Excel,Vba,我需要在工作表上动态放置activex控件,因为userform上的控件太多了 我已经找到了一种方法,使用: Worksheets(1).OLEObjects.Add ClassType:="Forms.ListBox.1" 但是,如何将函数/宏分配给与该控件关联的各种事件呢。如果我在运行时动态插入旋转按钮,如何对其事件进行编程。以下是一个示例: Option Explicit Public Sub test() MsgBox "Hello" End Sub Public Sub A
Worksheets(1).OLEObjects.Add ClassType:="Forms.ListBox.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
编辑:
更好的做法是定义一个类来处理所有这些。在那里定义方法等
设置对象属性的示例;首先,在添加时将对象放入变量中,然后在以后处理其属性时引用该变量,例如
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提出的要点-这是一个容易出现错误的问题,您无法简单地进行调试。如果您需要更多的解释,请告诉我。如果您能解释一下,这将是非常有价值的。现在将写一些注释谢谢您的回答,但我有一些疑问。实际上,我设法动态插入activex控件,但使用了其他方法。它会根据情况在工作表上放置几个按钮。有时4个按钮或5个按钮取决于条件。我必须为我的控件实现change和mousemove事件,但我想为每个控件动态地将代码放入这些事件中。在我的情况下,这会起作用吗?一般来说,我上面展示的构造是的。这是您添加事件的工作方式。您需要正确定义您感兴趣的事件类型。我不熟悉mousemove事件,但怀疑可能需要向主机操作系统添加API调用信息。我建议不要使用ActiveX控件,最好使用表单控件。您可以轻松创建这些控件,并将过程设置为运行(
ctrl.OnAction=“MyProc”
)或将其删除(ctrl.OnAction=”“
)。使用ActiveX控件是一个混乱的过程,因为您必须以丑陋的方式创建代码,并且在这个过程中无法避免闪烁。
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