微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

兼容性 32bit-excel 和 64-bit excel (office 365)

如何解决兼容性 32bit-excel 和 64-bit excel (office 365)

我对 vba 没有经验,所以感谢您的理解。

我在 office 365 中测试了一些旧的宏,之前我使用的是 excel 2016。

我了解到,由于 Long 变量声明,某些宏可能无法正常工作。 —— 据我所知,Long4bitLongLong8bit。还有像 ►LongPtr 之类的东西,它有 4bit-when 除了 VBA7 和 8bit-in VBA7。

我的问题如下:如何在 excel365 中我仍然可以使用普通的 Long 变量?

enter image description here

解决方法

Long 数据类型还没有死

我了解到,由于 Long 变量声明,某些宏可能无法正常工作。

您可能指的是使用 API 函数(API - 应用程序编程接口),您必须 照顾不同的环境。这些系统功能确实需要 LongPtr 类型 for pointers to a → handle or → memory location (注意特殊的 PtrSafe 前缀!) .

我的问题如下:怎么可能在 excel365 中我仍然可以使用普通的 Long 变量?

一个 VBA 过程,与引用的 API 函数相反不会被迫“禁止”变量的 Long 数据类型, 就像在没有 Integer 的情况下您将被迫做的一样少(顺便说一句,VBA 内部更喜欢 Long 整数)。

LongPtr 声明的进一步说明

Office 2010 或更高版本中将窗口句柄声明为 LongPtr 和之前版本中的Long一样,需要区分不同版本 通过条件编译常量 (#If VBA7 Then .. #End If) ,例如

#If VBA7 Then              ' Office 2010 or higher
    Private Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" _
           (ByVal lpClassName As String,_
            ByVal lpWindowName As String) _
    As LongPtr  
#Else
    Private Declare Function FindWindow Lib "User32" _
        Alias "FindWindowA" _
       (ByVal lpClassName As String,_
        ByVal lpWindowName As String) As Long
#End If

请注意,某些 API 函数还需要使用条件 Win64 常量来标识实际安装的 64 位 Office 系统; 我已经提到过,Office 经常默认安装为 32 位。

LongPtr,但是不是真正的数据类型,因为它会转换为正确的数据类型 取决于实际的 32/64 位环境。

请注意,64 位系统可以安装为 32 位办公室或 64 位办公室。 LongPtr 支持编写可在 32 位和 64 位环境中运行的可移植代码。

提示:注意通过适当的数据类型声明分配的 API 变量。 如果你通过条件编译常量来区分版本,你必须 对您自己的过程中的引用变量也这样做。

相关链接

进一步推荐阅读 (thx @GSerg :-)

在以下帖子中引用@GSerg:

“通过将 PtrSafe 添加到函数声明中,您向编译器承诺您已将 LongPtr 放在它需要的所有位置,而不是其他位置。”

“LongPtr 是一个指针大小的整数。它必须用于与指针大小相同的事物。”

“Long 在所有版本中都存在并且在所有版本中都意味着相同的东西(32 位整数)。您不应该为了它而将其更改为 LongPtr。您应该只将 LongPtr 用于指针或指针-大小的数据类型。”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。