Access交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • VB用PrevInstan..
  • API中VB字符串作参数传..
  • API获取网卡地址
  • Access利用api实现..
  • Access获取网卡物理地..
  • 弹出选择目录对话框

最新文章

  • Access API函数分..
  • Access VBA 注册..
  • Access Excel ..
  • 毫秒级和纳秒级计时的API..
  • 一种比GetTickCou..
  • VB用PrevInstan..

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > 模块/函数/VBA/API/系统 > API/COM/系统相关
API/COM/系统相关

Access Excel VBA程序同时兼容32位和64位的解决办法

作者:tmtony

来源:Access中国


全世界有很多微软的VB和VBA爱好者,这是一个相当大的人群,即使微软一直在强化Dotnet开发工具,如C#,vb.net,但因为VBA使用者太多了,如Access VBA,Excel VBA,AutoCAD VBA等等,而且还有很多VBA的重度患者,所以即使微软多想改变Office,但Office VBA还是一如既往地保存了下来。但自从微软有64位系统之后,很多以前32位的相关VBA程序就遇到兼容性的问题。


现在可能通过 使用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位 Access Excel或 Office呢


可以通过预编译语句来实现 #If #Else #End If 就是预编译语句,只在编译过程中起作用,程序执行时不起作用

如下面的2个示例


同时兼容32位和64位 Access Excel VBA示例1

#If VBA7 Then

    Private Declare PtrSafe Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA" (ByVal hdc As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As LongPtr, LParam As Any) As Long

    

    Private Declare PtrSafe Function GetFocus Lib "user32" () As Long

    Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As Long) As Long

    Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long

#Else

    Private Declare Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA" (ByVal hdc As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As Long, LParam As Any) As Long

    

    Private Declare Function GetFocus Lib "user32" () As Long

    Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long

    Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long

#End If


同时兼容32位和64位 Access Excel VBA示例2

#If VBA7 Then

    'Return the argument to workaround limitations of AddressOf operator

    Private Function GetAddress(nAddress As LongPtr) As LongPtr

        GetAddress = nAddress

    End Function

#Else

    'Return the argument to workaround limitations of AddressOf operator

    Private Function GetAddress(nAddress As Long) As Long

        GetAddress = nAddress

    End Function

#End If


相关注意:

1) 可以看到,代码里使用了一个系统变量“VBA7”,通过这个变量可以辨别VBA系统是否为VBA7,并通过这个判断来加载不同的语句。

另外还可以使用另一个变量是“WIN64”,这个变量可以辨别系统是否为WIN64位系统,并通过它来加载不同的语句。


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


3)大家如果把代码写到VBE编辑器里,会发现有个不完美的地方是,VBA7中对于没有加入PtrSaft的Declear的代码都标注为有误并显示红色,不过还好,显示归显示,运行还是给运行的,因为通过前面的判断语句,那句错误的语句并不会运行到,所以运行时不会出错


通过以上的方法可以完美解决Access Excel Autocad 等VBA程序同时兼容32位和64位的解决办法


另如果是程序中使用了ADO连接ACCESS数据库,由于VBA7是真64位,那些32位的数据库连接方式都彻底失效,所以也要使用64位的连接驱动。

可以参考这篇文章:

64位windows系统如何使用64位的ADO连接Accesss accdb数据库(ACE.OLEDB)

http://www.access-cn.com/info/3661-cn.html


 


发布人:zstmtony  
分享到:
点击次数:  更新时间:2017-05-28 06:43:00  【打印此页】  【关闭】
上一条:完美解决“无法装载这个对象”的困扰  下一条:64位windows系统如何使用64位的ADO连接Accesss accdb数据库(ACE.OLEDB)



相关文章

  • • Access API函数分享
  • • Access VBA 注册表操作源码
  • • 毫秒级和纳秒级计时的API--timeGetTime、GetTickCount、QueryPerformanceCounter
  • • 一种比GetTickCount 和Timer更精确的计时器
  • • VB用PrevInstance和DDE实现禁止多个实例同时打开并传递命令
  • • 获取版本号及判断是否运行版本
  • • API获取网卡地址

热门文章

  • [2011-10-08] VBA保存剪贴板为JPG(加PrtScrn截屏)access数据库
  • [2006-11-23] 利用API函数实现特殊窗体的两种方法access数据库
  • [2017-08-29] Access API函数分享access数据库
  • [2013-11-08] 应用程序开机自动启动(注册表操作技巧)access数据库
  • [2004-11-23] 获取本机机器名access数据库
  • [2009-07-13] 在VB中使用API函数(什么是API? )access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

Access交流网 版权所有 1999-2018 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2023  www.metinfo.cn