I have ten drop down menus on a worksheet each of which should respond the same to the
I have written the following code but I get a run time error (459) – “Object or class does not support the set if events”
In a class called
clsPDRinput I have the following:
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
I am then running the following code which is producing the error:
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
I am not sure what is causing this error. One though I had is that
OLEObject is too generic and not every
OLEObject supports the
GotFocus() event and that is why the code is giving the error message?
I have tried replacing
MSForms.ComboBox but that doesn’t resolve issue.
Any ideas – have googled for two hours now and come up blank…
EDIT – Update on what I think the issue is…
I did more investigating and here is what the issue is as far as I can tell.
- If you declare a variable as
...inputObj as OLEObject) then the only events exposed are
- If you declare a variable as
...inputObj as MSForms.ComboBox) then a variety of events are exposed (e.g.
DblClick()) but the events
LostFocus()are not exposed
Points 1 and 2 are consistent with the object model in excel. As a result, when I try to assign a
ComboBox to my class I get an error (see original post) as the
ComboBox does not support the
Now for the puzzle. If I add a ComboBox onto a worksheet (using
Control ToolBox) and I double click that ComboBox to get to the code behind then all events are exposed, including
The below works for me. There were a couple of problem with your code, and comboboxes don’t have a GotFocus event, so you’ll have to use a different one. The collection needs to be a global in the module, noty part of the class. I couldn’t get this to work using the generic “OLEobject” approach (same error you got).
Answer：in the class Public WithEvents inputObj As MSForms.ComboBox Private Sub inputObj_Change() MsgBox "Change!" End Sub '
Answer：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
I was too focused in making the code compile and someone was nice enough to point out that the answer below is bad juju. So do not use. It does compile, but not a good answer.
I reproduced your error and fixed by changing the following declaration:
Public WithEvents inputObj As OLEObject
Public inputObj As New OLEObject
Of course, this is a different type of declaration so I’m not sure if it will work for you. It does remove the exception.
I’d also like to note that if you don’t have Option Explicit set, you should. There are some variables in your code that are not declared. My guess is that you perhaps modified the code before posting your question.
Just making sure.