在 Office 2010 程序的 64 位版本中编辑 VBA 宏时编译错误

症状

请考虑以下情况:

  • 编写使用 Declare 语句的 Microsoft Visual Basic for Applications (VBA) 宏代码。

  • VBA 宏代码使用编译常量。 例如,宏代码使用以下编译常量之一:

    • #If VBA7
    • #If Win64
  • 在条件块中使用#Else块。 在#Else块中,对设计为在 Microsoft Visual Basic for Applications 6.0 中运行的 Declare 语句使用语法。

  • 在 Microsoft Office 2010 程序的 64 位版本中编辑代码。

  • 尝试更改#Else块中的 Declare 语句。

在这种情况下,您会收到以下错误消息:

Microsoft Visual Basic for Applications

Compile error:

The code in this project must be updated for use on 64-bit
systems. Please review and update Declare statements and then
mark them with the PtrSafe attribute.

注意

只有在编辑 VBA 宏时才会出现此问题。 运行宏时不会出现此问题。

解决方案

若要解决此问题,请忽略“编译错误”,并在 Office 2010 程序的 64 位版本中运行 VBA 代码。

更多信息

重现问题的步骤

Microsoft 提供的编程示例仅供演示,不提供明示或暗示的担保,包括但不限于对适销性和/或特定用途适用性的暗示担保。 本文假设你熟悉所演示的编程语言以及用于创建和调试过程的工具。 Microsoft 支持专业人员可以帮助解释特定过程的功能,但他们不会修改这些示例以提供新增功能或构建步骤以满足你的特定需要。

有关可用的支持选项以及如何联系 Microsoft 的详细信息,请访问以下 Microsoft 网站:

https://support.microsoft.com/contactus

  1. 启动在 Windows 64 位操作系统上运行的 64 位版本的Microsoft Excel 2010。

    注意

    默认情况下,将打开一个新工作簿。

  2. 按 ALT+F11 启动 Visual Basic for Applications 7.0 IDE 窗口。

  3. 在“插入”菜单上,单击“模块”

  4. 在显示的代码窗口中,复制并粘贴以下代码:

    #If VBA7 Then
        Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
    #Else
        Private Declare Sub Sleep Lib "kernel32" (ByVal ms as Long)
    #End If
    
  5. 在每个 Declare 语句中,手动更改从“ms”传递到“毫秒”的任何参数的名称。

更改第二个 Declare 语句时,Visual Basic for Applications 7.0 将报告一个错误,指示必须使用 PtrSafe。 但是,报表不正确,因为该行位于仅在 Visual Basic for Applications 6.0 中运行的部分中。 VBA 6.0 不使用 PtrSafe。 因此,可以安全地忽略错误消息。