1

I am not experienced at vba so thank you for understanding.

I tested some old macros in office 365, previously I worked with excel 2016.

I read that some macros might not work properly because of the Long variable declaration. - As I understand correctly Long has 4bit and LongLong has 8bit. There is also sth like ►<code>LongPtr which has 4bit-when other than VBA7 and 8bit-in VBA7.

My question is as follows: how it is possible that in excel365 I can still use a normal Long variable?

enter image description here

4

1 回答 1

2

Long数据类型没有死

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

您可能指的是使用API 函数(API - 应用程序编程接口)您必须照顾不同的环境。这些系统函数确实需要 指向→句柄或 →内存位置的指针LongPtr类型(注意特殊前缀!)。PtrSafe

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

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

LongPtr声明的进一步说明

由于窗口句柄LongPtrOffice 2010或更高版本中以及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 变量。如果您通过条件编译常量来区分版本,您也必须在自己的过程中使用引用变量。

相关链接

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

在以下帖子中引用@GSerg:

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

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

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

于 2021-04-27T14:08:11.503 回答