如何使用excel vba为多个对象分配事件?

Ale*_*x P 7 excel vba class

我在工作表上有十个下拉菜单,每个菜单都应对GotFocus()事件做出相同的响应.

我编写了以下代码,但是我得到了一个运行时错误(459) - "对象或类不支持set if if"

在一个名为clsPDRinputI 的课程中,我有以下内容:

Public WithEvents inputObj As OLEObject

Public Property Set myInput(obj As OLEObject)
    Set inputObj = obj
End Property

Public Sub tbPDRInput_GotFocus()
    //Do some stuff...
End Sub
Run Code Online (Sandbox Code Playgroud)

然后我运行以下代码产生错误:

Dim tbCollection As Collection

Public Sub InitializePDRInput()
    Dim myObj As OLEObject
    Dim obj As clsPDRInput

    Set tbCollection = New Collection
        For Each myObj In Worksheets("1. PDR Documentation").OLEObjects
            If TypeName(myObj.Object) = "ComboBox" Then
                Set obj = New clsPDRInput
                Set obj.myInput = myObj <-- **THIS LINE THROWS ERROR**
                tbCollection.Add obj
            End If
        Next myObj
    Set obj = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)

我不确定是什么导致了这个错误.虽然我有一个OLEObject太普通,并不是每个人都OLEObject支持GotFocus()事件,这就是代码给出错误信息的原因?

我尝试过替换OLEObject,MSForms.ComboBox但这并没有解决问题.

任何想法 - 现在用Google搜索了两个小时,然后空白......

编辑 - 更新我认为的问题是......

我做了更多的调查,就我所知,这就是问题所在.

  1. 如果将变量声明为OLEObject(如...inputObj as OLEObject),那么暴露的唯一事件GotFocus()LostFocus().
  2. 如果您声明一个变量MSForms.ComboBox(如...inputObj as MSForms.ComboBox),那么各种各样的事件暴露(例如Change(),Click(),DblClick()),该事件GotFocus(),并LostFocus()暴露

点1和点2与excel中的对象模型一致.因此,当我尝试为ComboBox我的班级分配一个时,我得到一个错误(见原帖),因为ComboBox它不支持GotFocus()LostFocus事件.

现在为了拼图.如果我将一个ComboBox添加到工作表(使用Control ToolBox)中,我双击该ComboBox以获取后面的代码,然后公开所有事件,包括GotFocus()LostFocus()!

Tim*_*ams 3

以下对我有用.您的代码存在一些问题,并且组合框没有GotFocus事件,因此您必须使用不同的代码.集合需要是模块中的全局集合,而不是类的一部分.我无法使用通用的"OLEobject"方法(你得到的相同错误)使用它.

' ### in the class
Public WithEvents inputObj As MSForms.ComboBox

Private Sub inputObj_Change()
    MsgBox "Change!"
End Sub

' ### in a module
Dim tbCollection As Collection

Public Sub InitializePDRInput()
    Dim myObj As OLEObject
    Dim obj As clsPDRInput
    
    Set tbCollection = New Collection
    
    For Each myObj In Worksheets("Sheet1").OLEObjects
        If TypeName(myObj.Object) = "ComboBox" Then
            Set obj = New clsPDRInput
            Set obj.inputObj = myObj.Object
            tbCollection.Add obj
        End If
    Next myObj

End Sub
Run Code Online (Sandbox Code Playgroud)