2017-05-05 46 views
1

我想在保存工作簿時重置所有過濾器。目前我有:獲取宏保存時運行

Sub ResetFilters() 
    On Error Resume Next 

    ActiveSheet.ShowAllData 
End Sub 


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ 
     Cancel As Boolean) 


     Dim ws As Worksheet 

     For Each ws In ActiveWorkbook.Worksheets 

      Call ResetFilters 

     Next 


    Cancel = False 
End Sub 

這個想法是,當我保存時,我刪除所有的過濾器。它不工作的原因 - 有沒有人有任何想法爲什麼?

編輯:更多的google搜索找到了答案:Excel VBA - Run macro before save

鉈;博士:在它的關鍵字總是計算器谷歌 - 它極大地幫助

+0

首先,不要使用On Error Resume接下來,這行基本上會繞過可能導致麻煩的錯誤。另外,我會使用'Cncl'而不是'Cancel'作爲變量來避免意外使用關鍵字。改變這兩個,看看程序告訴你什麼。 – Alex

+0

我明白了 - 這是我保存模塊的位置。如果你可以找到一個更好的方法來刪除過濾器,我很樂意聽到它 - 我還沒有找到一個更好的方法 – Selkie

+0

我想你會遇到與使用ActiveSheet有關的問題。您應該將ws傳遞給ResetFilters,並使用ws而不是ActiveSheet。 –

回答

1

你的程序,可以更好地寫成這樣。我知道你解決了你的原始問題,但你確實注意到你不會介意重置過濾器的更好方法。這裏有更好的辦法:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ 
     Cancel As Boolean) 

     Dim ws As Worksheet 
     ' Use 'ThisWorkbook' here since you only want to modify the workbook 
     ' that the code is running in 
     For Each ws In ThisWorkbook.Worksheets 
      If ws.AutoFilterMode then ws.ShowAllData 
     Next 

    Cancel = False 
End Sub 

學習VBA小費,只是因爲你可以On Error Resume Next並不意味着你應該跳過錯誤。通常,通過簡單的布爾檢查可以避免錯誤。這可以防止你錯過其他潛在的問題,並且是更好的編碼練習。甚至更進一步,如果你只是無視錯誤,那麼一些SO的人不會費心去幫助。

+0

我很確定我從第一個地方得到了錯誤的簡歷 - 謝謝你的解決方案!我會用它作爲我的重點過濾器 – Selkie

+0

這是可能的,但它本來是一個人,他們仍然在VBA下他們的腿。一旦你對這門語言有了強烈的認識,那麼只有極少數情況下才是合理的。我很高興這幫助你,雖然:)。 –