Excel 将事件侦听器添加到过程生成的控件中,而不使用用户窗体

Excel 将事件侦听器添加到过程生成的控件中,而不使用用户窗体,excel,vba,commandbutton,Excel,Vba,Commandbutton,我有一个电子表格,并在列的每个单元格中创建ListBox控件。我试图捕获它们所选的内容,但在运行时生成的控件上捕获事件的示例都涉及使用用户表单,而我没有使用用户表单。我是VBA新手,如何从中复制下面的代码 生成控件的代码是 Public Sub CreateListbox() Dim rCell As Range Dim rRng As Range Set rRng = ActiveSheet.Range("AA3:AA45") For Each rCell In r

我有一个电子表格,并在列的每个单元格中创建ListBox控件。我试图捕获它们所选的内容,但在运行时生成的控件上捕获事件的示例都涉及使用用户表单,而我没有使用用户表单。我是VBA新手,如何从中复制下面的代码

生成控件的代码是

Public Sub CreateListbox()
 Dim rCell As Range
    Dim rRng As Range
    Set rRng = ActiveSheet.Range("AA3:AA45")
    For Each rCell In rRng.Cells
        Set oLISTBOX = ActiveSheet.OLEObjects.Add(classtype:="Forms.ListBox.1")
With oLISTBOX
        .Object.IntegralHeight = False
        .Object.Font.Size = 11
        .Top = rCell.Top
        .Left = rCell.Left
        .Width = rCell.Width
        .Height = rCell.Height
        .LinkedCell = rCell.Address
        .ListFillRange = "ValSocDeterm."
        .Object.ColumnCount = 3
        .MultiSelect = 1
    End With

    Next rCell
End Sub

我基本上想用在表单上创建按钮的示例代码来创建表单上的列表框

类似于类模块,称为clsCustomListBox,包含以下代码

Option Explicit

Private WithEvents custom As MSForms.ListBox

Public Function initialise(cbConvert As MSForms.ListBox) As Boolean
    Set custom = cbConvert
End Function

Private Sub custom_Click()
    MsgBox "Clicked"
End Sub
然后是一个标准模块,用于遍历工作表并获取所有列表框,或者您可以在代码添加列表框时将其添加到集合中

Option Explicit

Private cls_CustomListBox As clsCustomListbox
Public colCustomListboxCollection As Collection

Public Sub GetListBoxes()

Dim c As OLEObject

Set colCustomListboxCollection = New Collection

For Each c In Worksheets("Sheet1").OLEObjects

    If TypeOf c.Object Is MSForms.ListBox Then
        Set cls_CustomListBox = New clsCustomListbox
        cls_CustomCombo.initialise c.Object
        colCustomListboxCollection.Add c
    End If

Next c

End Sub
我在工作中还没有完全测试过,但这就是我的出发点


希望能有所帮助。

您需要在选项中信任VBA模型,以便以添加代码的方式进行操作。可以使用事件下沉来执行此操作,然后将新控件添加到类似控件的集合中。您可以使用一个类,比如-->选项Explicit Private with events listBox_Custom作为MSForms.listBox Private Sub listBox_Custom_Change()End subtanks,但是您能提供一个更清晰的解释吗,就像我说的,我只是在学习VBA
Option Explicit

Private cls_CustomListBox As clsCustomListbox
Public colCustomListboxCollection As Collection

Public Sub GetListBoxes()

Dim c As OLEObject

Set colCustomListboxCollection = New Collection

For Each c In Worksheets("Sheet1").OLEObjects

    If TypeOf c.Object Is MSForms.ListBox Then
        Set cls_CustomListBox = New clsCustomListbox
        cls_CustomCombo.initialise c.Object
        colCustomListboxCollection.Add c
    End If

Next c

End Sub