问题描述
我对 vba 没有经验,所以感谢您的理解。
我在 office 365 中测试了一些旧的宏,之前我使用的是 excel 2016。
我了解到,由于 Long
变量声明,某些宏可能无法正常工作。 ——
据我所知,Long
有 4bit,LongLong
有 8bit。还有像 ►LongPtr
之类的东西,它有 4bit-when 除了 VBA7 和 8bit-in VBA7。
我的问题如下:如何在 excel365 中我仍然可以使用普通的 Long
变量?
解决方法
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 用于指针或指针-大小的数据类型。”