【问题标题】:Accessing OLEObject events using custom class使用自定义类访问 OLEObject 事件
【发布时间】:2022-04-08 19:04:40
【问题描述】:

我正在尝试在 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 事件)是可以的。

【问题讨论】:

  • 另外需要注意的是我可以worksheet代码中访问OLEObject的GetFocus事件。

标签: excel vba


【解决方案1】:

这对我有用,但它特定于文本框控件并且没有“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

【讨论】:

  • 感谢您的回答,但我认为您没有正确阅读我的问题 - 我不需要访问控件及其包含在 OLEObject 中的相关事件,我已经知道该怎么做. 我的问题是我想访问 OLEObject GotFocus 和 LostFocus 事件。这些可以在工作表中访问,但我无法使用自定义类模块中的 WithEvents OLEObject 成员访问它们。
  • 您不是第一个遇到此问题的人(例如,请参阅stackoverflow.com/questions/6390289/…) 似乎无法定义一个通用的 OLEObject“WithEvents”,然后为其分配一个工作表控件。几乎就好像容器对象和控件本身的事件被合并了:如果你声明一个 MSForms.Textbox 类型的变量,那么它没有 Got/Lost_Focus 事件,而嵌入在工作表上的“相同”对象有(此外到其他特定于文本框的事件)。
猜你喜欢
  • 1970-01-01
  • 2016-05-05
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多