Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1752to1756
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 in Array mit .find suchen

VBA in Array mit .find suchen
20.04.2020 17:22:40
W
Hallo Forum,
ich benutze folgende Befehle, um alle Fundstellen eines angegebenen Begriffs zu finden.
StartRow ist die Zeile, in der mit der Suche begonnen werden soll
MaxRows ist die Nummer der letzten zu durchsuchenden Zeile
WFCol ist die Nummer der Spalte, in welcher gesucht werden soll.
Als Ergebnis wird ein Array mit den Zeilennummern zurückgegeben.

Jetzt habe ich das Problem, dass diese Routine nur funktioniert, wenn keine Zeilen ausgeblendet sind.
Ich möchte nicht alle Zeilen sichtbar machen, weil es mir dann nicht mehr möglich ist, wieder den alten Stand herzustellen. Im Forum habe ich gelesen (und ein Test hat mir das bestätigt), dass ich alle (auch die ausgeblendeten) Zeilen in einen Array einlesen kann.
Jetzt ist nur noch die Frage: wie müsste mein nachfolgender Code aussehen, wenn ich statt in einer Tabelle in einem Array suche? Wer kann mir weiterhelfen.
Hier die Code-Teile
Dim Wo As Variant
Set Wo = Range(Cells(StartRow, WFCol), Cells(MaxRows, WFCol)).Find( _
What:=Suchbegriff, _
Lookat:=xlPart, _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=true)
Set Wo = Range(Cells(StartRow, WFCol), Cells(MaxRows, WFCol)).FindNext(Wo)
Gruß
W H21

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA in Array mit .find suchen
20.04.2020 17:38:24
Nepumuk
Hallo,
in einem Array kannst du mit der Find-Methode nicht suchen. Das musst du abklappern, ist aber schneller als per Find.
Gruß
Nepumuk
AW: VBA in Array mit .find suchen
21.04.2020 09:52:45
W
Hallo Nepumuk
und vielen Dank für Deinen Hinweis.
Gruß W H21
AW: VBA in Array mit .find suchen
20.04.2020 18:40:34
Daniel
hi
wenn du in einer Exceltabelle mit ausgeblendeten Zeilen innerhalb einer Spalte suchen willst, kannst die Zeilen- bzw Positionsnummer auch mit Application.Match (entspricht der Excelfunktion Vergleich) ohne Schleife ermitteln.
wenn der Suchbegriff fehlen kann, muss man die aufnehmende Variable als Variant deklarieren und auf Fehler prüfen.
für ein .FindNext muss man die Suche ab der letzten Fundstelle Starten.
der folgend Beispielcode sucht alle "xxx" in Spalte A:
dim ZE
ZE = 0
DO
ZE = Application.Match("xxx", Range(Cells(ZE + 1, 1), Cells(rows.count, 1)), 1)
if Vartype(ZE) = vbError then Exit Do
MsgBox "xxx in Zeile: " & ZE
Loop
gruß Daniel
Anzeige
AW: VBA in Array mit .find suchen
21.04.2020 10:52:40
W
Hallo Daniel,
auch Dir recht herzlichen Dank für Deine Antwort.
Ich habe Deinen Code (leicht modifiziert) probiert; leider funktioniert er nicht
In meine Tabelle habe ich ein paar Zeilen Text aus dem Gedicht "Die Glocke" eingefügt. Dann habe ich folgenden Code ausgeführt:
Sub Test()
Dim ZE
Dim RowsCount
ZE = 0
RowsCount = 48
Do
ZE = Application.Match("*uns*", Range(Cells(ZE + 1, 1), Cells(RowsCount, 1)), 0)
If VarType(ZE) = vbError Then Exit Do
Debug.Print ZE & " " & Cells(ZE, 1).Value
Loop
End Sub
Beim Suchbegriff musste ich am Beginn und am Ende einen "*" einfügen.
Folgendes wird mir mit Debug.Print angezeigt:
13 So laßt uns jetzt mit Fleiß betrachten,
19 Daß er im innern Herzen spüret,
13 So laßt uns jetzt mit Fleiß betrachten,
19 Daß er im innern Herzen spüret,
13 So laßt uns jetzt mit Fleiß betrachten,
... und wenn ich es nicht abgebrochen habe, dann läuft es noch immer!!!!
Gruß
W H21
Anzeige
AW: VBA in Array mit .find suchen
21.04.2020 11:01:41
Daniel
Sorry Denkfehler meinerseits
Match ergibt nicht die Zeilennummer, sondern die Position innerhalb des Arrays
Do
Pos = Application.Match("*uns*", Range(Cells(ZE + 1, 1), Cells(RowsCount, 1)), 0)
If VarType(Pos) = vbError Then Exit Do
ZE = ZE + Pos
Debug.Print ZE & " " & Cells(ZE, 1).Value
Loop

