Excel VBA 保存前检查过滤器

Excel VBA check for Filters before Save

我有一个共享的工作簿。当多个用户正在处理它并且一个人使用过滤器保存时,它会出现问题。 我正在尝试编写工作簿代码以防止在有过滤器时保存。

    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

如果可能的话,我想检查完整的工作簿,但会满足于每个 sheet。当我 运行 这个时,宏就保存了。我已将它放在 Microsoft Excel 对象 > ThisWorkbook 部分。

除了AutoFilterMode还有FilterMode,我会在保存之前将它们都设置为False循环中的每个sheet应该可以解决问题。

您给定的代码会查看名为 "sheet1" 的 sheet 是否启用了过滤器。请注意 "Sheet1"(第一个 sheet 的默认名称)与 "sheet1".

不同

您可以使用循环查看工作簿中的每个 sheet 并测试是否有过滤器:

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

将此代码放在 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