gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:25:51 24 4
gpt4 key购买 nike

我在 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com