Access 2019按钮调用Shell运行odbcad32.exe打开ODBC管理器失效
故障原因
- 该问题由64位Windows系统的文件重定向机制、ODBC管理器多版本共存的特性共同导致,
Shell函数本身无异常,这也是替换为notepad.exe可以正常启动记事本的核心原因:记事本程序默认在系统全局搜索路径中,不存在多版本路径寻址冲突。 - 64位Windows系统内置两个独立的ODBC数据源管理器程序,文件名均为
odbcad32.exe,但存放路径和作用完全不同:- 64位ODBC管理器存放路径为
C:\Windows\System32\odbcad32.exe,用于管理64位程序的ODBC数据源 - 32位ODBC管理器存放路径为
C:\Windows\SysWOW64\odbcad32.exe,用于管理32位程序的ODBC数据源
- 64位ODBC管理器存放路径为
- 当安装的Access 2019为32位版本时,直接调用不带全路径的
odbcad32.exe会触发WOW64层的文件系统重定向,导致程序寻址失败无法拉起;即便是64位Access,在部分精简系统、受限权限配置场景下,未写全路径的程序调用也会因为Path变量优先级问题出现启动失败。
解决方法
最稳定的方案是在调用时写死对应版本的ODBC管理器全路径,跳过系统路径搜索和重定向逻辑,根据自己安装的Office版本选择对应代码即可:
- 32位Access 2019场景(个人用户安装的默认版本多为该类型),使用如下代码:
Private Sub Command210_Click() Dim RetVal RetVal = Shell("C:\Windows\SysWOW64\odbcad32.exe", 1) End Sub
- 64位Access 2019场景,使用如下代码:
Private Sub Command210_Click() Dim RetVal RetVal = Shell("C:\Windows\System32\odbcad32.exe", 1) End Sub
补充提示:如果需要按钮自动适配Office和系统位数,避免硬编码系统盘路径在特殊分区配置下失效,可以额外增加环境变量读取、系统位数判断逻辑动态拼接程序路径。
内容的提问来源于stack exchange,提问作者sgs2022
相关产品推荐
相关产品推荐

