Adr*_* A. 1 excel vba scheduled-tasks excel-vba
我在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
Run Code Online (Sandbox Code Playgroud)
我尝试过在网络上找到的不同解决方案,但没有任何效果.即使我只做:
Set xlApp = GetObject(, "excel.application")
xlApp.Quit
End Sub
Run Code Online (Sandbox Code Playgroud)
我的excel保持开放.
任何人都可以帮助我PLZ?
好吧,这似乎已经啰嗦......但是这里有.
您遇到的问题是因为在给定时间内计算机上可能有多个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)
编辑:我只想添加您可以通过执行以下操作手动复制计划任务的行为:
要么
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)
| 归档时间: |
|
| 查看次数: |
6025 次 |
| 最近记录: |