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 组合框,其中包含图表填充的数据类别。 cbStartDate
和 cbEndDate
是 ActiveX 组合框,可更改图表 x 轴上显示的日期范围。
我可以确认我的工作表上有 cbStartDate
和 cbEndDate
:
事实上,当我退出调试器(两次)时,我的文件可以正常工作;我可以自由更改我的 cbStartDate
和 cbEndDate
并且我的图表会按预期更新,而且我再也看不到编译错误(直到重新打开文件)。
我的猜测:
这与 ActiveX 控件的实例化有关 - 在加载 cbSelectData
时(并触发其 Change
事件),它没有找到 cbStartDate
或 cbEndDate
因为它们还没有加载。
我需要做的事情:
我要么需要在打开文件时阻止我的 cbSelectData_Change
事件触发,要么我需要在此事件触发之前强制加载我的 cbStartDate
和 cbEndDate
。我搞砸了 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
这是由我的模块顶部的 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
,但我真的不想...
我不确定是什么破坏了它,但 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