这是由我的模块顶部的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组合框,其中包含要从中填充图表的数据类别。 cbStartDate
和cbEndDate
是ActiveX组合框,可更改图表X轴上显示的日期范围。
我可以确认我的工作表上有cbStartDate
和cbEndDate
:
实际上,当我刚刚退出调试器(两次)时,我的文件将正常工作;我可以自由更改cbStartDate
和cbEndDate
,并且图表按预期更新,并且再也看不到编译错误(直到重新打开文件)。
我的怀疑:
这与ActiveX控件的实例化有关-加载cbSelectData
(并触发其Change
事件)时,找不到cbStartDate
或cbEndDate
因为它们尚未加载。
我需要做什么:
打开文件时,我需要停止触发我的cbSelectData_Change
事件,或者需要在此事件触发之前强制加载cbStartDate
和cbEndDate
。我把Application.EnableEvents
弄得一团糟,无济于事-对此有任何见识将不胜感激。
注意:这些文件必须是ActiveX控件才能进行格式化。我也知道我可以完全删除我的Option Explicit
,但我真的不愿意...
答案 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