編輯2:這是一個重新寫了不使用AfterSave。您可能需要根據您的需要調整從GetSaveAsFilename創建的對話框。
這依賴於覆蓋默認保存行爲並處理自己保存。
Private actSheet As Worksheet
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
PrepareForSave
manualSave SaveAsUI
AfterSave ThisWorkbook.Saved
End Sub
Private Sub PrepareForSave()
Set actSheet = ThisWorkbook.ActiveSheet
ThisWorkbook.Sheets("Info").Activate
hidesheets
End Sub
Private Sub manualSave(ByVal SaveAsUI As Boolean)
On Error GoTo SaveError 'To catch failed save as
Application.EnableEvents = False
If SaveAsUI Then
If Val(Application.Version) >= 12 Then
sPathname = Application.GetSaveAsFilename(FileFilter:="Excel Files (*.xlsm), *.xlsm")
If sPathname = False Then 'User hit Cancel
GoTo CleanUp
End If
ThisWorkbook.SaveAs Filename:=sPathname, FileFormat:=52
Else
sPathname = Application.GetSaveAsFilename(FileFilter:="Excel Files (*.xls), *.xls")
If sPathname = False Then
GoTo CleanUp
End If
ThisWorkbook.SaveAs Filename:=sPathname, FileFormat:=xlNormal
End If
Else
ThisWorkbook.Save
End If
SaveError:
If Err.Number = 1004 Then
'Cannot access save location
'User clicked no to overwrite
'Or hit cancel
End If
CleanUp:
Application.EnableEvents = True
End Sub
Private Sub AfterSave(ByVal bSaved As Boolean)
showsheets
If actSheet Is Nothing Then
ThisWorkbook.Sheets("Scheduler").Activate
Else
actSheet.Activate
Set actSheet = Nothing
End If
If bSaved Then
ThisWorkbook.Saved = True
End If
End Sub
Private Sub hidesheets()
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "Info" Then
ws.Visible = xlVeryHidden
End If
Next
End Sub
Private Sub showsheets()
For Each ws In ThisWorkbook.Worksheets
ws.Visible = True
Next
End Sub
Private Sub Workbook_Open()
AfterSave True
End Sub
使Info
顯示第一個未啓用宏的唯一方法是如果是這樣的工作簿是如何保存的。這是保存時最合理的處理方式。
除非我誤解你的問題,而不是使用BeforeSave似乎誤入歧途。請確保使用AfterSave。下面是一個示例:
Private actSheet As Worksheet
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
showsheets
actSheet.Activate
Set actSheet = Nothing
Thisworkbook.Saved = true 'To prevent save prompt from appearing
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Set actSheet = ThisWorkbook.activeSheet
ThisWorkbook.Sheets("Info").Activate
hidesheets
End Sub
Private Sub Workbook_Open()
showsheets
ThisWorkbook.Sheets("Scheduler").Activate
End Sub
Private Sub hidesheets()
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "Info" Then
ws.Visible = xlVeryHidden
End If
Next
End Sub
Private Sub showsheets()
For Each ws In ThisWorkbook.Worksheets
ws.Visible = True
Next
End Sub
使用私人對象actSheet允許在保存後重新選擇「ActiveSheet」。
編輯:我注意到你在評論中有更多的要求。代碼已經更新,現在保存後,只有信息表可見,但是在打開或保存後,每個表格都會重新出現。
這使得以使任何用戶打開該文件,而無需宏將不能與活化的不同片保存,甚至查看其他片材。這肯定會有助於激勵他們啓用宏!
'如果打開工作簿和宏disabled.'如果宏被禁用,那麼爲什麼試試'嘗試Solutions' :)還是我失去了一些東西「信息」必須出現第一件事情? –
好問題 - 工作簿包含宏,但是由共享驅動器上的用戶打開,該用戶可能有或可能沒有位於其可信文件路徑中的位置。因此,對於未啓用宏的情況下打開的用戶,我使用「Info」工作表來說,「打開宏!」一旦它們打開,我需要確保無論工作簿上發生了什麼變化,一旦保存,下一個打開禁用宏的工作簿的人就會看到「Info」。 –
我能想到的唯一方法是以只讀模式保存文件。通過這種方式,它始終會以信息表的形式作爲第一張表單打開...只要您保存並關閉帶有活動信息表的文件即可。 Excel會記住您打開的最後一張工作表。 –