2017-05-05 20 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 

私が保存すると、私はすべてのフィルタを削除するという考えがあります。それは何らかの理由で働いていません - それは誰にも分かりません。

編集:Excel VBA - Run macro before save

Tlの; DR::より多くのグーグルは、答えを見つけ、必ずその中のキーワードのstackoverflowでGoogle - それはあなたのプログラムは、より良い、このように書くことができ

+0

まず、On Error Resumeを使用しないでください。この行は、基本的にはトラブルを引き起こす可能性のあるエラーをバイパスします。また、誤ってキーワードを使用することを避けるために、変数として「キャンセル」ではなく「Cncl」のようなものを使用します。これらの2つを変更し、プログラムがあなたに何を伝えるかを見てください。 – Alex

+0

私はそれを得ました - それは私がモジュールを保存していた場所でした。フィルタを削除するより良い方法を見つけることができれば、私はそれを聞いて喜んで - 私はまだより良い方法を見つけるために持っている – Selkie

+0

あなたはActiveSheetの使用に問題があると思う。おそらくwsをResetFiltersに渡し、ActiveSheetではなくwsを使用するべきです。 –

答えて

1

劇的に役立ちます。私は元の問題を解決したことを知っていますが、フィルターをリセットするより良い方法は気にしませんでした。あなたは意味あなたがすべきOn Error Resume Nextのdoesntでエラーをバイパスすることができますという理由だけで、VBAを学ぶための

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 

ヒント:ここでは、より良い方法です。多くの場合、単純なブールチェックによってエラーを回避することができます。これにより、他の潜在的な問題を逃すのを防ぐことができ、より良いコーディング方法です。さらに、SOの一部の人々は、エラーを完全に無視しているならば、助けてくれることを心配しません。

+0

私は最初にSOから次のレジュームを取得したと確信しています。私はフィルターをリセットするための私の行為としてこれを使用します – Selkie

+0

それは可能ですが、それはまだ彼らの下にVBAで彼らの足を取得していた人でした。言語の強い意識が得られれば、それが正当化される場所はまれでしかないはずです。私はこれがあなたを助けてうれしいです:)。 –

関連する問題