#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: Я добавил другое решение.