Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1212to1216
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Filter mit mehreren Kriterien/ 4 Spalten

VBA Filter mit mehreren Kriterien/ 4 Spalten
Knatterkopf
Hallo Leute,
ich bin schon ein wenig am verzweifeln!
Habe folgende Code zum Filtern.
Jedoch funktioniert es nicht so recht. Habe im Forum nichts verwertbares gefunden, da oft mit Hilfsspalten und Verkettungen gearbeitet wird. Genau das versuche ich zu umgehen.
Ich möchte meinen Datensatz nach Werten, die in 4 Spalten stehen filtern.
Ich habe zwei Boxen, in denen die Kriterien stehen.
In einer der vier Spalten (2) kann nur der Wert aus Box1 stehen.
In den den restlichen 3 Spalten (3,4,6) der Wert aus Box 2.
Wenn der Wert aus Box2 zumindest einmal in den 3 Spalten (natürlich je Zeile) vorkommt, soll die Zeile angezeigt werden. Sprich eine Oderbeziehung zwischen den 3 Spalten.
Bin nur soweit gekommen:
Private Sub FilterButton_Click()
ActiveSheet.Range("$A$4:$N$892").AutoFilter Field:=2, Criteria1:="=*" & DropdownBauphase. _
Value & "*", _
Operator:=xlAnd
ActiveSheet.Range("$A$4:$N$892").AutoFilter Field:=3, Criteria1:="=*" & DropdownRolle.Value  _
_
& "*", _
Operator:=xlAnd
ActiveSheet.Range("$A$4:$N$892").AutoFilter Field:=4, Criteria1:="=*" & DropdownRolle.Value  _
_
& "*", _
Operator:=xlAnd
ActiveSheet.Range("$A$4:$N$892").AutoFilter Field:=6, Criteria1:="=*" & DropdownRolle.Value  _
_
& "*", _
Operator:=xlAnd
ActiveWorkbook.Worksheets("Schnittstellenlandkarte").AutoFilter.Sort.SortFields _
.Clear
With ActiveWorkbook.Worksheets("Schnittstellenlandkarte").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub

Lg
Adrian

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: VBA Filter mit mehreren Kriterien/ 4 Spalten
27.04.2011 17:41:51
Beverly
Hi Adrian,
ich mag mich irren, aber ich meine, das lässt sich nicht so wie du dir das vorstellst über den Autofilter ohne Verwendung einer Hilfsspalte lösen. Oder du läufst in einer Schleife über alle Zellen und prüfst, ob der Suchbegriff in mindestens einer der 3 Spalten vorkommt.


