删除所有Excel表中的过滤器VBA
我正在创建一些Excel加载项来为我们的用户完成一些基本任务。我们有一个电子表格提供给我们的用户,用于我们的每个项目。在我们处理转换到SQL数据库之前,他们使用这些电子表格来更改可配置项目。当他们完成电子表格时,他们经常会忘记取消隐藏行,列和/或删除过滤器。我想创建一个宏,可以从每个工作表中取消隐藏行/列并清除每个ListObject中的过滤器。这里是代码,我尝试使用:删除所有Excel表中的过滤器VBA
Sub RemoveFiltersUnhide()
Dim i As Long
Application.ScreenUpdating = False
For i = 1 To ThisWorkbook.Worksheets.Count
ThisWorkbook.Worksheets(i).AutoFilterMode = False
ThisWorkbook.Worksheets(i).Rows.Hidden = False
ThisWorkbook.Worksheets(i).Columns.Hidden = False
Next i
Application.ScreenUpdating = True
End Sub
代码工作,以取消隐藏在每张纸上行/列,但它没有明确的过滤器。由于每个提供的工作簿都会有所不同,并且不会包含相同的工作表或列表对象,因此我不知道如何去循环每个表。任何人有任何想法我可以如何处理这个?
工作VBA:
Sub RemoveFiltersUnhide()
Dim ws As Worksheet, lo As ListObject
Application.ScreenUpdating = False
For Each ws In ThisWorkbook.Worksheets
ws.Rows.Hidden = False
ws.Columns.Hidden = False
For Each lo In ws.ListObjects
lo.AutoFilter.ShowAllData
Next
Next
Application.ScreenUpdating = True
End Sub
如果语法提供here是正确的,下面应该工作。
Dim Sheet As Excel.Worksheet, List As Excel.ListObject
For Each Sheet In ThisWorkbook.Sheets
For Each List In Sheet.ListObjects
List.AutoFilter.ShowAllData
Next
Next
谢谢,郝!我微调了一下,它完美的工作。 –
你应该使用'Option Explicit'并声明所有的变量。另外'ListObject'是一个保留字,因此不允许作为变量名!为了避免与保留字发生冲突,请使用其他类似“MyListObject”的变量名称作为变量名称。 –
@Peh注意。修改我的答案以包含变量声明。尽管值得注意的是[For Each语句的控制变量的返回值将始终是'Variant'或通用的'Object'](https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/for-each-control-variable-must-be-variant-or-object),所以我不确定这里是否有优势。 –
代码会是这样的。
Sub RemoveFiltersUnhide()
Dim i As Long
Dim Ws As Worksheet
Application.ScreenUpdating = False
For Each Ws In Worksheets
With Ws
If .FilterMode Then
.ShowAllData
End If
.Rows.Hidden = False
.Columns.Hidden = False
End With
Next Ws
Application.ScreenUpdating = True
End Sub
'FilterMode'应该是'.FilterMode'。记住'Option Explicit'是你的朋友。 –
@peh:谢谢。 –
如果要清除表单中的过滤器,请尝试此操作。(https://stackoverflow.com/a/21761226/8060864)对于表(ListObjects),[请尝试此操作。](https:/ /stackoverflow.com/a/33208645/8060864) –
谢谢。我以前看过这些。由于我的表格(列表对象)会因项目而异,所以这对我不起作用。 –
因此,您需要遍历工作簿中所有工作表中的所有ListObjects? –