[VBA教程] 含API引用的VBA作品兼容64位系统的方法
来源:互联网 发布:天气数据接口 编辑:程序博客网 时间:2024/06/02 16:27
经过查阅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转成数组保存并在程序中定位调用,由于数据量少,影响不大。
等找到方法解决后,再跟大家分享。
- [VBA教程] 含API引用的VBA作品兼容64位系统的方法
- 【VBA】34. 一个简单的VBA宏(含按钮)
- VBA的Word参考教程
- VBA代码引用工作表的方法探讨
- VBA 字符串的处理方法
- vba的单元格引用的总结
- vba的单元格引用的总结
- vba ppt 系统菜单的二种调用方法
- 在VBA中引用excel的函数
- Excel VBA VBA去重复的几种方法
- Office API VBA的常用链接
- 如何保护VBA作品
- Excel VBA教程:GetOpenFilename方法
- Word VBA教程:Close方法
- Excel VBA 2003和 Excel VBA 2007不兼容的一个例子: 文件搜索
- 【VBA研究】Excel在64位系统安装目录造成的ORA-06413:连接未打开错误
- VBA调用系统文件夹选择的窗口
- VBA教程
- 关于tableView复用的问题
- 以套磁为名--记那些申请中有效获取信息的方法
- 关于MYSQL 表相关的操作
- 临时保存
- Remove Duplicates from Sorted List I II
- [VBA教程] 含API引用的VBA作品兼容64位系统的方法
- Saving HDU(2111)
- 有关卡特兰数
- 深度优先搜索DFS/广度优先搜索BFS的一个应用实例(华为编程大赛赛题)
- Linux网络编程案例
- 要谨记遇到小数点,要用double,不能先用double
- 算法复杂度总结表
- hdu1353 小暴力
- 学习java的简单例子之万年历