[VBA教程] 含API引用的VBA作品兼容64位系统的方法
2014-08-25 20:09
513 查看
用了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 Long Private 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 Long Private 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转成数组保存并在程序中定位调用,由于数据量少,影响不大。
等找到方法解决后,再跟大家分享。
相关文章推荐
- jz2440 win7 64位系统mini usb驱动无法兼容的解决方案,及其使用u-boot烧写Nand-flash的方法
- 用U盘制作并安装WIN10 64位原版系统的详细教程(该方法应该适用于任何一版的原版操作系统)
- Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法
- ubuntu系统学习之:64位ubuntu系统安装32位兼容库ia32-libs的方法
- win7 64位纯净版系统c盘空间显示与实际占用空间不对的解决方法图文教程
- 引用 Google Maps API 简单应用之几个有用的方法
- Excel VBA教程:GetOpenFilename方法
- 最常用的10种CSS BUG解决方法与技巧-浏览器兼容教程
- 0 WINDOWS系统 + Apache +PHP5 +Zend + MySQL + phpMyAdmin安装方法(视频教程)
- 【搜集】知道自己的电脑是32位系统还是64位系统的方法
- 如何知道自己的系统是32位的还是64位的图文方法
- VBA中常用对象的访问(二) 引用方法介绍
- 64位系统下解决vmwarec 5.5.5 cpu专用率过高的方法
- linux(ubuntu 10.10) 64位系统 gcc编译(c)成32位(静态)可执行应用程序的方法
- Cadence Allegro/Orcad 电路板方案全系列完美破解的特别说明(包括64位系统破解方法)
- 64位系统编译radiusplugin出现问题解决方法
- VBA中代码加载引用(Reference DLL)方法实践
- VC程序里判断系统是64位还是32位的正确方法.
- VBA代码引用工作表的方法探讨
- VC程序里判断系统是64位还是32位的正确方法.