我正在寻找一种更好的方法来禁止在 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)
为什么不禁用它们呢?这样您就不必担心它们各自的代码。
\n\n尝试这个
\n\nSub 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\nRun Code Online (Sandbox Code Playgroud)\n\n之前/之后的屏幕截图:
\n\n
评论跟进:
\n\n\n\n\n事实证明,这会破坏分组在一起的对象的核心,但我可以取消对象的分组(我猜它们不再位于“Sheet1.OLEobjects”中)。我仍然不太喜欢这个,因为它依赖于这个事实,有时我确实想对对象进行分组.. \xe2\x80\x93 enderland 17 分钟前
\n
要禁用组中的 ActiveX 控件,无需取消它们的分组。使用此代码。下面的代码将禁用组中的组合框。
\n\nSub 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6848 次 |
| 最近记录: |