计划任务切换域账号后Access VBA操作Excel报错:远程服务器不存在
问题描述
我有一个带有Autoexec宏的Access数据库,通过计划任务执行。原本使用域账号AdminA运行正常,切换为同属本地管理员组的域账号AdminB后,执行计划任务时触发报错:The remote server machine does not exist or is unavailable,该错误在执行Set objworkbook = objExcel.Workbooks.Open(strPath)后调用objWorkbook时出现。此宏用于每晚刷新并编译网络共享中的多个Excel文件,相关VBA代码如下:
Function AutoExecution() Call RefreshFolder End Function Function RefreshFolder() As String RefreshFile ("\\Server\Path\") End Function Function RefreshFile(strPath As String) As String Dim objExcel As Excel.Application Dim objworkbook As Workbook Dim strWorkbook As String Dim lCnt As Long Dim secAutomation As MsoAutomationSecurity Dim calculateTimer As Double On Error GoTo ErrorRefresh 'SECURITY SETTINGS secAutomation = Application.AutomationSecurity Application.AutomationSecurity = msoAutomationSecurityForceDisable DoCmd.SetWarnings False 'INIT RefreshFile = "True" strWorkbook = Dir(strPath & "*.xls*", vbNormal) 'LOOP ALL EXCEL FILES While strWorkbook <> "" 'UNCOMMENT TO RUN ON SINGLE FILE If strWorkbook <> "TEST_FILE" Then GoTo NextWorkbook 'TEST IF THE WORKBOOK IS READONLY If ReadOnlyWorkbook(strPath & strWorkbook) <> False Then RefreshFile = "ReadOnly" & strWorkbook GoTo NextWorkbook End If 'OPEN PROCESS Set objExcel = CreateObject("Excel.Application") objExcel.EnableEvents = False objExcel.Visible = False objExcel.DisplayAlerts = False Set objworkbook = objExcel.Workbooks.Open(strPath & strWorkbook) objworkbook.Queries.FastCombine = True 'REFRESH EVERY CONNECTIONS For lCnt = 1 To objworkbook.Connections.Count ... Next lCnt objworkbook.Close SaveChanges:=True objExcel.Quit Set objxcel = Nothing NextWorkbook: 'NEXT WORKBOOK strWorkbook = Dir Wend 'SECURITY SETTINGS DoCmd.SetWarnings True Application.AutomationSecurity = secAutomation Exit Function ErrorRefresh: Logger "RefreshFile : " & Err.Source & ", " & Err.Description, logLevel.lvlERROR, strWorkbook RefreshFile = strWorkbook Resume Next End Function
已完成排查
- AdminB账号交互式运行正常,网络权限验证通过
- AdminA账号作为计划任务运行正常
- 强制Excel DCOM使用AdminB时正常,但会影响交互式Excel使用
- 将RefreshFile()直接放在AutoExecution函数中运行正常,放在子函数中则失败
环境信息
- 操作系统:Windows Server 2016(1607)64位
- Office版本:Microsoft 365 MSO(2408)64位
解决方案建议
1. 修正对象释放的拼写错误并优化回收逻辑
代码中Set objxcel = Nothing存在拼写错误(应为objExcel),这会导致Excel进程无法正常关闭,积累后干扰后续对象创建。修正后添加短暂延迟,确保对象完全回收:
objworkbook.Close SaveChanges:=True objExcel.Quit Set objworkbook = Nothing Set objExcel = Nothing ' 非交互式会话下添加延迟,确保进程退出 Application.Wait Now + TimeValue("00:00:02")
2. 调整Excel对象的作用域
从排查结果看,子函数内的对象作用域在非交互式会话下可能被提前回收。将objExcel和objworkbook改为模块级声明,避免函数执行时对象被释放:
' 模块顶部的模块级声明 Dim objExcel As Object Dim objworkbook As Object Function RefreshFile(strPath As String) As String ' 移除函数内的Dim objExcel、Dim objworkbook声明 ... End Function
3. 改用后期绑定创建Excel对象
早期绑定依赖特定Office版本的类型库,在不同账号的非交互式会话下可能出现冲突。将早期绑定改为后期绑定:
' 替换原Dim objExcel As Excel.Application Dim objExcel As Object Set objExcel = CreateObject("Excel.Application")
4. 配置计划任务的会话与权限设置
- 打开计划任务的「常规」选项卡:勾选「不管用户是否登录都要运行」,取消勾选「不存储密码」(确保账号能访问网络共享)
- 切换到「设置」选项卡:取消勾选「如果任务运行时间超过X小时就停止」,勾选「如果任务失败,每隔10分钟重试3次」
5. 单独配置AdminB账号的Excel DCOM权限
无需修改全局DCOM设置,仅给AdminB添加必要的Excel权限:
- 打开「组件服务」→「计算机」→「我的电脑」→「DCOM配置」
- 找到「Microsoft Excel Application」,右键选择「属性」
- 在「安全」选项卡中,点击「启动和激活权限」的「编辑限制」,添加AdminB账号并赋予「本地启动」「本地激活」权限
- 同样在「访问权限」中添加AdminB账号,赋予「本地访问」权限
内容的提问来源于stack exchange,提问作者Loris Ceschin
相关产品推荐
相关产品推荐

