我在vba没有经验,所以谢谢你的理解。
我在office 365中测试了一些旧宏,之前我使用的是excel 2016。
我读到一些宏可能因为Long变量声明而不能正常工作。正如我正确理解的那样,Long有4位,LongLong有8位。还有像LongPtr这样的东西,它在VBA7中有4位(除了VBA7还有8位)。
我的问题如下:在excel365中,我如何仍然可以使用普通的Long变量?

发布于 2021-04-27 14:08:11
Long 数据类型不是死的
我读到一些宏可能因为
Long变量声明而不能正常工作。
您可能指的是,使用API函数()时,您必须处理不同的环境。这些系统函数确实需要LongPtr类型作为指向→、句柄、或→内存位置的指针(注意特殊的PtrSafe前缀!)。
我的问题如下:在excel365中,我怎么可能仍然可以使用普通的长变量?
VBA过程与引用的API函数相反,不会强制“禁止”变量的Long数据类型,就像您被迫不使用Integer一样(尽管内部VBA更喜欢Long整数)。
LongPtr declarations 对的进一步说明
由于窗口句柄在LongPtr Office 2010或更高版本中被声明为Long,而在以前的版本中被声明为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位office安装,也可以作为64位office安装.LongPtr允许编写可在32位和64位环境中运行的可移植代码。
提示:注意通过适当的数据类型声明指定的API变量。如果您通过条件编译常量对版本进行区分,那么您也必须使用您自己过程中的引用变量进行区分。
相关链接
进一步推荐阅读 (thx @GSerg :-)
在下列帖子中引用@GSerg:
“通过将PtrSafe添加到函数声明中,您可以向编译器保证,您已经将LongPtr放置在所有需要它的地方,而不是其他地方。”"LongPtr是一个指针大小的整数。它必须用于与指针大小相同的事物。“
"Long在所有版本中都存在,在所有版本(32位整数)中都是相同的。您不应该为了它而将它更改为LongPtr。您应该只对指针或指针大小的数据类型使用LongPtr。“
https://stackoverflow.com/questions/66797863
复制相似问题