2013-04-11 103 views
4

我需要在Excel VBA中编写一个宏,该宏在Excel关闭后终止在Windows任务中运行的进程。我试了一下这样的事件workbook_BeforeClose在VBA中写宏 - excel在用户关闭Excel之后

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关闭后命中吗?

回答

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 
0

也许你可以提供你希望你关闭Excel之前保存选项,然后通过

Application.DisplayAlerts=False

ThisWorkbook.Close (False)

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