如何使用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.ComboBoxreplaceOLEObject ,但是这不解决问题。

任何想法 – 已经search了两个小时,现在空白…

编辑 – 更新我认为这个问题是…

我做了更多的调查,就我所知,问题在哪里。

  1. 如果你声明一个variables为OLEObject (如...inputObj as OLEObject )那么暴露的唯一事件GotFocus()LostFocus()
  2. 如果你声明一个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没有被声明。 我的猜测是你可能在发布你的问题之前修改了代码。

只要确定。