注:本文为 “ VBA 加载 / 运行报错”相关文章合辑。
问题现象
编译错误:
若要在 64 位系统上使用,则必须更新此项目中的代码。请检查并更新 Declare 语句,然后用 PtrSafe 属性标记它们
Compile error:
The code in this project must be update for use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.
隐藏的模块中的编译错误:mod_openFile。
此错误通常会在代码与此应用程序的版本、平台或基础结构不兼容时发生。单击 “帮助” 以获取如何更正此错逞的信息。
出现场景
1、在 Office 32 位(Access、Excel……) 上开发的 VBA,迁移到 Office 64 位中,运行报错
2、在 MATLAB 中使用 notebook 时,编译报错
3、在 CAD 加载 VBA 时,编译错误
解决方案
在所有出现问题的声明函数 Declare
后,加上 PtrSafe
。
CAD: 报错的声明函数中的 Declare
改为 Declare PtrSafe
,参数和返回值中的 Long
改成 LongLong
。
示例
示例 1 Private
:
原为:
Private Declare
Function ……
改为:
Private Declare PtrSafe
Function ……
示例 2 Public
:
原为:
Public Declare
Function ……
改为:
Public Declare Function
Function ……
—
Private / Public
在 Visual Basic (VB) 编程语言中,Private Declare Function
和 Public Declare Function
用于声明外部函数,即那些定义在其他动态链接库(DLL)中的函数。
两种声明方式的主要区别在于它们的作用域:
-
Private Declare Function:
Private
关键字限制了函数的作用域,使得该函数只能在声明它的模块或窗体中被访问和使用。- 适用于那些只需要在局部范围内使用的外部函数。
-
Public Declare Function:
Public
关键字使得函数可以在项目的任何地方被访问和使用,包括不同的模块、类或窗体。- 适用于那些需要在多个地方被调用的外部函数。
这两种声明方式都使用 Declare
关键字来指示函数是在外部库中定义的,而 Function
关键字则表示该外部函数有返回值。如果外部函数没有返回值,应该使用 Sub
而不是 Function
。这些声明允许 VB 程序调用 DLL 中的函数,实现更广泛的功能扩展。
Microsoft Visual Basic for Applications (VBA) 在 Office 中的相关情况
HHAAMM 发表于 2011-7-17 23:58
VBA 版本 6 及更早版本以 32 位平台为目标,其 Declare 语句调用的 Windows API 使用 32 位数据类型的指针和句柄,用 Long 数据类型(32 位 4 字节的数据类型)引用指针和句柄,而 64 位环境中指针和句柄为 8 字节 64 位数,无法包含在 32 位数据类型中。
注意:只有在 64 位版本的 Microsoft Office 中运行 VBA 代码时,才需要修改代码。在 64 位 Office 中运行旧 VBA 代码,将 64 位加载到 32 位数据类型中会截断 64 位数,进而导致内存溢出、出现意外结果以及应用程序故障。
二、解决 64 位运行问题的新增语言功能
为使 VBA 代码能同时在 32 位和 64 位环境中正确运行,新版 VBA 增加了几项语言功能,其中三个重要的新增功能如下:
(一)LongPtr 类型别名
VBA 现在包含一种可变类型别名:LongPtr。其实际解析的数据类型取决于 Office 版本:在 32 位
版本的 Office 中 LongPtr
解析为 Long
,在 64 位
版本的 Office 中 LongPtr
解析为 LongLong
。LongPtr 用于指针和句柄。
(二)LongLong 数据类型
LongLong 数据类型为有符号的 64 位整数,仅在 64 位版本的 Office 中可用,用于 64 位整数。必须使用转换函数将 LongLong(包括 64 位平台上的 LongPtr)显式赋予较小的整型,不允许将 LongLong 隐式转换为较小的整数。
(三)PtrSafe 关键字
PtrSafe 关键字声明 Declare 语句可以在 64 位版本的 Office 中安全运行。在 64 位版本的 Office 中运行时,所有 Declare 语句必须都包括 PtrSafe 关键字。不过,仅添加 PtrSafe 关键字只是表明 D