繁体   English   中英

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

[英]Excel VBA add Autofilter if it doesn't exist

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

目前我只是在使用

Range("A1:N1").AutoFilter

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

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

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

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

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

If Sheets(curSheet).AutoFilterMode = True Then

'Do Nothing

Else

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

End If

这是一个简短的解决方案,只有当它还没有到位时才打开自动过滤器

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

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

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

或者在一行中完成:

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

ü

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
' 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM