5

Excelが閉じられた後、Windowsタスクで実行されているプロセスを終了するExcel VBAでマクロを記述する必要があります。イベントworkbook_BeforeCloseでこれをやってみました

Private Sub Workbook_BeforeClose(CANCEL As Boolean)
    Run "MacroCloseProcess"
End Sub 

MacroCloseProcess が次のように定義されている場合

Private Sub MacroCloseProcess()
    Dim oWMT As Object, oProcess As Object
    Set oWMT = GetObject("winmgmts://")
    For Each oProcess In oWMT.InstancesOf("Win32_Process")
        If (oProcess.name) = pWcfHostApp Then

            If oProcess.Terminate() = 0 Then Exit Sub
        End If
    Next
End Sub

これは機能しますが、ワークブックに変更が加えられた場合、Excel はユーザーに "'Sheet1.xlsx' に加えた変更を保存しますか? 保存する、保存しない、キャンセルする] オプションを提供します。

ユーザーが [キャンセル] をクリックすると、Excel は終了しませんが (設計どおり)、「BeforeClose」イベントにあったため、プロセスは終了しました。Excelが閉じた後にヒットするようにこのコードを書くにはどうすればよいですか?

4

3 に答える 3

5

他のアイデアのいくつかは問題ありません。最初に保存することに同意しますが、事前に許可を求める必要があります。これにより、保存されているかどうかを最初に確認するため、ユーザーは最初に保存することもできます。

終了する前に、ワークブックを保存するようにユーザーを呼び出す必要があります。例えば

Private Sub Workbook_BeforeClose(CANCEL As Boolean)

If Not Me.Saved Then 
    Msg = "Do you want to save the changes you made to " 
    Msg = Msg & Me.Name & "?" 
    Ans = MsgBox(Msg, vbQuestion + vbYesNoCancel) 
    Select Case Ans
        Case vbYes 
            Me.Save 
        Case vbNo 
            Me.Saved = True 
        Case vbCancel 
            Cancel = True 
            Exit Sub 
    End Select
End If

Run "MacroCloseProcess"

End sub
于 2013-04-11T11:16:06.343 に答える
5

ユーザーの決定を制御します。これは、必要に応じて改善できる単純なコードです。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'take control of what user can do:
If MsgBox("Do you want to save and exit?", vbYesNo) = vbYes Then
    Application.DisplayAlerts = False
        ThisWorkbook.Save
        'call your MacroCloseProcess here
    Application.DisplayAlerts = True
Else
    Cancel = True
End If
End Sub

*編集 *より優れたエレガントなオプション:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'take control of what user can do:
    Application.DisplayAlerts = False
    Dim filePath As Variant

    If Len(ThisWorkbook.Path) > 0 Then
        'has been already saved therefore just ask
        'this would be rarely meet, only whan call for the first time
        'or if this solution was placed in class module for all doc

        If MsgBox("Do you want to save and exit?", vbYesNo) = vbYes Then
            ThisWorkbook.Save
            'call your MacroCloseProcess here
            MsgBox "exit" '<-- to remove, kept for tests
        Else
            Cancel = True
        End If
    Else
        'document was not saved before- show standard file dialog

        filePath = Application.GetSaveAsFilename()
        If VarType(filePath) = vbString Then

            ActiveWorkbook.SaveAs Filename:=filePath
            'call your MacroCloseProcess here
            MsgBox "exit" '<-- to remove, kept for tests

        Else
            Cancel = True
        End If
    End If
    Application.DisplayAlerts = True
End Sub
于 2013-04-11T11:14:20.507 に答える
0

おそらく、Excel を閉じる前にユーザーにオプションを保存しますか?

Application.DisplayAlerts=Falseまた

ThisWorkbook.Close (False)

于 2013-04-11T11:09:56.830 に答える