我在 vba 中编写了一个代码,它适用于不同的 Workbooks
和 Worksheets
.此代码必须在计划任务中执行。但是由于一个未知的原因,我遇到了问题:
当我手动执行它时,它可以正常工作并且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
我尝试了在网上找到的不同解决方案,但没有任何效果。即使我只做:
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,则需要添加
Application.Quit
到你的潜艇的末尾。是的,我的意思是同时使用 xlApp.Quit
和 Application.Quit
.现在从技术上讲,当您加载新的 Excel 应用程序时,您可以打开多个 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
编辑:我只是想补充一点,您可以通过执行以下操作手动复制计划任务的行为:
或者
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
要运行它,只需在 Excel VBA 末尾包含以下内容。
Shell "wscript.exe [path of .vbs file]"
关于vba - 无法在计划任务中使用 vba 关闭 Excel 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12107508/