如何防止在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