我在工作表上有十個下拉菜單,每個下拉菜單對GotFocus()
事件都應該有相同的響應。如何使用excel vba將事件分配給多個對象?
我寫了下面的代碼,但我得到一個運行時錯誤(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()
事件,這就是爲什麼代碼給出的錯誤信息?
我試過用MSForms.ComboBox
替換OLEObject
,但這並不能解決問題。
任何想法 - 現在用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
事件,我得到一個錯誤(請參閱原文)。
現在的難題。如果我在工作表上添加一個組合框(使用Control ToolBox
),然後雙擊該組合框以查看代碼,則會顯示所有事件,包括GotFocus()
和LostFocus()
!
'For Each myObj' ...'Next inputObj' is inconsistent and would not compile,I think。這是你的實際代碼嗎? –
另外,'Dim tbCollection As Collection'在你的類中,但是你可以在'Sub InitializePDRInput'中使用'tbCollection',我假設它是在一個模塊中。這裏發生了什麼? –
@ Jean-Francois Corbett - 關於你的第一點,這是削減版本的代碼。對於你指出的每個問題,只是一個錯字(我會編輯這篇文章)。至於第2點,再次,錯字 - 'Dim tbCollection ...'在模塊 –