根據您的目標有是我知道的兩種可能的選擇。
首先:保存,關閉並重新打開從同一程序:
Sub SaveCloseReOpen()
Dim strCMD As String
strCMD = "CMD /C PING 10.0.0.0 -n 1 -w 5000 >NUL & Excel.exe " & Chr(34) & ThisWorkbook.FullName & Chr(34)
ThisWorkbook.Save
Shell strCMD, vbNormalFocus
If Application.Workbooks.Count = 1 Then
Application.Quit
Else
ThisWorkbook.Close SaveChanges:=False
End If
End Sub
基本上簿將自己救自己,然後運行shell CMD Ping通不可路由的IP等待5秒(可以使用超時或者你喜歡的其他東西),那麼它將執行Excel.exe並重新打開工作簿。根據打開多少個工作簿,它將關閉Excel應用程序或只是工作簿...雖然此方法將在單獨的實例中打開Excel應用程序。如果你想要相同的實例,那麼我會使用Application.OnTime方法。
二:保存,從一個常規的接近,但通過工作簿停用事件重新打開:
工作簿中的模塊:
Option Explicit
Public bClose_ReOpen As Boolean
Sub SaveCloseReOpen()
bClose_ReOpen = True
ThisWorkbook.Close SaveChanges:=True
End Sub
類似:
Option Explicit
Private Sub Workbook_Deactivate()
If bClose_ReOpen Then
Shell "CMD /C PING 10.0.0.0 -n 1 -w 5000 >NUL & Excel " & Chr(34) & ThisWorkbook.FullName & Chr(34), vbNormalFocus
If Application.Workbooks.Count = 1 Then
Application.Quit
End If
End If
End Sub
在常規模塊
然後到第一個例程;然而,該例程將在工作簿大部分關閉後執行Shell運行命令(通過公共布爾變量)...如果您有任何Before_Save或Before_Close事件,它們將首先運行,因爲Workbook_Deactivate Routine是在工作簿之前處理的最後一個實際上關閉了。
如果您願意,您隨時都可以將Shell CMD的vbNormalFocus更改爲vbHide。
實際上,由於'wb = ThisWorkbook',當您關閉它時,代碼執行總是會中斷(因爲您關閉了從中運行代碼的工作簿)。 '我需要這樣一個代碼,因爲它應該是一個更大的代碼的一部分,如果工作簿沒有保存 - 關閉並重新打開,會給出錯誤「91」... - 我建議你修改你的代碼邏輯。如果你顯示你的代碼,也許我可以幫你 –
我會這樣做,如果我知道「當前」邏輯有什麼問題。有一些事情發生,當wb關閉然後重新打開時,如果wb只被保存就不會發生......這是某種「更新」或「重新啓動」,但我不知道如何模擬它用代碼。 – Trenera
好的,請顯示您的完整代碼和行,你會得到一個錯誤。我會嘗試修改它 –