无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定

Posted

技术标签:

【中文标题】无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定【英文标题】:Can't use Option Strict Off for Late Binding in Excel 2007 VBA 【发布时间】:2017-05-12 19:08:37 【问题描述】:

我正在编写一些旨在与 Excel 2007 和更新版本兼容的 VBA 代码。从 Excel 2013 开始,引入了图表系列过滤选项和相关的 Chart.FullSeriesCollection 对象,我在我的代码中包含了一个 If 语句来选择这个对象或旧的 .SeriesCollection 一个,具体取决于 Excel 版本。

但是,由于未定义 .FullSeriesCollection,VBA 无法编译 Excel 2007 中的代码。我想尝试后期绑定,以便编译器跳过包含该未定义对象的 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)) 'Get Excel version and convert to an integer (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     'Check if Excel version is equal or newer than 2013.
    Set verSerColl = .FullSeriesCollection(Arg1)
  Else
    Set verSerColl = .SeriesCollection(Arg1)
  End If

'[More irrelevant code]

【问题讨论】:

【参考方案1】:

你大概可以用compiler constants比如

#If VBA7 Then     'Check if Excel version is equal or newer than 2013.
    Set verSerColl = .FullSeriesCollection(Arg1)
#Else
    Set verSerColl = .SeriesCollection(Arg1)
#End If

【讨论】:

谢谢你,它工作得很好!我想知道VBA7 常量,或者更确切地说,VBA 版本是否始终与 Excel 版本相关,或者它可能会在不更新 Excel 本身的情况下更新。 @yuyu2809 VBA已经很久没有明显更新了,所以我不这么认为。 AFAIK,VBA7 的唯一原因是因为 64 位 Office msdn.microsoft.com/en-us/library/office/… ***.com/questions/3072356/… @yuyu2809 - VBA7 常量不是指 Excel 版本,而是指兼容性状态。根据compller constants链接,VBA7“表明开发环境是Visual Basic for Applications,版本7.0兼容。”【参考方案2】:

您应该能够通过将图表转换为 Object 或 Variant 来使用后期绑定:

If Val(Application.Version) >= 15 Then
    Dim objChart                 ' As Variant by default
    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 时它会起作用。另外,如果您有时间看一下,我对这里的相同代码还有另一个尚未解决的问题:link 我也更喜欢条件编译答案,因为它允许早期绑定,但我认为它不会在 Excel 2010 中编译(这可能与您的情况无关)。不知道我是否理解这个问题,但Object.FullSeriesCollection 编译因为在编译时类型未知,所以即使Object.SomeMadeUpMethod 也会编译 好吧,正如我所说,我已经学习 VBA 几天了,所以我不确定编译是如何工作的,但是从我读过的与后期绑定相关的一些内容来看,我不知道不明白为什么编译器会“跳过”你的 Set verSerColl = objChart.FullSeriesCollection(Arg1) 而不是 With ActiveChart [...] Set verSerColl = .FullSeriesCollection(Arg1)。也不确定“在编译时类型未知”是什么意思,但同样,在问这些问题之前我可能需要学习更多的 VBA (^_^;) 使用ActiveChart.FullSeriesCollection,编译器可以发现ActiveChart的类型是Chart,并且可以在编译时检查该类型是否有.FullSeriesCollection方法。如果编译器无法猜出实际类型,那么它将在执行该行时检查objChart 在运行时是否有.FullSeriesCollection 方法。 VBA7 是 Office 2010 及更高版本和FullSeriesCollection Office 2013 及更高版本,因此它无法在 Office 2010 中编译,但仍然可以运行。 VBA 无需编译即可运行。文档中的一些主题可能会有所帮助***.com/documentation/excel-vba/topics

以上是关于无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA Excel 2007 中使用命名范围

如何使用 vba 在 Excel 2007 中找到条件格式单元格的填充颜色值?

在 excel 2007 vba 中找不到可安装的 ISAM

在 VBA Excel 2007 中传递变体 ByRef

在windows 7 下Excel 2007 VBA中的命令SendKeys有时会无效?

从 Access 2007 VBA 代码创建 .xlsx 文件时强制用户使用 Excel 版本