Łukasz Majcherek

Łukasz Majcherek Analityk sprzedaży,
Kupiec Sp. z o.o.

Temat: Filtrowanie zaawansowane - VBA Excel

Witajcie,
jestem tutaj nowy, więc od razu przepraszam za wszelkie błędy.

Mam plik "Makro5" (w załączniku) w którym stworzyłem makro "UkryjWiersze"ukrywające wszystkie puste wiersze:
 
Option Explicit

Dim rwsHdn As Range

Sub UkryjWiersze()
Dim i As Long
Dim Iscorr As Boolean
Dim tb As Variant

Set tb = Range("C8:C478")
Iscorr = False
For i = 8 To 478
If tb(i, 0) = "" Or Iscorr Then
Iscorr = True
RwsToHidden Cells(i, 1)
End If
Next i
On Error Resume Next
rwsHdn.EntireRow.Hidden = True
Set rwsHdn = Nothing

End Sub

Private Sub RwsToHidden(xcel As Range)
If rwsHdn Is Nothing Then
Set rwsHdn = xcel
Else
Set rwsHdn = Union(rwsHdn, xcel)
End If
End Sub


Jednocześnie mam wpisany kod na filtrowanie kolumy P oraz N po kryteriach w zakresie M4:P4:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim n, p
If Target.Count = 1 And Not Intersect(Target, Range("M4:P4")) Is Nothing Then
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData
n = Range("N4").Value
p = Range("P4").Value
Application.EnableEvents = False
If n = "" Then
Range("Q4").Value = ""
ElseIf IsNumeric(n) Then
Range("Q4").Value = Range("M4").Value & n
Else
Range("Q4").Value = Range("M4").Value & Mid(n, 2)
End If
If p = "" Then
Range("R4").Value = ""
ElseIf IsNumeric(p) Then
Range("R4").Value = Range("O4").Value & p
Else
Range("R4").Value = Range("O4").Value & Mid(p, 2)
End If

If n <> "" And p <> "" Then
Range("N7:P476").AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("Q3:R4")
ElseIf n <> "" Then
Range("N7:N476").AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("Q3:Q4")
ElseIf p <> "" Then
Range("P7:P476").AdvancedFilter Action:=xlFilterInPlace, _
CriteriaRange:=Range("R3:R4")
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End If
End Sub


Chodzi o to by filtry zaawansowane dla kolumn P oraz N - działały tylko na widoczne wiersze (nie odkrywały mi wierszy które ukryło mi makro "UkryjWiersze") oraz założeniu filtra zwykłego w zakresie B7:L7 - ale tylko dla widocznych wierszy

Dodałbym załącznik ale nie wiem jak ??
Radosław Dumania

Radosław Dumania Senior Master Data
Analyst

Temat: Filtrowanie zaawansowane - VBA Excel

Spedzilem nad tym ok 2h bez rezultatu.

Okazuje sie ze problem w zadaniu stanowi brak ciaglosci zakresu widzialnych komorek

i tak:

Dim myrange As Range
Set myrange = Range("A8:E18").SpecialCells(xlCellTypeVisible)

'PONIZSZY KOD NIE DZIALA (I TAK MA BYC WG MICROSOFTU)
myrange.AutoFilter Field:=5, Criteria1:="z"

'PONIZSZY KOD DZIALA (I TAK MA BYC WG MICROSOFTU)
myrange.Copy

Jak widac utworzony obiekt myrange moze zostac tylko skopiowany przy zalozeniu ze jest nieciagly. Filtrowanie nie wchodzi w gre (zarowno autfiltr jak i advanced)

Podszedlbym do sprawy troche inaczej.
-W pierwszym makrze nie tylko trzeba schowac puste wiersze , ale rowniez oznaczyc je jako np blocked (w jakiejs dodatkowej kolumnie)

- w drugim makrze zrobic cos analogicznego do ponizszego kodu:
sub new()
Dim myrange As Range
Set myrange = Range("A1:B13")

myrange.AutoFilter 1, "<>blocked"
myrange.AutoFilter 2, "=8"
end sub

Mysle ze mozesz zmienic autofilter na adwanced filter w ostatniej linii kodu (no i dostosowac sie do wymagan techniczych tego zapisu) no chyba ze masz tylko 2 kryteria to autofilter powinien wystarczyc. A jak wiecej niz dwa to jest taki zapis array ( i bardzo wazny operator na koncu):

myrange.AutoFilter 2, Criteria1:=Array("2", "33", "55", "8", "858"), Operator:=xlFilterValues

Pamietaj ze dodajac kolumne z informacja blocked automatycznie musisz zwiekszyc zakres myrange

Cyferki po autofilter (1,2) oznaczaja numer kolumny ktorej filtr dotyczy.Ten post został edytowany przez Autora dnia 17.08.16 o godzinie 17:51

Następna dyskusja:

Drukowanie kilku stron na j...




Wyślij zaproszenie do