如何使用excel 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
太generics,并不是每个OLEObject
支持GotFocus()
事件,这就是为什么代码给错误信息?
我试图用MSForms.ComboBox
replaceOLEObject
,但是这不解决问题。
任何想法 – 已经search了两个小时,现在空白…
编辑 – 更新我认为这个问题是…
我做了更多的调查,就我所知,问题在哪里。
- 如果你声明一个variables为
OLEObject
(如...inputObj as OLEObject
)那么暴露的唯一事件是GotFocus()
和LostFocus()
。 - 如果你声明一个variables为
MSForms.ComboBox
(如...inputObj as MSForms.ComboBox
),那么各种事件暴露(例如Change()
,Click()
,DblClick()
), 但事件GotFocus()
和LostFocus()
没有暴露
第1点和第2点与excel中的对象模型一致。 因此,当我尝试将ComboBox
分配给我的类时,由于ComboBox
不支持GotFocus()
和LostFocus
事件,因此出现错误(请参阅原始文章)。
现在的难题。 如果我将ComboBox添加到工作表(使用Control ToolBox
),并双击该ComboBox以获取代码,则会显示所有事件,包括GotFocus()
和LostFocus()
!
下面的作品适合我。 你的代码有几个问题,combobox没有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
更新
我太专注于编译代码,有人很好地指出,下面的答案是不好的juju 。 所以不要使用。 它编译,但不是一个好的答案。
我通过更改以下声明来重现您的错误并进行修复:
Public WithEvents inputObj As OLEObject
对此:
Public inputObj As New OLEObject
当然,这是一种不同types的声明,所以我不确定它是否适用于您。 它确实删除了这个exception。
我还想指出,如果你没有Option Explicit设置,你应该。 你的代码中有一些variables没有被声明。 我的猜测是你可能在发布你的问题之前修改了代码。
只要确定。