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

时间:2018-05-15 04:16:07

标签: excel vba

我有一个要求,我必须在我的工作表上动态放置activex控件,因为有太多的控件要放在userform上。

我已经找到了一种方法:

Worksheets(1).OLEObjects.Add ClassType:="Forms.ListBox.1"

但是如何将函数/宏分配给与该控件关联的各种事件。例如。如果我在运行时动态插入旋转按钮,可以如何编程其事件。

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关联的子(宏)。

目的:

根据您的问题,据我了解,您想要

  1. 以编程方式添加ActiveX对象
  2. 以编程方式将事件添加到此对象
  3. 1。添加对象

    .OLEObjects.Add部分添加了命令按钮。

    2。添加事件

    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容易出错,你无法简单地调试。