【问题标题】:Writing VBA in Excel 2007 for use in Excel 2003在 Excel 2007 中编写 VBA 以在 Excel 2003 中使用
【发布时间】:2010-09-16 22:17:48
【问题描述】:

我所在的开发人员已更新到 Excel 2007,但大多数用户还没有。我正在为需要包含一些 vba 代码的用户构建电子表格模板 (*.xlt),我想知道在 2007 年而不是 2003 年构建它时可能会遇到什么问题?我无法使用装有 Excel 2003 的机器进行测试,我担心这个特定项目会走向灾难。

【问题讨论】:

  • 我已经说服我的老板让我在 ASP.Net 页面而不是电子表格中构建它(这样可以很好地与我们的其他 Intranet 应用程序配合),所以现在这个问题从我的角度来看没有实际意义。但是,此处的信息可能对其他人仍然有用,因此我将其保留为活动状态。
  • 这个问题确实很有趣,但不幸的是,由于无穷无尽的用例场景,我们可能永远无法完成它。确实没有理由不使用带有 Office 2003 的 VM 进行开发和测试。

标签: vba excel


【解决方案1】:

VBA 语言没有改变,但 Office 2007 中还有一些 Office 2003 中没有的其他对象。当您尝试在 2003 环境中访问这些项目时,这自然会导致运行时错误。是什么阻止您设置使用 Excel 2003 的虚拟机进行开发?

【讨论】:

  • 我无权在此处进行任何虚拟机工作。如果您可以将我指向其他对象的列表,以便我知道如何避免它们,那就太好了。
【解决方案2】:

最好(最可靠)的做法是始终使用可能用于运行代码的最旧版本的 Excel 进行开发,而不是依赖于可能不完整的已添加到 Excel 2007 对象库的对象和方法列表.

【讨论】:

  • 很遗憾,我没有那个选项。
  • 这是最好的答案,因为它正确地指出任何列表可能至少部分不完整,并且与 VM 答案很好地联系在一起。
【解决方案3】:

我发现的一个区别是,从菜单(在 Excel 2003 中)调用的子例程必须具有与从功能区(在 Excel 2007 中)调用时不同的签名。更重要的是,Excel 2003 无法识别 IRibbonControl 并引发编译错误。

为了实现跨版本兼容性,我使用条件编译参数,然后在预处理器宏中检查它。

例如

#If USINGRIBBON Then
    Public Sub CallFromRibbon(control As IRibbonControl)
#Else
    Public Sub CallFromRibbon()
#End If
    ' Code here
   End Sub

这确实意味着您必须保存一个将 USINGRIBBON 标志设置为 false(对于 Excel2003)和另一个将 USINGRIBBON 标志设置为 true(对于 Excel2007)的加载项版本,但这比维护要容易得多两个完全独立的代码库。

【讨论】:

    【解决方案4】:

    billb2112 是对的。 Excel 2007 与 Excel 2003 相比有许多不向后兼容的更改。虽然语言可能没有改变,但对象已经更新。有些添加了其他属性,有些工作方式不同,Excel 中的某些功能也发生了变化。

    您需要非常小心,确保您的代码在 Excel 2003 中有效。 我建议就像 billb2112 所说的那样,您可以获得一台虚拟机,不仅可以进行测试,还可以进行编码。我为在 2003 机器中只有 2003 的客户进行所有 Excel 开发。请注意,如果用户使用 Excel 2002 或 2000,则返回时会有更多差异,并且您只会在这些旧版本不支持的任何代码上遇到运行时错误。

    更新 不幸的是,杰夫的回答并不完全正确。虽然是的,vba 语言尚未更新,但 2007 年与 2003 年不同。2003 年与 2002 年不同,等等。 发生的事情是额外的,并且添加了额外的函数和函数参数。例如,2003 年 Excel 中的 FIND 函数选项比 2002 年多。因此,如果您在 2003 年录制宏(查找这些问题的最佳方法),然后在 2002 年运行它,您将遇到与在 2002 VBA 编辑器中根本不起作用的新参数。对 excel 2007 中已更改的功能执行相同的过程,然后返回 2003 进行测试将帮助您找到这些问题。一些示例包括条件格式、颜色(主题)和许多新的电子表格功能。 jon peltier 在这方面有最好的建议 - 以客户/用户将使用的最旧版本进行开发。 Virtual PC 2007 可免费下载和安装。您只需要安装 XP/Vista 和 office 的许可副本即可在其中运行。

    【讨论】:

    • 不幸的是,虚拟机不是一个选项。我真的需要一份 2003 年没有的物品清单。
    【解决方案5】:

    我曾经在 2003 年以下开发过很多宏,什么 POTA,像 Find、Dir 和其他一些东西不可用或发生了一些变化。因此可能会出现一些错误,我曾经从 65000 行数到第一个非空行来计算要处理的行数......现在更多的行意味着更多的工作要做

    【讨论】:

    • 不是真的,只需使用 .End 属性即可,因此您不必数到最后一行的“末尾”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多