You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计划任务切换域账号后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权限:

  1. 打开「组件服务」→「计算机」→「我的电脑」→「DCOM配置」
  2. 找到「Microsoft Excel Application」,右键选择「属性」
  3. 在「安全」选项卡中,点击「启动和激活权限」的「编辑限制」,添加AdminB账号并赋予「本地启动」「本地激活」权限
  4. 同样在「访问权限」中添加AdminB账号,赋予「本地访问」权限

内容的提问来源于stack exchange,提问作者Loris Ceschin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:25:03