如何防止在VBA中触发ActiveX事件?
我正在寻找一种更好的方法来禁用在Excel工作簿中触发的ActiveX事件(尽pipe这将适用于具有ActiveX对象的所有Office应用程序)。
希望类似于Application.EnableEvents = false
,但这不适用于ActiveX。
在下面的例子中使用全局布尔值是微不足道的,但我有很多事件处理程序为我的ActiveX对象,这将是非常容易的东西,我可以普遍适用于临时禁用ActiveX事件。 我真的不想为这些方法中的每一个添加一个if / exit子语句。
为了演示此问题,请在工作表中创build一个ActiveXcombobox,并将以下内容添加到该工作表模块中
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
为什么不禁用它们? 这样你不必担心自己的代码。
尝试这个
Sub DisableActiveXControls() Dim ws As Worksheet Dim OLEobj As OLEObject Set ws = ThisWorkbook.Sheets("Sheet1") With ws For Each OLEobj In ws.OLEObjects If TypeOf OLEobj.Object Is MSForms.ComboBox Then OLEobj.Enabled = False End If Next OLEobj End With End Sub
之前/之后ScreenShots:
后续评论:
也发现这打破了核心的对象组合在一起,但我可以取消组合对象(他们不再在“Sheet1.OLEobjects”我猜)。 我还是不太喜欢这个,因为它依赖于这个事实,而且有时候我想组合对象.. – enderland 17分钟前
要禁用组中的ActiveX控件,您不需要取消组合它们。 使用这个代码。 下面的代码将禁用组中的combobox。
Sub Disable_ActiveX_Controls_In_A_Group() Dim shp As Shape, indvShp As Shape Dim OLEobj As OLEObject Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") For Each shp In ws.Shapes If shp.Type = msoGroup Then For Each indvShp In shp.GroupItems Set objOLE = indvShp.OLEFormat.Object If objOLE.progID = "Forms.ComboBox.1" Then _ objOLE.Enabled = False Next End If Next End Sub
遇到这个post时寻找类似的问题。 我决定在这里发布的答案不适合我的情况,并提出了其他的东西。 我的方法在这里也可能有用。
在我的工作簿中,我有一组20个(Activex)checkbox。 这些基本上过滤/closures20类产品将包括在报告中。 每当这些checkbox中的一个被改变时,就会运行一个例程,只需调用CheckBox_Click例程中的路由即可。
然后我也有一个comboboxselect这些checkbox的各种组 。 麻烦的是当20个checkbox中的每一个都被combobox代码选中(未)时,计算程序被触发。
我想要的是在combobox的末尾只运行一次计算程序,但如果手动更改单个checkbox仍然有效。
我的解决scheme – 在隐藏的工作表的某个单元格中inputTRUE / FALSE代码,在某个地方它不会干扰。
然后,CheckBox_Click代码变成(对于20个checkbox中的每一个):
Private Sub CheckBox6_Click() If (Sheets("Data").Range("G60")) Then Call RangeFind End If End Sub
combobox代码修改这个相同的单元格,恰当地:
Private Sub ComboBox28_Change() Sheets("Data").Range("G60").Value = False Select Case Sheets("Data").Range("F50").Value Case "1" CheckBox1.Value = False CheckBox2.Value = False CheckBox3.Value = False .... End Select ' This turns the checkboxes back on Sheets("Data").Range("G60").Value = True ' This now actually calls the calculation ONCE Call RangeFind ActiveSheet.Range("A1").Activate End Sub
干杯,
迈克尔
我知道这真的很老。 但任何看起来这个(首先在谷歌上)可能需要一个简单的答案:
比方说你有一个私人小组ActiveXControl_Change()在一个Application.EnableEvents = False期间被调用,你想它跳过这只是去:
Private Sub ActiveXControl_Change() If Application.EnableEvents = True Then 'enter you code here End If End Sub