2012-05-25 205 views
2

我想在Excel VBA中創建一個自定義類來爲OLEObject(工作表上的ActiveX控件)處理事件GotFocus和LostFocus。在Excel VBA中使用自定義類訪問OLEObject事件

定製類clsSheetControl

Dim WithEvents objOLEControl as OLEObject 

    Public Sub Init(oleControl as OLEObject) 
     Set objOLEControl = oleControl 
    End Sub 

高端定製類

調用

Public Sub SetControlHandler() 
    set clsControl = new ClsSheetControl 
    clsControl.Init(Me.OLEObjects("cmdControl1") 
End Sub 

當我在下拉列表中選擇的objOLEControl,我能然而,自定義類模塊中創建「的GotFocus」和「引發LostFocus」,當行

Set objOLEControl = oleControl 

在自定義類中遇到,我得到的錯誤「459:對象或類不支持這組事件」。

我試過尋找答案,但大多數結果處理訪問OLEObject中的實際控制對象,但這不是我在這裏要做的。

任何人都可以幫忙嗎?

編輯

這不工作表上的工作,要麼

工作表

Dim WithEvents objCtrl As OLEObject 
Dim WithEvents chkCtrl As MSForms.CheckBox 

Private Sub Worksheet_Activate() 
    Set chkCtrl = Me.OLEObjects("chkControl").Object 
    Set objCtrl = Me.OLEObjects("chkControl") 
End Sub 

Private Sub chkControl_GotFocus() 
    MsgBox ("chkControl has focus") 
End Sub 

Set objCtrl = Me.OLEObjects("chkControl") 

提出了一個相同的ER ROR。但直接訪問GotFocus事件(chkControl_GotFocus事件)沒有問題。

我明顯做錯了什麼,但我找不到任何文檔在互聯網上解釋什麼!

+0

另外需要注意的是,I **可以**在**工作表**代碼中訪問OLEObject的GetFocus事件。 – Bobsickle

回答

1

這爲我工作,但它是具體到TextBox控件,並沒有 「的GotFocus /引發LostFocus」 事件......

clsSheetControl

Dim WithEvents objOLEControl As MSForms.TextBox 

Public Sub Init(oleControl As MSForms.TextBox) 
    Set objOLEControl = oleControl 
End Sub 

Private Sub objOLEControl_Change() 
    MsgBox "Changed" 
End Sub 

Private Sub objOLEControl_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _ 
            ByVal Shift As Integer) 
    MsgBox "Key down: " & KeyCode 
End Sub 

工作表

Dim objControl As clsSheetControl 

Public Sub SetControlHandler() 
    Set objControl = New clsSheetControl 
    objControl.Init Me.OLEObjects("TextBox1").Object 
End Sub 
+0

感謝您的回答,但我不認爲您已經正確地閱讀了我的問題 - 我不需要訪問控件,並且它與OLEObject中包含的關聯事件相關,我知道如何做到這一點。 **我的問題的關鍵是我想訪問OLEObject GotFocus和LostFocus事件**。這些可在工作表中訪問,但我無法使用自定義類模塊中的WithEvents OLEObject成員訪問它們。 – Bobsickle

+0

你不是第一個有此問題的人(例如,見http://stackoverflow.com/questions/6390289/how-to-assign-an-event-to-multiple-objects-with-excel-vba)似乎不可能定義一個通用的OLEObject「WithEvents」,然後爲其分配一個工作表控件。幾乎就好像容器對象和控件本身的事件被合併一樣:如果聲明MSForms.Textbox類型的變量,那麼它沒有Got/Lost_Focus事件,而工作表上嵌入的「相同」對象的確如此(另外到其他文本框特定的事件)。 –