不能使用vba在计划任务中closuresExcel应用程序

我已经在vba中制作了一个可以与不同的WorkbooksWorksheets一起Workbooks的代码。 此代码必须在计划任务中执行。 但是对于一个不知情的原因,我有一个问题:

当我手动执行它,它工作正常,Excel自我closures。 但是对于我的计划任务,Excelclosures了所有的WorkbooksWorksheets但是它保持打开状态。 在这里你有我的代码:

  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 

我曾尝试在网上find不同的解决scheme,但没有任何工作。 即使我只做:

  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。

如果您还想closures自动化Excel,则需要将Application.Quit添加到子文件的末尾。 是的,我的意思是使用xlApp.QuitApplication.Quit

现在从技术上说,加载新应用程序时可以打开多个Excel应用程序。 如果你想closuresExcel的所有实例,我知道的最简单的方法是通过一个VBScript调用来终止所有名为excel.exe的进程。 注意我没有在Win 7上testing这个:

 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 

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

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

要么

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

编辑2:由于您的要求,我写了这个简短的vbscript文件,将closures所有打开的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 

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

 Shell "wscript.exe [path of .vbs file]" 

我可以看到你已经用你的excel应用程序打开了多个工作簿实例。 您需要closures所有工作簿实例才能获得简单的Excel应用程序,而不是退出它。

试试这个:(伪代码)

 dim xlApp as Excel.Application dim wBook as Excel.Workbook dim wSheet as Excel.Worksheet Set xlApp = new Excel.Application Set wBook = xlApp.Workbooks.Add(wb_Path) Set wSheet = wBook.Sheets(1) wSheet.Range("A1").Value = "Hello this is a test from vbcode" wbook.close saveChanges:= true xlApp.quit 

以上代码将打开您的工作簿。 在工作表上写一个自定义消息保存更改并closures。 而xlapp也将被终止/销毁。