1

我正在使用 VBscript 打开 Microsoft Excel 并将 xls 文档转换为 csv。
这是一个简单的例子,它接受一个参数并转换第一页

Dim oExcel
Dim oBook
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(Wscript.Arguments.Item(0))

oBook.SaveAs "out.csv", 6

oBook.Close False
oExcel.Quit

如果一切正常,那就太好了。但是,当脚本在关闭 excel 之前崩溃时,该进程会继续停留并锁定文件,直到我手动终止该进程。

即使脚本失败,如何确保执行任何清理例程?

4

2 回答 2

5

问题是/曾经是?关于在用于自动化的 VBScript 崩溃时可靠地关闭 Excel:

如果你写

Set oExcel = CreateObject("Excel.Application")

您创建一个“简单”变量。当变量超出范围时,VBScript 可能会减少引用计数器,但它肯定不会为您退出 Excel。

如果您想在 VBScript 中实现 atexit 调用或异常处理等功能,则必须在其 Class_Terminate Sub 中编写一个“执行我的意思”的类。一个简单的例子:

Option Explicit

Class cExcelWrapper
  Private m_oExcel
  Public Sub Class_Initialize()
    Set m_oExcel = CreateObject("Excel.Application")
  End Sub
  Public Sub Class_Terminate()
    m_oExcel.Quit
  End Sub
  Public Default Property Get Obj()
    Set Obj = m_oExcel
  End Property
End Class

Dim oExcel : Set oExcel = New cExcelWrapper
Dim oWBook : Set oWBook = oExcel.Obj.WorkBooks.Add()

oExcel.Obj.Visible = True
oExcel.Obj.DisplayAlerts = False
oWBook.Sheets(1).Cells(1,1) = "Div by Zero"

WScript.Echo "Check TaskManager & Enter!"
WScript.StdIn.ReadLine
WScript.Echo 1 / 0

(意味着以“cscript 20381749.vbs”开头)

如果您使用打开的任务管理器运行此脚本,您将在进程列表中看到 Excel 弹出窗口(以及在屏幕上,因为 .Visible)。如果您然后按 Enter,脚本将中止并出现“除零”错误,并且Excel 进程将从进程列表中消失。

如果您删除 .DisplayAlerts 设置,Excel 将询问您是否保存您的工作 - 从而证明 Class_Terminate() Sub 中的 .Quit 确实将 Excel 踢入再见模式。

该课程需要进一步的工作(基本设置,常见操作(保存?)在 .Quit 之前,也许是防止滥用(Set oExcel = Nothing 或其他货物邪教废话),th .Obj 添加不好,也不会如果你在调试器中杀死你的 .vbs 可以帮助你,但对于标准场景,你不会再看到 Excel 僵尸了。

于 2013-12-04T18:19:59.630 回答
0

在脚本顶部添加"On Error Goto ErrorHandler",在底部添加“ ErrorHandler:”。在标签下方ErrorHandler添加代码以根据情况管理情况Err.Number

请参阅ErrMSDN 上的对象。

您也可以使用“On Error Resume Next”。是一个例子。

编辑:我的错。VBS 中不存在“Goto”。下面的答案可能是一种更整洁的方法。

于 2013-12-04T17:25:43.353 回答