在BarTender中嵌入VBA代码执行Access删除查询报错求助
解决BarTender触发执行Access删除查询的问题
首先明确你的核心需求:在BarTender处理打印任务时,自动执行MS Access 2013数据库C:\Users\text\Documents\PrintCenterForm\PrintCernter_v1.accdb中的删除查询Qry_DeletePrinted。我先帮你分析之前代码的问题,再给出两种可直接使用的方案。
之前代码的错误原因
第一段ADODB代码的问题
报错:"Command text was not set for the command object."
你创建了ADODB.Command对象,但没有告诉它要执行什么内容——也就是缺少cmd.CommandText的赋值,系统不知道要运行哪个查询,所以抛出这个错误。
第二段Access.Application代码的问题
报错:"ActiveX component can't create object: 'Access.Application'"
- 拼写错误:
createObject("Access.Applicaiton")里的Applicaiton多写了一个i,正确是Application - 路径错误:代码里的
PrintCernter_v 1.accdb多了一个空格,和实际数据库文件名不符 - 对象创建冲突:同时用了
GetObject和CreateObject,导致对象初始化混乱
可行解决方案
方案1:用ADODB直接执行查询(推荐,轻量无界面)
这个方法不需要启动Access软件,直接通过数据库连接执行查询,速度更快:
Public Sub ExecuteDeleteQuery() Dim cn, cmd ' 初始化数据库连接和命令对象 Set cn = CreateObject("ADODB.Connection") Set cmd = CreateObject("ADODB.Command") ' 构建连接字符串(注意路径要和实际完全一致) Dim connStr connStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\text\Documents\PrintCenterForm\PrintCernter_v1.accdb;" ' 尝试连接数据库 On Error Resume Next cn.Open connStr If Err.Number <> 0 Then MsgBox "数据库连接失败:" & Err.Description Exit Sub End If On Error GoTo 0 ' 指定要执行的删除查询 cmd.ActiveConnection = cn cmd.CommandText = "Qry_DeletePrinted" cmd.CommandType = 4 ' 表示执行Access存储查询 ' 执行查询并处理错误 On Error Resume Next cmd.Execute If Err.Number <> 0 Then MsgBox "查询执行失败:" & Err.Description Else MsgBox "删除查询执行成功" End If On Error GoTo 0 ' 清理资源 cn.Close Set cmd = Nothing Set cn = Nothing End Sub
方案2:通过Access.Application执行查询(适合依赖Access环境的场景)
如果你的查询用到了Access专属函数,或者需要模拟手动操作Access的场景,可以用这个方法:
Public Sub RunAccessDeleteQuery() Dim accessApp Dim dbPath dbPath = "C:\Users\text\Documents\PrintCenterForm\PrintCernter_v1.accdb" ' 尝试创建Access应用对象 On Error Resume Next Set accessApp = CreateObject("Access.Application") If Err.Number <> 0 Then MsgBox "无法启动Access:" & Err.Description & vbCrLf & "请确认已安装MS Access 2013" Exit Sub End If On Error GoTo 0 ' 打开目标数据库(false表示共享模式,true为独占模式) accessApp.OpenCurrentDatabase dbPath, False ' 执行指定查询 On Error Resume Next accessApp.Run "Qry_DeletePrinted" If Err.Number <> 0 Then MsgBox "执行查询失败:" & Err.Description Else MsgBox "删除查询执行成功" End If On Error GoTo 0 ' 关闭数据库并退出Access accessApp.CloseCurrentDatabase accessApp.Quit ' 释放对象资源 Set accessApp = Nothing End Sub
关键注意事项
- 路径准确性:务必确保数据库路径完全正确,没有拼写错误或多余空格;如果路径包含空格,需要用双引号包裹,比如
dbPath = """C:\My Docs\PrintCernter_v1.accdb""" - 权限设置:运行BarTender的用户需要拥有数据库文件的读写权限,否则会出现访问被拒绝的错误
- 触发事件选择:推荐使用
OnPrintJobEnd事件(打印完成后执行),避免OnPrintJobStart在打印前删除数据导致内容缺失;如果用OnNewRecord,要确认触发时机符合你的业务逻辑 - 驱动兼容性:确保安装了
Microsoft.ACE.OLEDB.12.0驱动(Access 2013默认自带),如果是64位系统,要保证BarTender的位数(32/64位)和驱动位数一致
内容的提问来源于stack exchange,提问作者Sebastian