Gruß Daniel
AW: VBA in Array mit .find suchen
21.04.2020 11:53:19
W
Hallo Daniel,
Bingo. Das war die Ursache. Jetzt bekomme ich die Ergebnisse, die ich erwartet habe - auch aus ausgeblendeten Zeilen.
Vielen Dank. Problem erledigt.
Gruß - und bleibt alle gesund!!
W H21
Anzeige
AW: VBA in Array mit .find suchen
21.04.2020 14:10:09
W
Hallo,
jetzt habe ich doch noch eine Frage:
Appliction.Match auf eine Tabelle setzt voraus, dass das entsprechende Blatt das aktive Blatt ist. Gleiches gilt, wenn der Inhalt einer Tabelle in einen Array geladen werden soll.
Bei meinem aktuellen Projekt werden zuerst zwei bestimmte Begriffe gesucht, die überwiegend mehrfach vorhanden sind. Bei der Auswertung der gefundenen Zeilen werden weitere Suchbegriffe ermittelt, nach welchen im Rahmen vieler weiteren Suchen gesucht werden soll. Um nicht jedesmal die Tabelle zu durchsuchen, habe ich die Tabelle inzwischen in einen Array geladen. Somit kann der Array mehrfach zur Suche benutzt werden, ohne immer wieder neu gefüllt zu werden.
Nun mein Problem: wenn ich die Suche mit Application.Match in Verbindung mit dem Array mache: wie kann ich dann weitersuchen? Wie kann ich dem "Match" sagen, dass er nicht von vorne anfangen soll?
Gruß
W H21
Anzeige
AW: VBA in Array mit .find suchen
21.04.2020 14:38:58
Daniel
"Appliction.Match auf eine Tabelle setzt voraus, dass das entsprechende Blatt das aktive Blatt ist."
das ist Unsinn. du musst nur die Zellbereiche vollständig mit Angabe des Tabellenblatts referenzieren.
hierbei ist zu beachten, dass das Blatt vor jedem Cells, Range, Columns oder Rows stehen muss, auch bei Range(Cells, Cells) und da wird es meistens vergessen, aber das Blatt muss vor die Cells
falsch ist TabX.Range(Cells(), Cells())
richtig ist: Range(TabX(Cells(), TabX(Cells())
oder man verwendet Resize zum erstellen eines Zellbereichs: TabX.Cells(x, y).Resize(AnzZeilen, AnzSpalten)
das spart die doppelte Angabe des Blattes.
wenn du ein Array hast, kannst du Application.Match auch verwenden, wenn:
a) das Array eindimensional ist
b) das Array zweidimenional ist, aber eine Dimension nur aus einem Element besteht (Vektor = eine Zeile oder eine Spalte)
bei Match mit Array beginnt die Suche immer am Anfang. Es ist nicht möglich die Suche ab einer bestimmten Arrayposition zu beginnen (außer, die Hilfe sagt was anderes)
aber wenn du die Werte in einem Array hast, kannst du auch einfach per Schleife durchs Array laufen und dir die gesuchten Werte ausgeben lassen, das ist dann genauso schnell und die Schleife brauchst du bei Mehrfachsuche ja sowieso.
Application.Match ist bei Arrays nur sinnvoll, wenn man nur einen bzw das erste Auftreten eines Wertes sucht, oder wenn die Liste sehr groß und sortiert ist.
dann kann man die andere Variante von Match verwenden (3. Parameter = 1), welche aufgrund der binären Suche für sortierte Daten nochmal um welten schneller ist als eine Suchschleife.
Gruß Daniel
Anzeige
AW: VBA in Array mit .find suchen
21.04.2020 17:26:06
W
Hallo Daniel,
vielen Dank für Deine Aufklärung. Diese Schreibweise mit dem Blatt habe ich bisher noch nicht gesehen; das war neu für mich. Natürlich habe ich das sofort umgesetzt, und das von mir beschriebene Problem mit der aktiven Tabelle gibt es nicht mehr.
Danke auch für den Hinweis, dass eine Array immer von Anfang an durchsucht wird. Dann kommt diese Art der Ermittlung für mich nicht in frage.
Bleiben also 4 Varianten:
1. Mit Application.Match durch das Tabellenblatt
2. Mit Loop und Instr() durch das Tabellenblatt
3. Mit Loop durch den Array, wobei dieser nur einmal geladen wird
4. Mit Loop durch den Array, wobei dieser bei jedem Suchlauf neu gelanden wird.
Ich habe alle 4 Varianten jeweils 100 mal getestet und komme dann zu folgenden Aussagen:
Anzahl der zu durchsuchenden Zeilen: 3912
Variante 1: im Schnitt 0,02234 Sekunden pro Suchlauf
Variante 2: im Schnitt 0,03469 Sekunden pro Suchlauf
Variante 3: im Schnitt 0,00156 Sekunden pro Suchlauf
Variante 4: im Schnitt 0,00157 Sekunden pro Suchlauf
Fazit: für mich kommt nur Variante 4 in frage; der Unterschied zwischen 3 und 4 ist sehr klein.
Bei Instr() wird auf einen Zeichenstring getestet; deshalb wurden hier auch nur 154 Treffer erzielt; bei Match wurde kein Unterschied zwischen Klein- und Großbuchstaben gemacht und deshalb 27 weitere Treffer ermittelt.
Ich habe die Logik in einer eigenen Funktion gelöst. Jetzt werde ich die Funktion mit dem neuen Wissen erweitern. Dabei gibt es bereits die Option, ob Matchcase eine Rolle spielt.
Nachdem ich nun die Zeilen kenne, in denen der von mir gesuchte Begriff zu finden ist, werden nun alle Treffer überprüft, Dabei wird auch die Schreibweise geprüft, Nur solche Treffer, welche nicht durch den "Raster" fallen, werden an den Aufrufer der Funktion zurückgegeben. Aber diese Logik besteht ja bereits in meiner bisherigen Funktion.
Ich habe eine Mappe mit den 4 Varianten erstellt. Die Datenmenge ist kleiner und jeder sollte sie aus seiner Schulzeit kennen.
Die Mappe ist hier zu finden: https://www.herber.de/bbs/user/136943.xlsm
Gruß
W H21
Anzeige

207 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige