Wie kann ich bei VBA nach mehreren Kriterien in einer Zeile suchen?
Hallo zusammen.
Ich hab leider nix gescheites zu meiner Problemstellung gefunden, deshalb frage ich jetzt einfach mal direkt nach: Ich möchte in einer großen Tabelle nach mehreren Kriterien in der ersten Zeile suchen. In dieser Zeile sind Überschriften (aus einer .xml übernommen). Leider wiederholen sich die Überschriften ab und an, allerdings mit den unterschiedlichsten Ziffern als Anhängsel (zb AKMKaufteile, AKMKaufteile5, AKMKaufteile324...). Das wäre jetzt aber noch kein Problem, da ich ja normalerweise eh nur nach Teilen des Wortes suche. Ich habe allerdings auch Überschriften die ziemlich ähnlich sind und mit als Treffer gewertet werden so wie ich das mache (zb AKMKaufteileD34, AKMKaufteileB412... also immer entweder das D oder das B mit da drin, und diese Spalten brauche ich nicht).
Zusammengefasst möchte ich einfach nur die erste Zeile nach AKMKaufteile (das ohne D und B) suchen und auch die Zellen/Spalten haben, wo die Ziffern angehängt sind; es handelt sich dabei um Preise, bei D ist das Datum und B der Benutzername angegeben, letztere beiden sind uninteressant).
For i = 1 To 1000
If InStr(1, Cells(1, i).Value, "AKMKaufteile") > 0 And InStr(1, Cells(1, i).Value, "AKMKaufteileB*") = 0 And InStr(1, Cells(1, i).Value, "AKMKaufteileD*") = 0 Then
For j = 1 To 300
If InStr(1, Cells(j, i).Value, "") > 0 Then
Cells(j, i).Activate
ActiveCell.Copy Destination:=Worksheets("Ergebnis").Cells(j, 10).Offset(1)
End If
Next j
End If
Next i
(So klappt es leider nicht)
Vielen Dank für jeden Tipp der mich weiterbringt ::)
Gruß
Jan
3 Antworten
Die Sternchen sind der Fehler.
warum arbeitest du aber mit "i" statt mit "Sp" und "j" statt mit "Ze"? ist doch eindeutiger.
verstehe ich es richtig dass du in der inneren If-Abfrage prüfst, dass die Zelle nicht leer ist? Dann wäre "If Cells (Ze, Sp). Value <> Empty Then" ... kürzer
auch verstehe ich nicht warum du die Zelle kopierst, statt den Wert zu übertragen. dann musst du diese auch nicht aktivieren.
"Worksheets ("Ergebnis").Cells (Ze, 10).Value =Cells(Ze, Sp). Value" wäre dann der einzige Code in der Abfrage.
Das Offset weiß ich jetzt nicht richtig einzuschätzen... aber wenn zb das zwar in Zeile 10, aber in der "nächsten Spalte" der Originalspalte sein soll, muss man ja dann nur "Sp+1" setzen und gut. Weiß aber nicht, ob das in deinem Fall so geht.
Ich habe im Test die erste If-Abfrage für mich etwas übersichtlicher gestaltet.
Vielleicht ist ja was dabei, was dir gefällt:
Text="AKMKaufteile"
For Sp = 1 To 1000
TText = Mid (Cells (1, Sp), 13, 1
InText = InStr (1, Cells (1, Sp).Value, Text)
If InText > 0 And IsNumeric (TText) Then
so ist die Zeile nicht so lang :-)
TText merkt sich das nächste Zeichen hinter dem "Text". ist es KEIN Buchstabe geht's eben weiter.
InText prüft ob der 'Text' überhaupt vorkommt.
Nee wenn die Überschrift das erste Mal auftaucht steht da leider nix hinter... Aber dank eurer Hilfe klappt das jetzt schon sehr gut :)
So, ich habe das jetzt getestet.
Sehr gut daran finde ich, dass keine Zelle mit D oder B benutzt wird, allerdings unterschlägt mir das Makro auch die Spalte, wo nur AKMKaufteile steht, also ohne irgendeinen Zusatz...
Gibt es dafür noch eine andere Möglichkeit, das mit in den Code einzugeben oder muss ich für diesen Fall einfach ne neue Schleife machen?
Gruß
Moin,
vielen Dank für die ausführliche Antwort. Ich mache mich gleich mal an die Umsetzung, werde mich wieder melden wenn es geklappt hat (oder ich es nicht schaffe :D)
Die Sache mit i und j war einfach nur Faulheit, und da ich grade nur einzelne Makros zum Testen schreibe, naja eigentlich fällt mir da keine gescheite Ausrede zu ein :D
Ich gelobe Besserung :P
Gruß
Jan
Die Sternchen musst Du bei den Suchbegriffen weglassen. Instr sucht genau nach dem angegebenen Wortteil. * wird nicht als Platzhalter interpretiert. Ansonsten müsste es meinem Verständnis nach mit dem Code funktionieren
Vielen Dank für die Antwort.
Das mit den Sternchen hatte ich nur mal ausprobiert und vergessen die hier wieder zu löschen :D
Hatte leider auch nicht geklappt :/
irgendwo muss ich da noch was anderes haben...
Der Wortteil ist ja auch in den uninteressanten Texten zu finden. dazu ist mir bis jetzt aber auch noch nichts gescheites eingefallen ausser einem umständlichen Und istfehler(
... And iserror(InStr(1, Cells(1, i).Value, "AKMKaufteileD")
And iserror(InStr(1, Cells(1, i).Value, "AKMKaufteileB")
wobei ich erst mal abtesten müsste, ob instr() tatsächlich einen Fehler ausgibt-
Das lässt sich übrigens genausogut auch mit einer Formel machen nach dem gleichen Schema:
=Wenn(
Nicht(istfehler(suchen("AKMKaufteile";Zelle;1)>0)));istfehler(suchen(Und(
;Zelle;1));istfehler(suchen("AKN....B";Zelle;1)));"Spalte relevant";"nicht relevant")"AKMKaufteileD"
ganz verstehe ich nicht, warum es mit der bisherigen Abfrage nicht funktionieren soll. Instr liefert eine 0 wenn der Suchbegriff nicht gefunden wird. Wenn in der Zelle AKMKaufteile123 steht und man auf "AKMKaufteile" abfragt, wird ein >0 geliefert und bei der Abfrage auf "AKMKaufteileD" eine 0. Die UND Bedingung sollte also funktionieren.
Wie genau äußert sich das "klappt nicht"?
Lösch die Sternchen bei AKMKaufteileB und AKMKaufteileD.
Vielen Dank für die Antwort.
Das mit den Sternchen hatte ich nur mal ausprobiert und vergessen die hier wieder zu löschen :D
Hatte leider auch nicht geklappt :/
genau. ich dachte nur dass immer etwas dahinter steht