关闭打开 Excel 个实例
Close Open Excel Instance
有人可以告诉我以下简单的 VBScript 是否正确吗?
它应该在其他进程 运行(并保持 Excel 打开)后关闭 Excel,但它不起作用。
Set MyApp = CreateObject("Excel.Application")
MyApp.Quit
请试试这个。
ThisWorkbook.Saved = True
Application.Quit
CreateObject 创建 一个 COM 对象,因此您的
Set MyApp = CreateObject("Excel.Application")
启动一个新的 Excel 进程。使用 GetObject to "retrieve an existing object with the specified ProgID". See this 进行理论和实践。
CreateObject
创建一个新对象。如果我正确理解你的问题,你想附加到已经 运行(孤立的)Excel 进程以终止它们。您可以使用 GetObject
:
On Error Resume Next
Do
Set xl = GetObject(, "Excel.Application")
status = Err.Number
If status = 0 Then
For Each wb in xl.Workbooks
wb.Close False 'discard changes in open workbooks
Next
xl.Quit
ElseIf status <> 429 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit 1
End If
Until status = 429
On Error Goto 0
请注意,这将尝试关闭所有 运行 Excel 实例,丢弃打开的工作簿中的所有更改。如果您希望它保存打开的工作簿中的更改,请将 Close
方法的参数更改为 True
。如果您有 Excel 个实例要保留 运行,则需要添加代码以排除它们被关闭。
另请注意,这不会强制终止无响应的实例。您需要为此终止进程:
Set wmi = GetObject("winmgmts://root/cimv2")
For Each xl In wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'")
xl.Terminate
Next
有人可以告诉我以下简单的 VBScript 是否正确吗? 它应该在其他进程 运行(并保持 Excel 打开)后关闭 Excel,但它不起作用。
Set MyApp = CreateObject("Excel.Application")
MyApp.Quit
请试试这个。
ThisWorkbook.Saved = True
Application.Quit
CreateObject 创建 一个 COM 对象,因此您的
Set MyApp = CreateObject("Excel.Application")
启动一个新的 Excel 进程。使用 GetObject to "retrieve an existing object with the specified ProgID". See this 进行理论和实践。
CreateObject
创建一个新对象。如果我正确理解你的问题,你想附加到已经 运行(孤立的)Excel 进程以终止它们。您可以使用 GetObject
:
On Error Resume Next
Do
Set xl = GetObject(, "Excel.Application")
status = Err.Number
If status = 0 Then
For Each wb in xl.Workbooks
wb.Close False 'discard changes in open workbooks
Next
xl.Quit
ElseIf status <> 429 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit 1
End If
Until status = 429
On Error Goto 0
请注意,这将尝试关闭所有 运行 Excel 实例,丢弃打开的工作簿中的所有更改。如果您希望它保存打开的工作簿中的更改,请将 Close
方法的参数更改为 True
。如果您有 Excel 个实例要保留 运行,则需要添加代码以排除它们被关闭。
另请注意,这不会强制终止无响应的实例。您需要为此终止进程:
Set wmi = GetObject("winmgmts://root/cimv2")
For Each xl In wmi.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'excel.exe'")
xl.Terminate
Next