Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用activex控件动态填充excel工作表?_Excel_Vba - Fatal编程技术网

如何使用activex控件动态填充excel工作表?

如何使用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

我需要在工作表上动态放置activex控件,因为userform上的控件太多了

我已经找到了一种方法,使用:

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