Can';t在计划任务中使用vba关闭Excel应用程序
我用vba编写了一个代码,它可以与不同的Can';t在计划任务中使用vba关闭Excel应用程序,vba,excel,scheduled-tasks,Vba,Excel,Scheduled Tasks,我用vba编写了一个代码,它可以与不同的工作簿和工作表一起使用。此代码必须在计划任务中执行。但出于一个未知的原因,我有一个问题: 当我手动执行它时,它工作正常,excel自动关闭。但对于我的计划任务,Excel会关闭所有工作簿和工作表,但它保持打开状态。 这是我的密码: Set xlApp = GetObject(, "excel.application") Set wkbMe = xlApp.ActiveWorkbook test = False xlApp.
工作簿
和工作表
一起使用。此代码必须在计划任务中执行。但出于一个未知的原因,我有一个问题:
当我手动执行它时,它工作正常,excel自动关闭。但对于我的计划任务,Excel会关闭所有工作簿
和工作表
,但它保持打开状态。
这是我的密码:
Set xlApp = GetObject(, "excel.application")
Set wkbMe = xlApp.ActiveWorkbook
test = False
xlApp.DisplayAlerts = False
xlApp.AskToUpdateLinks = False
'Open files
xlApp.Workbooks.Open Filename:=MarketDataPath & WbRiskedge, ReadOnly:=True
xlApp.Workbooks.Open Filename:=MarketDataPath & WbMarketData, ReadOnly:=True
Set WorksheetIncoming = xlApp.Workbooks(WbMarketData).Worksheets(wsIncoming)
Set WorksheetMarketdata = xlApp.Workbooks(WbMarketData).Worksheets(WsMarketData)
xlApp.Workbooks.Open Filename:=GTPath & WbGoodTime, ReadOnly:=True
Cells.Copy
WorksheetIncoming.Activate
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Workbooks(WbGoodTime).Close
WorksheetMarketdata.Calculate
Worksheets(wsMarketDataForWebsite).Calculate
Worksheets(wsMarketDataForWebsite).Activate
If test = False Then
Application.Run "MarketEnv.xlsm!subCreateCSV"
End If
Workbooks(WbMarketData).Close , False
Workbooks(WbRiskedge).Close , False
xlApp.DisplayAlerts = True
xlApp.AskToUpdateLinks = True
ThisWorkbook.Save
ThisWorkbook.Saved = True
xlApp.Quit
End Sub
我尝试过在网上找到的不同解决方案,但都不管用。即使我只做了:
Set xlApp = GetObject(, "excel.application")
xlApp.Quit
End Sub
我的excel保持打开状态
有人能帮我吗?好吧,这似乎是长篇大论。。。但事情是这样的 您看到的问题是,在给定时间,一台计算机上可能有多个Excel应用程序实例 手动运行文件时,可能会使用默认行为,即直接打开工作簿时,它会在已加载的Excel应用程序中打开 这意味着当您使用:
Set xlApp = GetObject(, "excel.application")
它实际上返回的是当前的Excel.Application
。
但是,当您通过计划任务加载它时,它会生成一个新的Excel.Application
,以处理您的任务。当它调用我引用的代码时,它最终会引用您已经打开的Excel.Application
由于计划的工作簿正在不同的Excel.Application
实例中运行,因此当您运行xlApp.Quit
时,它只会退出其他Excel,而不是实际运行代码的Excel
如果您还想关闭自动Excel,则需要将应用程序。退出
添加到sub的末尾。是的,我的意思是同时使用xlApp。退出
和应用程序。退出
从技术上讲,加载新的Excel应用程序时,可以打开多个Excel应用程序。如果要关闭所有Excel实例,我知道的最简单的方法是通过对这样一个程序的vbscript调用来终止所有名为Excel.exe的进程,从而杀死所有Excel实例。注意:我没有在Win 7上对此进行测试:
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill, strFilePath
strComputer = "."
strProcessKill = "'excel.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill)
For Each objProcess In colProcess
objProcess.Terminate
Next
WScript.Quit
编辑:我只是想补充一点,您可以通过执行以下操作手动复制计划任务的行为:
Excel.exe[带引号的工作簿路径]
On Error Resume Next
Dim xlApp
Set xlApp = GetObject(, "Excel.Application")
Do While Err.Number <> 429
'For each wb in xlApp.Workbooks
' wb.saved = true
'next
xlApp.Quit
Set xlApp = Nothing
Set xlApp = GetObject(, "Excel.Application")
Loop
Wscript.quit
好吧,这似乎是长篇大论。。。但事情是这样的 您看到的问题是,在给定时间,一台计算机上可能有多个Excel应用程序实例 手动运行文件时,可能会使用默认行为,即直接打开工作簿时,它会在已加载的Excel应用程序中打开 这意味着当您使用:
Set xlApp = GetObject(, "excel.application")
它实际上返回的是当前的Excel.Application
。
但是,当您通过计划任务加载它时,它会生成一个新的Excel.Application
,以处理您的任务。当它调用我引用的代码时,它最终会引用您已经打开的Excel.Application
由于计划的工作簿正在不同的Excel.Application
实例中运行,因此当您运行xlApp.Quit
时,它只会退出其他Excel,而不是实际运行代码的Excel
如果您还想关闭自动Excel,则需要将应用程序。退出
添加到sub的末尾。是的,我的意思是同时使用xlApp。退出
和应用程序。退出
从技术上讲,加载新的Excel应用程序时,可以打开多个Excel应用程序。如果要关闭所有Excel实例,我知道的最简单的方法是通过对这样一个程序的vbscript调用来终止所有名为Excel.exe的进程,从而杀死所有Excel实例。注意:我没有在Win 7上对此进行测试:
Dim objWMIService, objProcess, colProcess
Dim strComputer, strProcessKill, strFilePath
strComputer = "."
strProcessKill = "'excel.exe'"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill)
For Each objProcess In colProcess
objProcess.Terminate
Next
WScript.Quit
编辑:我只是想补充一点,您可以通过执行以下操作手动复制计划任务的行为:
Excel.exe[带引号的工作簿路径]
On Error Resume Next
Dim xlApp
Set xlApp = GetObject(, "Excel.Application")
Do While Err.Number <> 429
'For each wb in xlApp.Workbooks
' wb.saved = true
'next
xlApp.Quit
Set xlApp = Nothing
Set xlApp = GetObject(, "Excel.Application")
Loop
Wscript.quit
我可以看到您已使用excel应用程序打开了多个工作簿实例。您需要关闭所有工作簿实例以获取纯excel应用程序,然后退出它 试试这个:(伪代码) 以上代码将打开您的工作簿。在工作表上编写自定义消息
保存更改并关闭。xlapp也将被终止/销毁。我可以看到您已经用excel应用程序打开了多个工作簿实例。您需要关闭所有工作簿实例以获取纯excel应用程序,然后退出它 试试这个:(伪代码) 以上代码将打开您的工作簿。在工作表上编写自定义消息
保存更改并关闭。xlapp也将被终止/销毁。您的代码在计划任务中是如何启动的?操作:启动程序:“\\192.168.1.199\RunMarketdata.xlsm”。之后是我的自动打开函数,它执行我的代码。我有Windows7x64和OfficeX32A可能的解决方法是使用停止任务,如果它运行了。。。选择权