2017-05-30 128 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 

如果可能我想檢查完整的工作簿,但會解決每個工作表。當我運行這個時,宏只是保存。我已將它放入Microsoft Excel對象> 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

謝謝Carrosive,我把Sheet1作爲一個虛擬的,但很好的一點。我使用了第二個示例,因爲它更加便於用戶使用,併爲用戶提供了一個審閱的機會。感謝您的及時和準確的迴應。 – tbolge74

0

除了AutoFilterMode還有FilterMode,我將它們都設置爲False爲循環中的每個工作表在保存之前應該解決問題。

0

將此代碼放在ThisWorkbook Module上,這將在保存工作簿之前清除應用於所有工作表的所有濾鏡。

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