|
本帖最后由 盗梦 于 2015-6-25 17:21 编辑
Office32位和Office64位表面上没有什么区别。
实际上,在vba方面要注意的是API和个别函数的使用。(该vba包括 Access vba,Excel vba,Word vba,PPT vba等)
以下是我最近写代码发现并总结出来的。
首先,说说API。
例如,在Office32位中API是这样声明的:
- Private Declare Function GetModuleHandleA Lib "kernel32" _
- (ByVal lpModuleName As String) As Long
复制代码 而在Office64位需要在 Function 或者 Sub 前面加一个关键字,PtrSafe :
- Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" _
- (ByVal lpModuleName As String) As Long
复制代码
PtrSafe 是 “指针安全” 的意思,到了64位,受影响最大的就是指针。
你可能会跳出了说vba没有指针。
实际上很多API函数是由C/C++编写的,内部实现机制有些会用到指针。
当然,同样的代码,你不想写两个文件,可以这么做:
- #If vba7 Then
- '64位的代码
- Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" _
- (ByVal lpModuleName As String) As Long
- #Else
- '32位的代码
- Private Declare Function GetModuleHandleA Lib "kernel32" _
- (ByVal lpModuleName As String) As Long
- #End If
复制代码
这个披上 # 号的 条件结构 叫作 “条件编译”,也就是系统在编译的时候就去判断里面的条件,选择性编译。
这样处理就可以实现32位Office和64位Office 代码兼容问题。
除此之外,还有3点要注意:
1、 AddressOf 函数
在32位Office中,AddressOf 函数返回的类型是 Long;
而在64位Office中,将返回 LongPtr 类型。这个类型也是一种指针类型。
所以,调试编辑的时候,提示AddressOf 类型不符合的时候,就是返回的类型和你API函数的参数类型不一致。这是只需要把API函数对应的变量类型改为 LongPtr 即可。
2、VarPtr函数,ObjPtr函数,StrPtr函数
这三个函数也是同样的道理,在64位将返回 LongPtr类型。
3、部分属性也要注意
像 Application.Hinstance ,在64位Office要用 Application.HinstancePtr 才不会出错。
这种在64位vba写代码时候,代码提示发现有一个一样的属性名,但这个属性名后面跟着 Ptr 后缀,不用看了,用它就没错了。
|
|