2017-07-24 114 views
0

我正在创建一些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 
+0

如果要清除表单中的过滤器,请尝试此操作。(https://stackoverflow.com/a/21761226/8060864)对于表(ListObjects),[请尝试此操作。](https:/ /stackoverflow.com/a/33208645/8060864) –

+0

谢谢。我以前看过这些。由于我的表格(列表对象)会因项目而异,所以这对我不起作用。 –

+0

因此,您需要遍历工作簿中所有工作表中的所有ListObjects? –

回答

2

如果语法提供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 
+0

谢谢,郝!我微调了一下,它完美的工作。 –

+0

你应该使用'Option Explicit'并声明所有的变量。另外'ListObject'是一个保留字,因此不允许作为变量名!为了避免与保留字发生冲突,请使用其他类似“MyListObject”的变量名称作为变量名称。 –

+1

@Peh注意。修改我的答案以包含变量声明。尽管值得注意的是[For Each语句的控制变量的返回值将始终是'Variant'或通用的'Object'](https://msdn.microsoft.com/VBA/Language-Reference-VBA/articles/for-each-control-variable-must-be-variant-or-object),所以我不确定这里是否有优势。 –

2

代码会是这样的。

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 
+0

'FilterMode'应该是'.FilterMode'。记住'Option Explicit'是你的朋友。 –

+1

@peh:谢谢。 –