首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >兼容32位excel和64位excel (office 365)

兼容32位excel和64位excel (office 365)
EN

Stack Overflow用户
提问于 2021-03-25 10:46:15
回答 1查看 664关注 0票数 1

我在vba没有经验,所以谢谢你的理解。

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

我读到一些宏可能因为Long变量声明而不能正常工作。正如我正确理解的那样,Long有4位,LongLong有8位。还有像LongPtr这样的东西,它在VBA7中有4位(除了VBA7还有8位)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

代码语言:javascript
复制
#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。“

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66797863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档