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

时间:2011-06-17 18:41:32

标签: excel class vba

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

我编写了以下代码,但是我遇到了运行时错误(459) - “对象或类不支持事件设置”

在名为clsPDRinput的班级中,我有以下内容:

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

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

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

我不确定导致此错误的原因。虽然我有一个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() 公开
  3. 第1点和第2点与excel中的对象模型一致。因此,当我尝试将ComboBox分配给我的班级时,我收到了错误(请参阅原始帖子),因为ComboBox不支持GotFocus()LostFocus个事件

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

2 个答案:

答案 0 :(得分:4)

以下适用于我。您的代码存在一些问题,并且组合框没有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

答案 1 :(得分:0)

<强>更新

我过于专注于编写代码,有人很好地指出下面的答案是bad juju。所以不要使用。它确实编译,但不是一个好的答案。


我通过更改以下声明来重现您的错误并修复:

Public WithEvents inputObj As OLEObject

到此:

Public inputObj As New OLEObject

当然,这是一种不同类型的声明,因此我不确定它是否适合您。它确实删除了异常。

我还要注意,如果你没有Option Explicit set,你应该。您的代码中有一些未声明的变量。我的猜测是你可能在发布问题之前修改了代码。

确保。