【问题标题】:How to apply dynamic range on a filter如何在过滤器上应用动态范围
【发布时间】:2020-10-28 19:01:22
【问题描述】:

我正在尝试将动态范围编码到过滤器中。但是,我不确定如何。我希望过滤器检查是否有任何 NA,如果有,那么我想显示它们。如果没有 NA,那么我想要“全选”过滤器。

Sub SDOIP5()

' SDOIP5 Macro
' It filters the NA in Subcluster
'

Dim LastRow2 As Long
LastRow2 = Range("A" & Rows.Count).End(xlUp).Row

ActiveSheet.Range("$A$2:$BI$196").AutoFilter Field:=1, Criteria1:="#N/A"

End Sub

【问题讨论】:

    标签: excel vba dynamic filter


    【解决方案1】:

    过滤动态范围

    Option Explicit
    
    Sub SDOIP5()
    ' SDOIP5 Macro
    ' It filters the NA in Subcluster '
    '
        Const CriteriaValue As String = "#N/A"
        
        With ActiveSheet
            Dim rng As Range
            ' If for any reason 'CurrentRegion' doesn't work for you,
            ' then just define the complete range including the headers.
            Set rng = .Range("A1").CurrentRegion
            ' To test that you have the right range, uncomment the following line
            ' to write the defined range address to the Immediate window (CTRL+G).
            'Debug.Print rng.Address(0, 0)
            Application.ScreenUpdating = False
            rng.AutoFilter Field:=1, _
                           Criteria1:=CriteriaValue
            With rng.SpecialCells(xlCellTypeVisible)
                If .Rows.Count = 1 And .Areas.Count = 1 Then
                    .Parent.ShowAllData
                End If
            End With
        End With
    
    End Sub
    

    编辑:

    • 这将使用defineEndRange 函数来定义您的范围。

    • 解决方案是使用第一个单元格A2 设置的。

    • 同样,如果这不起作用,您将不得不手动提供范围,例如

      Set rng = .Range("A2:BI196")
      

    守则

    Option Explicit
    
    Sub SDOIP5()
    ' SDOIP5 Macro
    ' It filters the NA in Subcluster '
    '
        Const CriteriaValue As String = "#N/A"
        
        With ActiveSheet
            Dim rng As Range
            Set rng = defineEndRange(.Range("A2"))
            ' To test that you have the right range, uncomment the following line,
            ' to write the defined range address to the Immediate window (CTRL+G).
            Debug.Print rng.Address(0, 0)
            Application.ScreenUpdating = False
            rng.AutoFilter Field:=1, _
                           Criteria1:=CriteriaValue
            With rng.SpecialCells(xlCellTypeVisible)
                If .Rows.Count = 1 And .Areas.Count = 1 Then
                    .Parent.ShowAllData
                End If
            End With
        End With
    
    End Sub
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Purpose:      Defines the range from a specified first cell to the last cell
    '               of its Current Region. It is the Current Region minus the cells
    '               to the left and above of the specified first cell.
    ' Remarks:      If the specified first cell is "A1", then its Current Region
    '               and its End Range are the same.
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Function defineEndRange(FirstCellRange As Range) _
             As Range
        ' Initialize error handling.
        Const ProcName As String = "defineEndRange"
        On Error GoTo clearError
        ' Validate First Cell Range.
        If FirstCellRange Is Nothing Then
            GoTo NoFirstCellRange
        End If
        ' Define Current Region ('rng').
        Dim rng As Range
        Set rng = FirstCellRange.CurrentRegion
        ' Define End Range.
        Set defineEndRange = FirstCellRange _
          .Resize(rng.Rows.Count + rng.Row - FirstCellRange.Row, _
                  rng.Columns.Count + rng.Column - FirstCellRange.Column)
        ' Exit.
        GoTo ProcExit
    ' Labels
    NoFirstCellRange:
        Debug.Print "'" & ProcName & "': No First Cell Range."
        GoTo ProcExit
    clearError:
        Debug.Print "'" & ProcName & "': " & vbLf _
                  & "    " & "Run-time error '" & Err.Number & "':" & vbLf _
                  & "        " & Err.Description
        On Error GoTo 0
        GoTo ProcExit
    ProcExit:
    End Function
    

    【讨论】:

    • @MariaRodriguez:我添加了另一个解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多