vielleicht mit Spezialfilter
27.04.2011 18:49:11
Tino
Hallo,
wenn ich mir Deinen Text durchlese, könnte man dies mit dem Spezialfilter machen.
Kannst Du eine Beispieldatei hochladen?
Gruß Tino
AW: vielleicht mit Spezialfilter
28.04.2011 08:17:50
Knatterkopf
Hallo,
danke schon mal für die Antworten.
Ich habe es schon mit einer Schachtelung von Schleifen die eine dynamische (muss nicht dynamisch sein) Range durchsucht probiert. Es funktioniert auch, aber viel zu langsam. liegt irgendwie an dem selection.hidden = true. Das braucht ewig =(
datei: https://www.herber.de/bbs/user/74573.xlsx
habe die beschreibung, wie es genau laufen soll in die excel file geschrieben.
lg
adrian
Anzeige
AW: vielleicht mit Spezialfilter
28.04.2011 09:49:39
Knatterkopf
Hi,
hier noch meinen selbst gebastelten Filter, der aber wie gesagt sehr sehr lahm ist.
Wenn man die gefundenen Zeilen auswählen und quasi merke kann (vll. im array oder noch schicker)
und zum schluss alle zusammen einmal .hidden = true dann würde es flott gehen.
Aber leider hab ich noch nicht den AhaMoment gehabt =(
Private Sub SpecialFilter_Click()
Dim Datenblatt As Worksheet, Bauphasen As Range
Dim StartZeile As Integer, MatchRow As Long, EndRow As Long, Spalte1 As Integer, SearchBP As  _
String, SearchRole As String, hello As String
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Set Datenblatt = Worksheets("Schnittstellenlandkarte")
With Datenblatt
StartZeile = 5
Spalte1 = 2
SearchBP = DropdownBauphase.Value
SearchRole = DropdownRolle.Value
EndRow = .Cells(.Rows.Count, Spalte1).End(xlUp).Row
Set Bauphasen = .Range(.Cells(StartZeile, Spalte1), .Cells(EndRow, Spalte1))
For Each cell In Bauphasen
hello = cell.Value
If Not InStr(cell.Value, SearchBP) > 0 And SearchBP  "" Then
If Not InStr(cell.Offset(0, 1).Value, SearchRole) > 0 And SearchRole  "" Then
If Not InStr(cell.Offset(0, 2).Value, SearchRole) > 0 Then
If Not InStr(cell.Offset(0, 4).Value, SearchRole) > 0 Then
cell.EntireRow.Hidden = True 'hier lahmt mein pferdchen!!
End If
End If
End If
Else
End If
Next
End With
End Sub
Viele Grüße
Adrian
Anzeige
Überschrift?
28.04.2011 10:06:46
Tino
Hallo,
haben die Spalten keine Überschrift?
Gruß Tino
AW: vielleicht mit Spezialfilter
28.04.2011 10:08:31
Rudi
Hallo,
so sollte das Pferdchen schneller rennen:
Private Sub SpecialFilter_Click()
Dim Datenblatt As Worksheet, Bauphasen As Range
Dim StartZeile As Integer, MatchRow As Long, EndRow As Long
Dim Spalte1 As Integer, SearchBP As String, SearchRole As String, hello As String
Dim rngHide As Range
Application.ScreenUpdating = False
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Set Datenblatt = Worksheets("Schnittstellenlandkarte")
With Datenblatt
StartZeile = 5
Spalte1 = 2
SearchBP = DropdownBauphase.Value
SearchRole = DropdownRolle.Value
EndRow = .Cells(.Rows.Count, Spalte1).End(xlUp).Row
Set Bauphasen = .Range(.Cells(StartZeile, Spalte1), .Cells(EndRow, Spalte1))
For Each cell In Bauphasen
hello = cell.Value
If Not InStr(cell.Value, SearchBP) > 0 And SearchBP  "" Then
If Not InStr(cell.Offset(0, 1).Value, SearchRole) > 0 And SearchRole  "" Then
If Not InStr(cell.Offset(0, 2).Value, SearchRole) > 0 Then
If Not InStr(cell.Offset(0, 4).Value, SearchRole) > 0 Then
If rngHide Is Nothing Then
Set rngHide = cell
Else
Set rngHide = Union(rngHide, cell)
End If
End If
End If
End If
Else
End If
Next
End With
If Not rngHide Is Nothing Then rngHide.EntireRow.Hidden = True
End Sub
Gruß
Rudi
Anzeige
zwei Versionen zum testen
28.04.2011 10:45:36
Tino
Hallo,
habe auch mal zwei Versionen eingebaut.
Einmal mit Spezialfilter und einmal mit Formel + Sortieren.
Ich gehe davon aus, dass die Version mit Sortieren bei sehr vielen Daten die schnellste ist.
https://www.herber.de/bbs/user/74581.xlsm
Viel Spaß beim testen.
Gruß Tino
AW: zwei Versionen zum testen
28.04.2011 11:18:16
Knatterkopf
Danke euch beiden!!
Vorallem für die Galopp-Antworten =)
Werds glei mal ausprobieren!
Habe es mit mal selbst mit der Speicherung der betroffenen Zeilen in einem Array versucht zu lösen.
Es geht auch ziemlich fix, nur habe ich keine Ahnung wie man nur diese Zeilen zusammen auswählen und dann im ganzen verstecken kann.
das würde mich mal interessieren, falls ihr noch lust habt =)
Gebe noch feedback.
Lg
Adrian
Anzeige
AW: zwei Versionen zum testen
28.04.2011 11:21:12
Knatterkopf
Hier der Code
Private Sub SpecialFilter_Click()
Dim Datenblatt As Worksheet, Bauphasen As Range, i As Long, z As Long, arrcells, Auswahl As  _
Range
Dim StartZeile As Integer, MatchRow As Long, EndRow As Long, Spalte1 As Integer, SearchBP As  _
String, SearchRole As String, hello As String
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Set Datenblatt = Worksheets("Schnittstellenlandkarte")
With Datenblatt
StartZeile = 5
Spalte1 = 2
SearchBP = DropdownBauphase.Value
SearchRole = DropdownRolle.Value
EndRow = .Cells(.Rows.Count, Spalte1).End(xlUp).Row
Set Bauphasen = .Range(.Cells(StartZeile, Spalte1), .Cells(EndRow, Spalte1))
ReDim arrcells(1) As Variant
i = 1
For Each Cell In Bauphasen
hello = Cell.Value
If Not InStr(Cell.Value, SearchBP) > 0 And SearchBP  "" Then
If Not InStr(Cell.Offset(0, 1).Value, SearchRole) > 0 And SearchRole  "" Then
If Not InStr(Cell.Offset(0, 2).Value, SearchRole) > 0 Then
If Not InStr(Cell.Offset(0, 4).Value, SearchRole) > 0 Then
arrcells(i) = Cell.Row
ReDim Preserve arrcells(UBound(arrcells) + 1)
i = i + 1
End If
End If
End If
End If
Next
For z = 1 To i
Next
End With
End Sub

Anzeige
AW: zwei Versionen zum testen
28.04.2011 12:12:58
Knatterkopf
@ Tino:
was muss ich tun, wenn die kriterien jeweils in einer kombobox vorhanden sind?
wäre auch schön.
lg
AW: zwei Versionen zum testen
28.04.2011 12:53:09
Rudi
Hallo,
nur habe ich keine Ahnung wie man nur diese Zeilen zusammen auswählen 

ich auch nicht. Deshalb habe ich sie in einem Range-Objekt gespeichert.
Gruß
Rudi
AW: zwei Versionen zum testen
28.04.2011 16:27:28
Knatterkopf
Dankd Rudi, danke Tino!!
egal, es funktioniert mit der Range =)
Probier jetzt noch Tinos lsg mit den Boxen und mache glücklich Feierabend!
Wäre nur interessant gewesen, da so ein array sich ja fix auslesen lässt...
VlG
Adrian
Anzeige
eine Range-Auflistung ...
28.04.2011 21:33:58
Rudi
Hallo,
... ist letztlich auch Array.
Gruß
Rudi

220 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige