无法在计划任务中使用vba关闭Excel App

Adr*_* A. 1 excel vba scheduled-tasks excel-vba

我在vba中创建了一个代码,它与不同的WorkbooksWorksheets.此代码必须在计划任务中执行.但是由于一个不可知的原因,我有一个问题:

当我手动执行它时,它工作正常,excel关闭自己.但是根据我的预定任务,Excel会关闭所有内容Workbooks,Worksheets但它会保持打开状态.在这里你有我的代码:

    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
Run Code Online (Sandbox Code Playgroud)

我尝试过在网络上找到的不同解决方案,但没有任何效果.即使我只做:

 Set xlApp = GetObject(, "excel.application")
 xlApp.Quit
 End Sub
Run Code Online (Sandbox Code Playgroud)

我的excel保持开放.

任何人都可以帮助我PLZ?

Dan*_*iel 5

好吧,这似乎已经啰嗦......但是这里有.

您遇到的问题是因为在给定时间内计算机上可能有多个Excel应用程序实例.

当您手动运行该文件时,您可能正在使用默认行为,即当您直接打开工作簿时,它会在您已加载的Excel应用程序中打开.

这意味着当您使用时:

Set xlApp = GetObject(, "excel.application")
Run Code Online (Sandbox Code Playgroud)

它实际上是返回当前的Excel.Application.但是,当您通过计划任务加载它时,它会生成一个新Excel.Application的以处理您的任务.当它调用我引用的代码时,它最终引用Excel.Application你已经打开的代码(可能).

由于您的计划工作簿在不同的实例中Excel.Application运行,xlApp.Quit因此当您运行它时,只退出其他Excel,而不是实际运行代码的Excel.

如果您还要关闭自动Excel,则需要添加Application.Quit到sub的末尾.是的,我的意思是同时使用xlApp.QuitAND Application.Quit.

从技术上讲,您可以在加载新应用程序时打开多个Excel应用程序.如果你想关闭Excel的所有实例,我知道的最简单的方法是通过对这样的程序的vbscript调用来终止所有这些实例,这些程序终止所有名为excel.exe的进程.注意我没有在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
Run Code Online (Sandbox Code Playgroud)

编辑:我只想添加您可以通过执行以下操作手动复制计划任务的行为:

  1. 已经打开Excel了.
  2. 浏览开始菜单并打开Excel.
  3. 从新的Excel实例中,打开您的工作簿.

要么

  1. 已经打开Excel了.
  2. 运行以下 Excel.exe [path of workbook in quotes]

编辑2:由于您的请求,我编写了这个简短的vbscript文件,该文件将关闭所有打开的Excel应用程序,而不会破坏自动恢复.如果您还想避免使用"是否要保存..."警报,请取消注释评论部分.

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
Run Code Online (Sandbox Code Playgroud)

要运行它,只需在Excel VBA的末尾包含以下内容即可.

Shell "wscript.exe [path of .vbs file]"
Run Code Online (Sandbox Code Playgroud)