Excel VBA添加自动筛选器(如果它不存在)

时间:2016-04-01 11:32:45

标签: excel excel-vba excel-2010 vba

如何检查范围是否已有自动过滤器,如果没有则应用它们。

目前我只是在使用

Range("A1:N1").AutoFilter

但是,如果该范围已经有过滤器,则将其关闭。

我已经搜索了这个并找到了许多清除和重置自动过滤器的解决方案,但没有关于实际检查过滤器是否实际应用的问题。

6 个答案:

答案 0 :(得分:3)

而不是在重新申请之前检查我是否关闭了AutoFilter。

Sheets(curSheet).AutoFilterMode = False
Range("A1:N1").AutoFilter

答案 1 :(得分:3)

您当前的解决方案应该可以正常工作,但您可以使用像

这样的If语句
If Sheets(curSheet).AutoFilterMode = True Then

'Do Nothing

Else

Sheets(curSheet).Range("A1").AutoFilter

End If

答案 2 :(得分:0)

这是一个简短的解决方案,只有在自动过滤器尚未到位时才打开自动过滤器

If Not Sheets(curSheet).AutoFilterMode Then Range("A1:N1").AutoFilter

优点:只有在没有自动过滤器的情况下才会发生事情

缺点:只应在代码设置自动过滤器时使用,因为用户可能会在不同的范围内设置过滤器。

答案 3 :(得分:0)

或一行完成:

If Worksheets("Sheet1").AutoFilterMode = False Then Range("a1").AutoFilter

答案 4 :(得分:0)

U

sing the  if false method ... leaves the filter and header validations untouched...

DoFixValid "ShellManycl", "g4:r4" 
'puts as headings 'validation drop downs for the Get of the class  


Private Sub CommandButton2_Click()
   Dim Ra As Range
   Application.ScreenUpdating = False
   Set Ra = Range("f5").CurrentRegion
   Ra(2, 2).Resize(Ra.Rows.Count, Ra.Columns.Count).Clear
 ' clear all except filter and validation Headings
   URaAdd = ActiveSheet.UsedRange.Address  ' tidy used range
   [j1] = Timer
   DoRaShell Range("F5")  ' ' get the data   below headings
   [j2] = Timer - [j1]
   Application.ScreenUpdating = True
   Set Ra = Range("f5").CurrentRegion
   If Not AutoFilterMode Then Ra.AutoFilter  n
'not touch filter values of heanings

End Sub

答案 5 :(得分:-1)

' Maybe some may be interested in adding  validation to a range

'or to get the Public Property Gets ( no param ) from a class module
'or both from a module


 ' needs reference to Microsoft VBE extensibility pack

Option Explicit: Option Compare Text
Public VRa As Range, VFormula$, VTitle$, VMsG$



Sub DoFixValid(ClassName$, RaAdd$)
   FixGetValidation ClassName
   ValidateForRange Range(RaAdd), VFormula

End Sub

Sub FixGetValidation(ComponentName$)

   Dim Li%, PP%, EL%, LineStr$, PosGet&, PA
   VFormula = ""
   With ActiveWorkbook.VBProject.VBComponents(ComponentName).CodeModule

      For Li = .CountOfDeclarationLines To .CountOfLines
         LineStr = .Lines(Li, 1)
         PosGet = InStr(LineStr, "rty Get ")
         If PosGet > 2 Then
            If InStr(LineStr, "Private") = 0 Then
               LineStr = Mid(LineStr, PosGet + 8)
               LineStr = Left(LineStr, InStr(LineStr, "(") - 1)
               If InStr("!@#$%&", Right(LineStr, 1)) Then LineStr = Left(LineStr, Len(LineStr) - 1)
               VFormula = VFormula & "," & LineStr
            End If
         End If
      Next Li
   End With
End Sub

Sub ValidateForRange(Ra As Range, ValidFormula$, _
Optional Title$ = "For List columns ", Optional MsG$ = " Select from drop down list")
   Ra.Select
   With Selection.Validation
      .Delete
      .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
      xlBetween, Formula1:=ValidFormula
      .IgnoreBlank = True
      .InCellDropdown = True
      .InputTitle = Title
      .ErrorTitle = Title
      .InputMessage = MsG
      '    .ErrorMessage = ValidFormula
      .ShowInput = True
      .ShowError = True
   End With
End Sub