Как применить динамический диапазон к фильтру

#excel #vba #dynamic #filter

#excel #vba #динамический #Фильтр

Вопрос:

Я пытаюсь закодировать динамический диапазон в фильтр. Однако я не уверен, как это сделать. Я хочу, чтобы фильтр проверял, есть ли какие-либо NA, если есть это, тогда я хочу их отобразить. Если нет NA, то мне нужен фильтр «Выбрать все».

 Sub SDOIP5()

' SDOIP5 Macro
' It filters the NA in Subcluster
'

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

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

End Sub
  

Ответ №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 "'" amp; ProcName amp; "': No First Cell Range."
    GoTo ProcExit
clearError:
    Debug.Print "'" amp; ProcName amp; "': " amp; vbLf _
              amp; "    " amp; "Run-time error '" amp; Err.Number amp; "':" amp; vbLf _
              amp; "        " amp; Err.Description
    On Error GoTo 0
    GoTo ProcExit
ProcExit:
End Function
  

Комментарии:

1. @MariaRodriguez: Я добавил другое решение.