不能在Excel 2007的VBA中使用Option Strict Off进行后期绑定。

9 浏览
0 Comments

不能在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这一行;我只能从BaseCompareExplicitPrivate中选择跟随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
'[更多不相关的代码]

0
0 Comments

在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版本中都能正常工作,提高代码的兼容性。

0
0 Comments

在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

0