我在工作表上有十个下拉菜单,每个菜单都应对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搜索了两个小时,然后空白......
编辑 - 更新我认为的问题......
我做了更多调查,就我所知,这就是问题所在。
OLEObject
(与...inputObj as OLEObject
中一样),那么仅事件会公开GotFocus()
和LostFocus()
。MSForms.ComboBox
(如...inputObj as MSForms.ComboBox
所示),则会公开各种事件(例如Change()
,Click()
,DblClick()
) 但事件GotFocus()
和LostFocus()
不公开第1点和第2点与excel中的对象模型一致。因此,当我尝试将ComboBox
分配给我的班级时,我收到了错误(请参阅原始帖子),因为ComboBox
不支持GotFocus()
和LostFocus
个事件
现在为了拼图。如果我在工作表上添加一个ComboBox(使用Control ToolBox
),我双击该ComboBox以获取后面的代码,然后公开所有事件,包括GotFocus()
和LostFocus()
!
答案 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,你应该。您的代码中有一些未声明的变量。我的猜测是你可能在发布问题之前修改了代码。
确保。