Frage von shikser, 132

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

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Garfield0001, 109

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.

Kommentar von shikser ,

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

Kommentar von shikser ,

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ß

Kommentar von Ninombre ,

vermutlich reicht eine Anpassung:

If intext > 0 And IsNumeric(ttext) Or intext > 0 And ttext = "" Then

Kommentar von shikser ,

Das klappt hervorragend, vielen Dank :)

Kommentar von Garfield0001 ,

genau. ich dachte nur dass immer etwas dahinter steht

Kommentar von shikser ,

Nee wenn die Überschrift das erste Mal auftaucht steht da leider nix hinter... Aber dank eurer Hilfe klappt das jetzt schon sehr gut :)

Expertenantwort
von Ninombre, Community-Experte für Excel, 96

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

Kommentar von shikser ,

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...

Kommentar von Iamiam ,

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(Und(Nicht(istfehler(suchen("AKMKaufteile";Zelle;1)>0)));istfehler(suchen("AKMKaufteileD";Zelle;1));istfehler(suchen("AKN....B";Zelle;1)));"Spalte relevant";"nicht relevant")

Kommentar von Ninombre ,

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"?

Expertenantwort
von Suboptimierer, Community-Experte für Excel, 86

Lösch die Sternchen bei AKMKaufteileB und AKMKaufteileD.

Kommentar von shikser ,

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 :/

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten