1

Workbooks異なるとで動作するコードを vba で作成しましたWorksheets。このコードは、スケジュールされたタスクで実行する必要があります。しかし、理由は不明ですが、問題があります。

手動で実行すると、正常に動作し、Excel が閉じます。しかし、スケジュールされたタスクでは、Excel はすべて閉じますが、Workbooks開いWorksheetsたままになります。ここに私のコードがあります:

    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

Web で見つけたさまざまな解決策を試しましたが、何も機能しません。私が作るだけでも:

 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 のみが終了します。

自動化された Excel も閉じたい場合Application.Quitは、サブルーチンの最後に追加する必要があります。はい、両方のxlApp.QuitANDを使用することを意味しますApplication.Quit

技術的には、新しい Excel アプリケーションをロードするときに、複数の Excel アプリケーションを開くことができます。Excel のすべてのインスタンスを閉じたい場合、私が知っている最も簡単な方法は、excel.exe という名前のすべてのプロセスを終了するこのようなプログラムへの vbscript 呼び出しを介してそれらすべてを強制終了することです。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: ご要望により、自動回復を無効にすることなく、開いているすべての Excel アプリケーションを閉じるこの短い vbscript ファイルを作成しました。回避したい場合は、「... を保存しますか?」というアラートが表示され、コメント セクションのコメントを解除します。

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 に答える