1

我在 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 保持打开状态。

任何人都可以帮助我吗?

4

2 回答 2

5

好的,这似乎很啰嗦......但是这里有。

您看到的问题是因为在给定时间一台机器上可能有多个 Excel 应用程序实例。

当您手动运行文件时,您可能会使用默认行为,即当您直接打开工作簿时,它会在您已加载的 Excel 应用程序中打开。

这意味着当您使用:

Set xlApp = GetObject(, "excel.application")

它实际上是返回当前的Excel.Application. 但是,当您通过计划任务加载它时,它会生成一个新Excel.Application的以处理您的任务。当它调用我引用的代码时,它最终引用了Excel.Application您已经打开的代码(可能)。

由于您计划的工作簿在不同的实例中Excel.Application运行,因此当您运行它时,xlApp.Quit它只会退出其他 Excel,而不是实际运行代码的那个。

如果您还想关闭您的自动 Excel,您需要添加Application.Quit到您的子程序的末尾。是的,我的意思是同时使用xlApp.QuitAND 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

编辑:我只是想补充一点,您可以通过执行以下操作手动复制计划任务的行为:

  1. 已打开 Excel。
  2. 浏览开始菜单并打开 Excel。
  3. 在新的 Excel 实例中,打开您的工作簿。

或者

  1. 已打开 Excel。
  2. 运行以下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]"
于 2012-08-24T15:32:51.770 回答
0

我可以看到您使用 excel 应用程序打开了多个工作簿实例。您需要关闭所有工作簿实例才能获得普通的 excel 应用程序,然后退出它。

试试这个:(伪代码)

dim xlApp as Excel.Application
dim wBook as Excel.Workbook
dim wSheet as Excel.Worksheet

Set xlApp = new Excel.Application
Set wBook = xlApp.Workbooks.Add(wb_Path)
Set wSheet = wBook.Sheets(1)

wSheet.Range("A1").Value = "Hello this is a test from vbcode"
wbook.close saveChanges:= true
xlApp.quit

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

于 2013-06-26T14:01:45.137 回答