VBA:若要在 64 位系统上使用,则必须更新此项目中的代码。请检查并更新 Declare 语句,然后用 PtrSafe 属性标记它们

注:本文为 “ VBA 加载 / 运行报错”相关文章合辑。


问题现象

编译错误:
若要在 64 位系统上使用,则必须更新此项目中的代码。请检查并更新 Declare 语句,然后用 PtrSafe 属性标记它们
 
img

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.
 
VBA error

隐藏的模块中的编译错误: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 FunctionPublic Declare Function 用于声明外部函数,即那些定义在其他动态链接库(DLL)中的函数。

两种声明方式的主要区别在于它们的作用域:

  1. Private Declare Function

    • Private 关键字限制了函数的作用域,使得该函数只能在声明它的模块或窗体中被访问和使用。
    • 适用于那些只需要在局部范围内使用的外部函数。
  2. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值