2017-05-30 8 views
0

共有されているワークブックがあります。複数のユーザーが作業しているときに問題が発生し、フィルターを使用して保存します。 フィルタがあるときに保存しないようにブックコードを書き込もうとしています。Excel VBAによる保存前のチェック

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

    If Worksheets("sheet1").AutoFilterMode = True Then 
    MsgBox "Filters not allowed, remove filters ", vbExclamation, "Warning!" 
    Cancel = True 

    Exit Sub 
    End If 
    End Sub 

可能であれば、完全なブックを確認したいと思いますが、1枚ごとに解決します。これを実行すると、マクロが保存されます。私はそれをMicrosoft Excel Object> ThisWorkbookセクションに配置しました。

+0

あなたはデバッグしましたか?サブにはまったく当たっていますか? – FunThomas

答えて

0

"sheet1"という名前のシートにフィルタが有効になっているかどうかを調べます。 "Sheet1"(最初のシートのデフォルト名)は "sheet1"と同じではありません。フィルタがある場合

ブックやテストにおける各シートを見てループを使用することができます。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim wsht As Worksheet 
    For Each wsht In ThisWorkbook.Worksheets 
     If wsht.AutoFilterMode = True Then 
      MsgBox "Filters not allowed, remove filters before saving", vbExclamation, "Warning!" 
      Cancel = True 
      Exit Sub 
     End If 
    Next wsht 
End Sub 

よりユーザーフレンドリーなアプローチは、保存する前に、すべてのフィルタを削除するには、このマクロを使用することですまた、ブックを保存するとフィルタが削除され、続行するかどうかを尋ねるメッセージが表示されます。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Dim wsht As Worksheet 
    For Each wsht In ThisWorkbook.Worksheets 
     If wsht.AutoFilterMode = True Then 
      MsgboxAnswer = MsgBox("Filters are currently active, saving this workbook will remove them. Do you want to continue?", vbYesNo) 
      If MsgboxAnswer = vbYes Then RemoveFilters = True 
      Exit For 
     End If 
    Next wsht 

    If RemoveFilters Then 
     For Each wsht In ThisWorkbook.Worksheets 
      wsht.AutoFilterMode = False 
     Next wsht 
    End If 
End Sub 
+0

ありがとうキャロシブ、私はダミーが良い点としてSheet1を持っていた。あなたの2番目の例はユーザーフレンドリーで、ユーザーに見直す機会を与えてくれました。迅速で正確な対応に感謝します。 – tbolge74

0

さらにAutoFilterModeもあります。節約する前にループ内の各シートに対して、両方ともFalseに設定します。

0

このコードをThisWorkbookモジュールに配置すると、ブックを保存する前にすべてのシートに適用されているすべてのフィルタがクリアされます。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
Dim ws As Worksheet 
For Each ws In Worksheets 
    If ws.FilterMode Then ws.ShowAllData 
Next ws 
End Sub 
関連する問題