不能在Excel 2007的VBA中使用Option Strict Off进行后期绑定。
不能在Excel 2007的VBA中使用Option Strict Off进行后期绑定。
我正在编写一些用于兼容Excel 2007及更高版本的VBA代码。自从从Excel 2013开始引入了图表系列过滤选项和相关的Chart.FullSeriesCollection
对象以来,我在代码中加入了一个If
语句,根据Excel版本选择使用这个对象还是旧的.SeriesCollection
对象。
然而,VBA无法在Excel 2007中编译代码,因为.FullSeriesCollection
未定义。我想尝试使用后期绑定,以便编译器跳过包含未定义对象的If
语句,但是Excel 2007(带有VBA版本6.3)也不认识Option Strict Off
这一行;我只能从Base
,Compare
,Explicit
或Private
中选择跟随Option
语句。
如何让旧的VBA编译器跳过使用.FullSeriesCollection
的那一行呢?我学习VBA已经3天了,所以如果这很明显请原谅我。
代码的相关部分:
Private Sub EventChart_MouseDown(ByVal Button As Long, _ ByVal Shift As Long, _ ByVal x As Long, _ ByVal y As Long) Dim ElementID As Long, Arg1 As Long, Arg2 As Long, Arg1b As Long Dim myX As Variant, myY As Double Dim xlVrsion As Integer, verSerColl As Object xlVrsion = CInt(Left(Application.Version, 2)) '获取Excel版本并转换为整数(2007 = 13.0;2010 = 14.0;2013 = 15.0;2016 = 16.0) With ActiveChart .GetChartElement x, y, ElementID, Arg1, Arg2 If ElementID = xlSeries Then If xlVrsion >= 15 Then '检查Excel版本是否等于或新于2013。 Set verSerColl = .FullSeriesCollection(Arg1) Else Set verSerColl = .SeriesCollection(Arg1) End If '[更多不相关的代码]
在Excel 2007 VBA中,无法使用Option Strict Off进行后期绑定的原因是,VBA7常量与Excel版本无关,它是指兼容性状态。根据编译器常量的链接,VBA7表示“指示开发环境是Visual Basic for Applications,版本7.0兼容”。因此,解决这个问题的方法是使用编译器常量来检查Excel版本并相应地选择适当的方法。
以下是解决此问题的代码示例:
#If VBA7 Then '检查Excel版本是否等于或新于2013年。
Set verSerColl = .FullSeriesCollection(Arg1)
#Else
Set verSerColl = .SeriesCollection(Arg1)
#End If
通过使用以上代码,可以根据Excel版本选择正确的方法进行后期绑定,从而解决无法使用Option Strict Off进行后期绑定的问题。这样可以确保代码在不同的Excel版本中都能正常工作,提高代码的兼容性。
在Excel 2007的VBA中,不能使用Option Strict Off进行后期绑定。下面的代码片段展示了如何通过将图表转换为Object或Variant来使用后期绑定:
If Val(Application.Version) >= 15 Then Dim objChart ' 默认为Variant类型 Set objChart = ActiveChart Set verSerColl = objChart.FullSeriesCollection(Arg1) Else Set verSerColl = ActiveChart.SeriesCollection(Arg1) End If
另一个示例展示了即使无法编译,它也可以在旧版Office中运行:
Dim verSerColl If Val(Application.Version) >= 15 Then Set verSerColl = ActiveChart.FullSeriesCollection(Arg1) Else Set verSerColl = ActiveChart.SeriesCollection(Arg1) End If
感谢您的回答!它完美地工作了,我不明白为什么会有负面投票,但我选择了YowE3K的答案,因为它对我来说更优雅(而且他先到达这里!;)). 然而,我很好奇为什么将verSerColl
设置为ActiveChart
而不是.(Full)SeriesCollection
时它能够工作。另外,如果您有时间看一下,我还有另一个关于相同代码的问题尚未解决:[链接](http://stackoverflow.com/questions/43942407)。
我也更喜欢条件编译的答案,因为它允许早期绑定,但我不认为它会在Excel 2010中编译(在您的情况下可能无关紧要)。不确定是否理解了问题,但Object.FullSeriesCollection
会编译,因为在编译时类型是未知的,所以即使Object.SomeMadeUpMethod
也会编译。
嗯,正如我所说,我学习VBA只有几天,所以我不确定编译是如何工作的,但根据我所读到的关于后期绑定的少数相关内容,我不明白为什么编译器会“跳过”Set verSerColl = objChart.FullSeriesCollection(Arg1)
而不是With ActiveChart [...] Set verSerColl = .FullSeriesCollection(Arg1)
。也不确定您所说的“在编译时类型是未知的”是什么意思,但再次,我可能需要在提出这些问题之前学习更多关于VBA的知识(^_^;)。
另外,为什么您说它在Excel 2010中无法编译?是因为它使用了VBA7但没有包含.FullSeriesCollection
对象吗?在这种情况下,由于我不确定用户是否会使用Excel 2010,所以我可能应该在这种情况下使用您的后期绑定建议,对吗?
使用ActiveChart.FullSeriesCollection
,编译器可以找到ActiveChart
的类型是Chart
,并在编译时检查该类型是否具有.FullSeriesCollection
方法。如果编译器无法猜测实际类型,那么它将在执行该行时在运行时检查objChart
是否具有.FullSeriesCollection
方法。
VBA7是Office 2010及更高版本的,FullSeriesCollection
是Office 2013及更高版本的,因此它无法在Office 2010中编译,但仍然可以运行。VBA可以在没有编译的情况下运行。文档中的一些主题可能会有所帮助:stackoverflow.com/documentation/excel-vba/topics