Ham*_*mal 5 excel vba ms-office excel-vba
我需要在Excel VBA中编写一个宏,它在excel关闭后终止在windows任务中运行的进程.我尝试在事件workbook_BeforeClose上执行此操作
Private Sub Workbook_BeforeClose(CANCEL As Boolean)
Run "MacroCloseProcess"
End Sub
Run Code Online (Sandbox Code Playgroud)
像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
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是,如果在工作簿中进行了更改,excel会向用户提供"您是否要保存对'Sheet1.xlsx所做的更改'的选项?"保存,不保存,取消
如果用户单击取消,Excel不会退出(根据设计)但是,该过程已终止,因为它处于"BeforeClose"事件中.我如何编写此代码,以便在excel关闭后命中?
控制用户决策.这是一个简单的代码,如果需要可以改进.
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
Run Code Online (Sandbox Code Playgroud)
*编辑*更好,更优雅的选择:
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
Run Code Online (Sandbox Code Playgroud)
其他一些想法是可以的,我同意先保存,但你应事先征得他们的同意.这也允许用户首先保存,因为它首先检查它是否已保存.
您应该在终止之前调用用户保存工作簿.例如
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
Run Code Online (Sandbox Code Playgroud)