如何防止在 VBA 中触发 ActiveX 事件?

end*_*and 4 excel vba activex

我正在寻找一种更好的方法来禁止在 Excel 工作簿中触发 ActiveX 事件(尽管这适用于所有带有 ActiveX 对象的 Office 应用程序)。

希望类似于Application.EnableEvents = false,尽管这不适用于 ActiveX。

在下面的示例中,使用全局布尔值是微不足道的,但是我的 ActiveX 对象有很多事件处理程序,并且对于我可以普遍应用的临时禁用 ActiveX 事件的东西来说会非常容易。我真的不想为这些方法中的每一个添加 if/exit 子语句。

为了演示这个问题,在工作表中创建一个 ActiveX 组合框并将以下内容添加到该工作表模块

Public initializingContent As Boolean 
Private Sub intializeAllActiveXContent()

    'this doesn't apply to activeX events :'(
    Application.EnableEvents = False

    'this could work but is not really elegant
    'change this to false to show my problem in 
    'the intermediate window (called not once but twice)
    initializingContent = True

    ComboBoxTest.Clear

    ComboBoxTest.AddItem ("item1")
    ComboBoxTest.AddItem ("item2")
    ComboBoxTest.AddItem ("item3")

    'select the top value in the box
    ComboBoxTest.value = "item1"

    initializingContent = False

    Application.EnableEvents = True

     End Sub

Private Sub ComboBoxTest_Change()
    'I really don't want to have to wrap EVERY single ActiveX method
    'with something like this for a whole variety of reasons...
    If initializingContent Then Exit Sub

    Debug.Print "do stuff I don't want to happen when intializeAllActiveXContent() runs " & _
        "but I do when user changes box"
         End Sub
Run Code Online (Sandbox Code Playgroud)

小智 5

我知道这真的很老了。但是任何查找这个(第一次在谷歌上搜索)的人都可能想要一个简单的答案:

假设您有一个 Private Sub ActiveXControl_Change() 在 Application.EnableEvents = False 期间被调用,并且您希望它跳过这个就行了:

Private Sub ActiveXControl_Change()
If Application.EnableEvents = True Then
'enter you code here

End If
End Sub
Run Code Online (Sandbox Code Playgroud)


Sid*_*out 4

为什么不禁用它们呢?这样您就不必担心它们各自的代码。

\n\n

尝试这个

\n\n
Sub DisableActiveXControls()\n    Dim ws As Worksheet\n    Dim OLEobj As OLEObject\n\n    Set ws = ThisWorkbook.Sheets("Sheet1")\n\n    With ws\n        For Each OLEobj In ws.OLEObjects\n\n        If TypeOf OLEobj.Object Is MSForms.ComboBox Then\n            OLEobj.Enabled = False\n        End If\n        Next OLEobj\n    End With\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n\n

之前/之后的屏幕截图:

\n\n

在此输入图像描述

\n\n

评论跟进:

\n\n
\n

事实证明,这会破坏分组在一起的对象的核心,但我可以取消对象的分组(我猜它们不再位于“Sheet1.OLEobjects”中)。我仍然不太喜欢这个,因为它依赖于这个事实,有时我确实想对对象进行分组.. \xe2\x80\x93 enderland 17 分钟前

\n
\n\n

要禁用组中的 ActiveX 控件,无需取消它们的分组。使用此代码。下面的代码将禁用组中的组合框。

\n\n
Sub Disable_ActiveX_Controls_In_A_Group()\n    Dim shp As Shape, indvShp As Shape\n    Dim OLEobj As OLEObject\n    Dim ws As Worksheet\n\n    Set ws = ThisWorkbook.Sheets("Sheet1")\n\n    For Each shp In ws.Shapes\n        If shp.Type = msoGroup Then\n            For Each indvShp In shp.GroupItems\n                Set objOLE = indvShp.OLEFormat.Object\n\n                If objOLE.progID = "Forms.ComboBox.1" Then _\n                objOLE.Enabled = False\n            Next\n        End If\n    Next\nEnd Sub\n
Run Code Online (Sandbox Code Playgroud)\n