собственно вот код примера:
Sub ertert112()
Dim s$, r
Application.ScreenUpdating = False
With Sheets("Sheet4").Range("A1").CurrentRegion
.Parent.AutoFilterMode = False
For Each r In .Offset(1).Resize(.Rows.Count - 1).Columns(4).Value
If InStr(s, r) = 0 Then
If Not Evaluate("ISREF('" & r & "'!A1)") Then
Sheets.Add(after:=Sheets(Sheets.Count)).Name = r
Else
Sheets(r).UsedRange.ClearContents
End If
.AutoFilter 4, r
.Copy Sheets(r).Range("A1")
s = s & r
End If
Next
.AutoFilter
End With: Application.ScreenUpdating = True
End Sub
а это отрывки-заготовки:
Dim s As String, r As Range ' массив в качестве критерия для автофильтра
With New Collection
On Error Resume Next
For Each r In ActiveSheet.ListObjects("Table1").DataBodyRange.Columns(2).SpecialCells(12)
If IsEmpty(.Item(r)) Then .Add r, r: s = s & "~" & r
Next
End With: On Error GoTo 0
ActiveSheet.ListObjects("Table2").Range.AutoFilter 2, Split(Mid(s, 2), "~"), 7
Dim lo As ListObject: Set lo = ActiveSheet.ListObjects(1)
lo.Range.AutoFilter ' разрешить/отменить автофильтр
'ActiveSheet.AutoFilterMode игнорирует фильтры в Таблицах (ListObject), поэтому:
MsgBox lo.ShowAutoFilter 'есть ли автофильтр в Таблице
lo.Range.AutoFilter Field:=2, Criteria1:="B"
'отобразить все данные, если применен фильтр (FilterMode), если на листе вообще есть автофильтр (AutoFilterMode)
With ActiveSheet
If .AutoFilterMode Then If .FilterMode Then .ShowAllData
End With
With ActiveSheet 'или сразу так
If .FilterMode Then .ShowAllData
End With
|