VBA Excel 中的代码在通过调度程序触发时不会 运行
VBA code inside Excel doesn't run when triggered via Scheduler
所以在这个 WinServer 2012 R2 64 位上的设置是:
Windows 任务计划程序 -> cscript .vbs 文件 -> 打开 excel 和 运行 主模块中的一个子模块
当我双击 .vbs 文件时,这 运行 在后台很好,但是当我通过任务调度程序触发 .vbs 时,excel 打开,但不加载文件或 运行 子文件(不确定是哪个)。任务 运行 在具有计算机管理权限的域用户下进行。当我尝试点击 .vbs
时,我使用了同一个用户
正在执行的代码 运行,顺序为:
任务计划程序启动:
C:\WINDOWS\system32\cscript.exe "D:\xyz\trigger.vbs"
.vbs 做:
Option Explicit
Dim xlApp, xlBook, xlsheets, xlcopy
Set xlApp = CreateObject("Excel.Application")
xlapp.Interactive = False
xlapp.DisplayAlerts = False
xlapp.AskToUpdateLinks = False
xlapp.AlertBeforeOverwriting = False
Set xlBook = xlApp.Workbooks.Open("D:\xyz\excelfile.xlsm")
On Error Resume Next
Call xlBook.Application.Run("Main.Extrnal_Trigger")
xlbook.Saved = True
xlBook.Close
xlApp.Quit
Set xlBook = Nothing
Set xlcopy = Nothing
Set xlApp = Nothing
WScript.Quit(1)
Excel代码:
Sub Extrnal_Trigger()
Application.EnableEvents = False
Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False
Call update_button
Call MainProgram
Call ReportSave
End Sub
如何找出 .vbs 或 excel 挂起的位置以及原因?在另一台机器上进行非常相似的设置 运行 没有问题。它实际上与此处引用的代码相同。
我知道有几个不好的做法(比如不清理 xlapp 设置),但我想在清理之前获取进程 运行ning。
/编辑:
删除
On Error Resume Next
来自.vbs 不显示错误。
/edit2:
我试着尽可能往后退。
Option Explicit
Dim fso, f, s, log
Set fso = CreateObject("Scripting.FileSystemObject")
Set log = fso.CreateTextFile("D:\xyz\TESTlog.txt")
log.WriteLine "before fso"
Set f = fso.GetFile("D:\xyz\excel.xlsm")
s = f.Path & " "
s = s & "Created: " & f.DateCreated & " "
s = s & "Last Accessed: " & f.DateLastAccessed & " "
s = s & "Last Modified: " & f.DateLastModified
log.WriteLine "after fso"
log.writeline "fso content"
log.writeline s
这在任务调度程序通过 cscript.exe 触发时有效。
我将尝试修改以记录调用 excel 文件时发生的情况。
/edit3:
调试显示这个
Set xlBook = xlApp.Workbooks.Open("D:\xyz\excel.xlsm")
永远不会发生。我列出了错误编号,并收到了此调用的错误 1004。仍然不确定是什么问题,但至少我现在得到了一个错误编号。
/edit4:
尝试将此作为计划任务时 运行 错误 1004 仍然存在。当我通过双击 .vbs 来 运行 时,一切正常。
关键是创建这两个文件夹:
C:\Windows\System32\config\systemprofile\Desktop
和
C:\Windows\SysWOW64\config\systemprofile\Desktop
当这些文件夹不存在时,Excel 在非交互模式下显然有问题 运行(不知道为什么)。创建它们消除了通过 vbs 打开工作簿时的 1004 错误。
所以在这个 WinServer 2012 R2 64 位上的设置是:
Windows 任务计划程序 -> cscript .vbs 文件 -> 打开 excel 和 运行 主模块中的一个子模块
当我双击 .vbs 文件时,这 运行 在后台很好,但是当我通过任务调度程序触发 .vbs 时,excel 打开,但不加载文件或 运行 子文件(不确定是哪个)。任务 运行 在具有计算机管理权限的域用户下进行。当我尝试点击 .vbs
时,我使用了同一个用户正在执行的代码 运行,顺序为:
任务计划程序启动:
C:\WINDOWS\system32\cscript.exe "D:\xyz\trigger.vbs"
.vbs 做:
Option Explicit
Dim xlApp, xlBook, xlsheets, xlcopy
Set xlApp = CreateObject("Excel.Application")
xlapp.Interactive = False
xlapp.DisplayAlerts = False
xlapp.AskToUpdateLinks = False
xlapp.AlertBeforeOverwriting = False
Set xlBook = xlApp.Workbooks.Open("D:\xyz\excelfile.xlsm")
On Error Resume Next
Call xlBook.Application.Run("Main.Extrnal_Trigger")
xlbook.Saved = True
xlBook.Close
xlApp.Quit
Set xlBook = Nothing
Set xlcopy = Nothing
Set xlApp = Nothing
WScript.Quit(1)
Excel代码:
Sub Extrnal_Trigger()
Application.EnableEvents = False
Application.AskToUpdateLinks = False
Application.DisplayAlerts = False
Application.AlertBeforeOverwriting = False
Call update_button
Call MainProgram
Call ReportSave
End Sub
如何找出 .vbs 或 excel 挂起的位置以及原因?在另一台机器上进行非常相似的设置 运行 没有问题。它实际上与此处引用的代码相同。
我知道有几个不好的做法(比如不清理 xlapp 设置),但我想在清理之前获取进程 运行ning。
/编辑: 删除
On Error Resume Next
来自.vbs 不显示错误。
/edit2: 我试着尽可能往后退。
Option Explicit
Dim fso, f, s, log
Set fso = CreateObject("Scripting.FileSystemObject")
Set log = fso.CreateTextFile("D:\xyz\TESTlog.txt")
log.WriteLine "before fso"
Set f = fso.GetFile("D:\xyz\excel.xlsm")
s = f.Path & " "
s = s & "Created: " & f.DateCreated & " "
s = s & "Last Accessed: " & f.DateLastAccessed & " "
s = s & "Last Modified: " & f.DateLastModified
log.WriteLine "after fso"
log.writeline "fso content"
log.writeline s
这在任务调度程序通过 cscript.exe 触发时有效。 我将尝试修改以记录调用 excel 文件时发生的情况。
/edit3: 调试显示这个
Set xlBook = xlApp.Workbooks.Open("D:\xyz\excel.xlsm")
永远不会发生。我列出了错误编号,并收到了此调用的错误 1004。仍然不确定是什么问题,但至少我现在得到了一个错误编号。
/edit4:
尝试将此作为计划任务时 运行 错误 1004 仍然存在。当我通过双击 .vbs 来 运行 时,一切正常。
关键是创建这两个文件夹:
C:\Windows\System32\config\systemprofile\Desktop
和
C:\Windows\SysWOW64\config\systemprofile\Desktop
当这些文件夹不存在时,Excel 在非交互模式下显然有问题 运行(不知道为什么)。创建它们消除了通过 vbs 打开工作簿时的 1004 错误。