首页 > 解决方案 > 在 VBA 中删除过滤器时,为什么删除的行会重新出现在 Excel 表中?

问题描述

我在另外两台机器和其他几个工作表上完美运行的 VBA 代码没有重新出现数据。我创建了一个宏,它采用主电子表格并为表中列出的每所学校创建一个新的电子表格。我刚买了一台新笔记本电脑并在上面安装了 Excel 365。我将 VBA 代码复制到新机器上,但是当我运行它时,每个新工作表仍然包含所有学校的数据,而不仅仅是那个特定文件的学校。我逐步浏览了代码,学校确实删除了,但是当它到达过滤器从表中删除的部分时ws.ListObjects("Data").AutoFilter.ShowAllData,所有被删除的行重新出现。我很困惑为什么会发生这种情况 - 在其他两台机器和我使用此宏的文件的其他迭代上没有发生。我不知道这是 Excel 设置还是此特定主文件上的设置。另外两台机器 - 一台使用 Excel 365,另一台使用 Excel 2016。数据不是 PowerPivot 的一部分,也不是 PowerQuery,因此数据仅存在于工作表中的表中。

这是宏:

Dim i As Integer, wb As Workbook, schools() As Variant, schools_to_delete() As Variant
Dim ws As Worksheet, rng As Range, dt As String
schools = SchoolsInList()
dt = MonthName(Month(Now)) & " " & Year(Now)

Set wb = ActiveWorkbook
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False

For i = 1 To UBound(schools)
    wb.SaveCopyAs ("Galileo " & dt & " " & schools(i) & ".xlsx")
    Workbooks.Open ("Galileo " & dt & " " & schools(i) & ".xlsx")
    Workbooks("Galileo " & dt & " " & schools(i) & ".xlsx").Activate
    Set ws = Sheets("Data")
    ws.Activate
    schools_to_delete = schools
    schools_to_delete(i) = "x"
    Set rng = ws.ListObjects("Data").DataBodyRange

    With ws
        .AutoFilterMode = False
        ws.ListObjects("Data").Range.AutoFilter Field:=18, Criteria1:= _
        Array(schools_to_delete), Operator:=xlFilterValues
        ws.Range(rng.Address).SpecialCells(xlCellTypeVisible).Delete
        .AutoFilterMode = False
        ws.ListObjects("Data").AutoFilter.ShowAllData
    End With

    ActiveWorkbook.RefreshAll
    Call SelectA1
    ActiveWorkbook.Save
    ActiveWorkbook.Close
Next i

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True

End Sub
Function SchoolsInList() As Variant
Dim schools() As String
Dim C As Collection
Dim r As Range
Dim i As Long
Dim last_row As Long
last_row = Cells(Rows.Count, 1).End(xlUp).Row
Set C = New Collection
On Error Resume Next
For Each r In Worksheets("Data").Range("R2:R" & last_row).Cells
    C.Add r.Value, CStr(r.Value)
Next

On Error GoTo 0

ReDim A(1 To C.Count)

For i = 1 To C.Count
    A(i) = C.Item(i)
Next i

SchoolsInList = A

End Function


Sub SelectA1()
Dim i As Long
For i = 1 To ActiveWorkbook.Sheets.Count
Sheets(i).Activate
ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1
Range("A1").Select
Next i
ActiveWorkbook.Worksheets(2).Activate
End Sub

标签: excelvba

解决方案


我发现了问题 - .AutoFilterMode = False 实际上并没有清除已经放置在相关表格上的过滤器。可见数据被删除了,但是运行宏之前过滤的数据仍然存在,当ws.ListObjects("Data").AutoFilter.ShowAllData运行时,它清除了之前的过滤器,显示了之前过滤的行. 我将 .ShowAllData 代码添加到 With 语句的开头,以避免将来出现同样的问题。


推荐阅读