excel - 在 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
解决方案
我发现了问题 - .AutoFilterMode = False 实际上并没有清除已经放置在相关表格上的过滤器。可见数据被删除了,但是运行宏之前过滤的数据仍然存在,当ws.ListObjects("Data").AutoFilter.ShowAllData运行时,它清除了之前的过滤器,显示了之前过滤的行. 我将 .ShowAllData 代码添加到 With 语句的开头,以避免将来出现同样的问题。
推荐阅读
- python - pyinstaller 和 pandas(缺少多个挂钩)
- javascript - Angularjs - 将 blob 保存到无法处理动态数据的文本文件中
- camunda - 如何控制是否在 Camunda Tasklist 中显示流程实例变量?
- c# - 在列表中获取 JSON API 扩展
- javascript - es6扩展运算符不组合键控对象
- ios - 如何使用情节提要在 Tableview Cell 中为 2 个标签和一个图像视图设置约束?
- php - 复杂的数组比较
- python - 在 python 3.6 上安装 nltk 2.0.4 时出错
- java - 在进行 twilio 电话会议时收集用户的输入
- python - 通道维度找到“无”,但是通过 tensor.get_shape() 已定义