使用自定义类在Excel VBA中访问OLEObject事件

问题描述 投票:3回答:1

我试图在Excel VBA中创建一个自定义类来处理OLEObject(工作表上的ActiveX控件)的事件GotFocus和LostFocus。

自定义类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")

引发同样的错误。但是直接访问GotFocus事件(chkControl_GotFocus事件)很好。

我显然做错了什么,但我在互联网上找不到任何解释内容的文档!

excel-vba vba excel
1个回答
0
投票

这对我有用,但它特定于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
© www.soinside.com 2019 - 2024. All rights reserved.