ActiveX ComboBox_Change event falsely triggering a Compile Error: Variable not defined

ActiveX ComboBox_Change event falsely triggering a Compile Error: Variable not defined

这是由我的模块顶部的 Option Explicit 触发的。当我打开我的工作簿时,我的 cbSelectData_Change 事件触发(无论出于何种原因),然后说我的变量 cbStartDate 未定义(我将包括这些行但它不应该相关:

topnum = ThisWorkbook.Worksheets("Data Pull").Columns(3).Find(What:=cbStartDate.Value, LookIn:=xlValues).Row
botnum = ThisWorkbook.Worksheets("Data Pull").Columns(3).Find(What:=cbEndDate.Value, LookIn:=xlValues).Row

cbSelectData 是一个 ActiveX 组合框,其中包含图表填充的数据类别。 cbStartDatecbEndDate 是 ActiveX 组合框,可更改图表 x 轴上显示的日期范围。

我可以确认我的工作表上有 cbStartDatecbEndDate

事实上,当我退出调试器(两次)时,我的文件可以正常工作;我可以自由更改我的 cbStartDatecbEndDate 并且我的图表会按预期更新,而且我再也看不到编译错误(直到重新打开文件)。

我的猜测:

这与 ActiveX 控件的实例化有关 - 在加载 cbSelectData 时(并触发其 Change 事件),它没有找到 cbStartDatecbEndDate 因为它们还没有加载。

我需要做的事情:

我要么需要在打开文件时阻止我的 cbSelectData_Change 事件触发,要么我需要在此事件触发之前强制加载我的 cbStartDatecbEndDate。我搞砸了 Application.EnableEvents 无济于事 - 对此有任何见解将不胜感激。

注意:出于格式化目的,这些必须是 ActiveX 控件。我也知道我可以完全删除我的 Option Explicit,但我真的不想...

我不确定是什么破坏了它,但 ActiveX 控件可能不稳定。

尝试在 运行 时而不是编译时检索对象:

Public Function FindActiveXControl(ByVal sh As Worksheet, ByVal name As String) As Object

    Dim objects As OLEObjects
    Set objects = sh.OLEObjects

    On Error Resume Next
        Dim oleControl As OLEObject
        Set oleControl = objects.Item(name)
    On Error GoTo 0

    If Not oleControl Is Nothing Then Set FindActiveXControl = oleControl.Object

End Function

现在您可以与本地人一起工作,并处理找不到控件的奇怪情况:

Dim sheet As Worksheet
Set sheet = Me

Dim startDateControl As MSForms.ComboBox
Set startDateControl = FindActiveXControl(sheet, "cbStartDate")
If Not startDateControl Is Nothing Then
    topnum = ThisWorkbook.Worksheets("Data Pull").Columns(3).Find(What:=startDateControl.Value, LookIn:=xlValues).Row
End If

Dim endDateControl As MSForms.ComboBox
Set endDateControl = FindActiveXControl(sheet, "cbEndDate")
If Not endDateControl Is Nothing Then
    botnum = ThisWorkbook.Worksheets("Data Pull").Columns(3).Find(What:=endDateControl.Value, LookIn:=xlValues).Row
End If