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 は ref カウンターをデクリメントすることがありますが、確実に 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」で開始することを意味します)

このスクリプトを Taskmanager を開いた状態で実行すると、プロセス リスト (および .Visible により画面上) に Excel ポップアップが表示されます。次に Enter キーを押すと、スクリプトは "Division by Zero" エラー中止され、Excel プロセスはプロセス リストから消えます。

.DisplayAlerts 設定を削除すると、Excel は作業を保存するかどうかを尋ねます。これにより、Class_Terminate() Sub の .Quit が実際に Excel をバイバイ モードにすることが証明されます。

このクラスは、.Quit の前に追加の作業 (基本設定、一般的なアクション (保存?)デバッガーで .vbs を強制終了する場合に役立ちますが、標準的なシナリオでは、Excel ゾンビは表示されなくなります。

于 2013-12-04T18:19:59.630 に答える
0

"On Error Goto ErrorHandler"をスクリプトの先頭に追加し、末尾に " ErrorHandler:" を追加します。ラベルの下ErrorHandlerにコードを追加して、状況に応じて状況を管理します。Err.Number

ErrMSDN のオブジェクトを参照してください。

「On Error Resume Next」も使用できます。ここに例があります。

編集:私の悪い。「後藤」はVBSには存在しません。以下の答えは、おそらくもっときちんとしたアプローチです。

于 2013-12-04T17:25:43.353 に答える