Excel 如何在过滤器上应用动态范围

Excel 如何在过滤器上应用动态范围,excel,vba,dynamic,filter,Excel,Vba,Dynamic,Filter,我试图将动态范围编码到过滤器中。然而,我不确定怎么做。我希望过滤器检查是否有任何NA,如果有,那么我想显示它们。如果没有NA,那么我需要“全选”过滤器 滤波器动态范围 编辑: 这将使用defineEndRange功能定义您的范围 使用第一个单元格设置解决方案A2 同样,如果这不起作用,您必须手动提供范围,例如 Set rng = .Range("A2:BI196") 代码 Option Explicit Sub SDOIP5() ' SDOIP5 Macro '

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

滤波器动态范围 编辑:

  • 这将使用
    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

@马里亚罗德里格斯:我添加了另一个解决方案。
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