vba - 无法在计划任务中使用 vba 关闭 Excel 应用程序

标签 vba excel scheduled-tasks

我在 vba 中编写了一个代码,它适用于不同的 WorkbooksWorksheets .此代码必须在计划任务中执行。但是由于一个未知的原因,我遇到了问题:

当我手动执行它时,它可以正常工作并且excel会自行关闭。但是对于我的计划任务,Excel 会关闭所有 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

我尝试了在网上找到的不同解决方案,但没有任何效果。即使我只做:
 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.QuitApplication.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。
  • 浏览开始菜单并打开 Excel。
  • 在新的 Excel 实例中,打开您的工作簿。

  • 或者
  • 已打开 Excel。
  • 运行以下 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/

    相关文章:

    Excel - 计算工资的方法

    python - 使用 openpyxl 写入行?

    excel - 将任何长度的有符号十六进制数转换为有符号十进制数 (Excel)

    android - 处理每个用户的时区和 DST 的任务调度(运行备份)

    windows - 如何解决 Windows 计划任务未运行的问题?

    VBA EXCEL - 查找列中最早的日期

    ms-access - "invalid use of null"用于返回变体的 vba 函数

    vba - 计算VBA中不同单元格的数量

    iphone - 如何在iPhone上指定时间运行应用程序?

    ms-access - Val() 函数无法识别系统范围内的小数点