Can';t在计划任务中使用vba关闭Excel应用程序

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.

我用vba编写了一个代码,它可以与不同的
工作簿
工作表
一起使用。此代码必须在计划任务中执行。但出于一个未知的原因,我有一个问题:

当我手动执行它时,它工作正常,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
  • 浏览“开始”菜单并打开Excel
  • 从新的Excel实例中,打开工作簿
  • 已打开Excel
  • 运行以下
    Excel.exe[带引号的工作簿路径]
  • 编辑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应用程序实例

    手动运行文件时,可能会使用默认行为,即直接打开工作簿时,它会在已加载的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
  • 浏览“开始”菜单并打开Excel
  • 从新的Excel实例中,打开工作簿
  • 已打开Excel
  • 运行以下
    Excel.exe[带引号的工作簿路径]
  • 编辑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应用程序打开了多个工作簿实例。您需要关闭所有工作簿实例以获取纯excel应用程序,然后退出它

    试试这个:(伪代码)

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

    我可以看到您已经用excel应用程序打开了多个工作簿实例。您需要关闭所有工作簿实例以获取纯excel应用程序,然后退出它

    试试这个:(伪代码)

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

    您的代码在计划任务中是如何启动的?操作:启动程序:“\\192.168.1.199\RunMarketdata.xlsm”。之后是我的自动打开函数,它执行我的代码。我有Windows7x64和OfficeX32A可能的解决方法是使用停止任务,如果它运行了。。。选择权