[VBA教程] 含API引用的VBA作品兼容64位系统的方法

来源:互联网 发布:天气数据接口 编辑:程序博客网 时间:2024/06/02 16:27

用了office vba五年多了,很喜欢。自从微软有64系统后,发现以前很多作品无法正常运行了。
经过查阅office2010 vba开发人员参考手册,实用#if 语句进行有选择的编译。示例代码如下:

#If VBA7 Then'定义窗体样式Private Declare PtrSafe Function FindWindow Lib "user32" Alias _    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare PtrSafe Function SetWindowLong Lib "user32" Alias _    "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long#Else'定义窗体样式Private Declare Function FindWindow Lib "user32" Alias _    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function SetWindowLong Lib "user32" Alias _    "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long#End If

经过以上处理,我的作品(主要是ppt和excel)在office2003、2007和2010版本、xp以上系统均可正常运行。

office2013未进行测试,我想应该也是可以的。


近期由于操作系统升级到64位,同时试用AutoCAD2014版本,原来的一些VBA程序运行上出了一些问题:

1) Declear声明语句无法正常运行。
    查了一些资料,发现可以使用Declare PtrSafe来代替原来的Declear以解决这个问题。如原来32位的:
Private Declare Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean
在64位系统中,需要写成:
Private Declare PtrSafe Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean

这样问题好象解决了,其实问题还没有解决,因为怎样让同一程序能够在32位系统和64位系统中兼容又是个问题。
当然,最终还是找到方法:



#If VBA7 ThenPrivate Declare PtrSafe Function acedSetColorDialog Lib _   "acad.exe" (color As Long, ByVal bAllowMetaColor _   As Boolean, ByVal nCurLayerColor As Long) As Boolean#ElsePrivate Declare Function acedSetColorDialog Lib _   "acad.exe" (color As Long, ByVal bAllowMetaColor _   As Boolean, ByVal nCurLayerColor As Long) As Boolean#End If


我们可以看到,这里用了一个系统变量“VBA7”,通过这个变量可以辨别VBA系统是否为VBA7,并通过这个判断来加载不同的语句。另外还有一个变量是“WIN64”,这个变量可以辨别系统是否为WIN64位系统,并通过它来加载不同的语句。

为什么这里用了VBA7而不是用WIN64变量呢,那是因为在2014版以前,虽然是Win64系统,但实际上VBA还是32位系统,Declear声明并不需要加上PtrSaft,所以通过VBA7来着判断会更为准确。

有个不完美的地方是,VBA7中对于没有加入PtrSaft的Declear的代码都标注为有误并显示红色,不过还好,显示归显示,运行还是给运行的,因为通过前面的判断语句,那句错误的语句并不会运行到,所以运行时不会出错。
以上解决方法具体说明链接:http://bbs.mjtd.com/thread-100890-1-1.html

2) 数据库连接ADO以及DAO方式都无法使用。
这项问题到目前找不到解决方案,还在找,不过象我的那个塑料公差标注程序,原来用了ACCESS数据库,由于VBA7是真64位,那些32位的数据库连接方式都彻底失效,而微软又没有针对64位出数据库连接方式(目前还未搜索到),所以只能改成非数据库方式运行,把数据全部变成字符串并通过split转成数组保存并在程序中定位调用,由于数据量少,影响不大。
等找到方法解决后,再跟大家分享。



0 0
原创粉丝点击