ActiveX ComboBox_Change事件错误地触发了编译错误:变量未定义

时间:2018-07-13 18:22:53

标签: excel vba excel-vba activex

这是由我的模块顶部的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

img1

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

我的怀疑:

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

我需要做什么:

打开文件时,我需要停止触发我的cbSelectData_Change事件,或者需要在此事件触发之前强制加载cbStartDatecbEndDate。我把Application.EnableEvents弄得一团糟,无济于事-对此有任何见识将不胜感激。

注意:这些文件必须是ActiveX控件才能进行格式化。我也知道我可以完全删除我的Option Explicit,但我真的不愿意...

1 个答案:

答案 0 :(得分:1)

我不确定是什么导致了它的崩溃,但是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