Word 2021 64位VBA数据库连接代码无法运行问题

故障原因
代码无法在64位Word 2021运行是两类问题共同导致的:
- 代码本身存在多处变量/对象名不匹配、逻辑遗漏的错误,在32位Word 2013的宽松VBA容错规则下碰巧未触发报错,64位环境下容错规则收紧直接失效:
OdbcConnection函数的形参均为Ace前缀命名,函数内部却调用了不存在的Benz前缀变量CloseDatabase过程中调用的Acedb对象和全局定义的Benzdb对象名不匹配- 自定义函数
OdbcConnection最终没有把拼接好的连接字符串作为返回值赋值给函数名,32位环境下靠隐式公共变量传递碰巧能拿到值
- 旧版DAO 3.6组件仅支持32位Office,64位Office不兼容该类库,无法直接识别
Database、Workspaces等对象类型。
修复步骤
- 打开VBA编辑器(按
Alt+F11调出),点击顶部菜单「工具」-「引用」,取消勾选旧版Microsoft DAO 3.6 Object Library,勾选版本号最高的Microsoft Office [版本号] Access Database Engine Object Library(Word 2021对应16.0版本)。 - 确认配置的ODBC数据源为64位版本:打开系统的「ODBC数据源管理器(64位)」,确认名称为
Benz的DSN存在、连接参数配置正确,32位DSN无法被64位Office识别。 - 将原有代码替换为以下修正版本:
' 强制变量声明,从根源避免变量名拼写错误 Option Explicit Public Benzdb As DAO.Database Public sconnection As String Sub ConnecttoDatabase() 'Production System ODBC sconnection = OdbcConnection("dbBenz", "Benz", "username", "password") Set Benzdb = DBEngine.Workspaces(0).OpenDatabase("Benz", False, False, sconnection) End Sub Sub CloseDatabase() ' 增加对象存在性判断,避免无有效连接时触发报错 If Not Benzdb Is Nothing Then Benzdb.Close Set Benzdb = Nothing End If End Sub Public Function OdbcConnection(ByVal AceDatabaseName As String, ByVal AceDataSourceName As String, ByVal Aceuserid As String, ByVal AcePassWord As String) As String ' 统一形参引用,修正返回值赋值逻辑 OdbcConnection = "ODBC" _ & ";DATABASE=" & AceDatabaseName _ & ";UID=" & Aceuserid _ & ";PWD=" & AcePassWord _ & ";DSN=" & AceDataSourceName End Function
额外说明
64位Office环境下VBA默认收紧了隐式变量声明的宽松规则,所有VBA项目建议默认在模块开头添加Option Explicit,可以第一时间发现变量名拼写错误,避免跨版本运行时出现无提示的逻辑故障。
内容的提问来源于stack exchange,提问作者S Mares
相关产品推荐
相关产品推荐

