Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: 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
Anzeige

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
Anzeige
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
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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA in Array suchen: Mit .Find und Application.Match


Schritt-für-Schritt-Anleitung

Um in einem Array mit VBA nach Werten zu suchen, kannst du verschiedene Methoden verwenden. Hier sind die Schritte für die häufigsten Ansätze:

  1. Ein Array erstellen: Lade die gewünschten Daten in ein Array. Beispiel:

    Dim myArray() As Variant
    myArray = Range("A1:A10").Value
  2. Mit .Find suchen: Beachte, dass die .Find-Methode nicht direkt auf Arrays angewendet werden kann. Du musst eine Schleife verwenden, um das Array zu durchsuchen. Beispiel:

    Dim i As Long
    Dim valueToFind As String
    valueToFind = "Suchbegriff"
    For i = LBound(myArray) To UBound(myArray)
       If myArray(i, 1) = valueToFind Then
           MsgBox "Wert gefunden in Zeile: " & i
       End If
    Next i
  3. Mit Application.Match suchen: Diese Methode kann schneller sein, wenn das Array sortiert ist. Beispiel:

    Dim pos As Variant
    pos = Application.Match(valueToFind, myArray, 0)
    If Not IsError(pos) Then
       MsgBox "Wert gefunden an Position: " & pos
    Else
       MsgBox "Wert nicht gefunden"
    End If

Häufige Fehler und Lösungen

  • Fehler beim Finden in einem Array: Stelle sicher, dass du mit einer Schleife über das Array iterierst, da .Find nicht funktioniert.

  • Anwendung von .Match: Denke daran, dass Application.Match die Position innerhalb des Arrays zurückgibt, nicht die Zeilennummer. Achte darauf, deine Logik entsprechend anzupassen.


Alternative Methoden

  1. VBA .Find bei Tabellen: Wenn du in einer Excel-Tabelle nach einem Wert suchen möchtest, kannst du .Find direkt verwenden. Beispiel:

    Dim foundCell As Range
    Set foundCell = Range("A1:A10").Find("Suchbegriff")
    If Not foundCell Is Nothing Then
       MsgBox "Wert gefunden in: " & foundCell.Address
    End If
  2. Mehrfachsuche mit Schleifen: Wenn du mehrere Begriffe suchen musst, kannst du eine Schleife verwenden, um durch eine Liste von Suchbegriffen zu iterieren.


Praktische Beispiele

Hier ist ein komplettes Beispiel, das die Verwendung von Application.Match zur Suche in einem Array demonstriert:

Sub SearchInArray()
    Dim myArray() As Variant
    Dim searchValue As String
    Dim pos As Variant

    myArray = Range("A1:A10").Value
    searchValue = "Suchbegriff"

    pos = Application.Match(searchValue, myArray, 0)
    If Not IsError(pos) Then
        MsgBox "Wert gefunden an Position: " & pos
    Else
        MsgBox "Wert nicht gefunden"
    End If
End Sub

Dieses Beispiel zeigt, wie du einen Wert in einem Array suchen kannst. Wenn der Wert nicht gefunden wird, gibt es eine entsprechende Rückmeldung.


Tipps für Profis

  • Array-Performance: Wenn du mit großen Datenmengen arbeitest, kann das Arbeiten mit Arrays die Leistung erheblich steigern. Lade deine Daten einmal in das Array und führe alle Suchen darauf durch.

  • Verwendung von InStr: Bei der Suche nach Teilstrings in Arrays kannst du InStr verwenden, um flexiblere Suchkriterien anzuwenden:

    If InStr(1, myArray(i, 1), "Teilbegriff") > 0 Then
       ' Treffer gefunden
    End If

FAQ: Häufige Fragen

1. Kann ich .Find direkt auf einem Array verwenden?
Nein, die .Find-Methode funktioniert nur auf Range-Objekten in Excel. Du musst eine Schleife verwenden, um ein Array zu durchsuchen.

2. Wie kann ich mehrere Suchbegriffe in einem Array suchen?
Du kannst eine Schleife verwenden, um durch eine Liste von Suchbegriffen zu iterieren und jeden Begriff mit einer der Suchmethoden zu überprüfen.

3. Was ist der Unterschied zwischen .Find und Application.Match?
.Find sucht in einem Range und bietet mehr Optionen, während Application.Match die Position eines Wertes in einem Array zurückgibt und schneller ist, wenn das Array sortiert ist.

4. Wie gehe ich mit Fehlern bei Application.Match um?
Überprüfe mit IsError, ob der Rückgabewert von Application.Match ein Fehler ist, bevor du weiterarbeitest.

5. Ist es besser, mit Arrays oder direkt mit Tabellen zu arbeiten?
Für große Datenmengen ist die Arbeit mit Arrays in der Regel schneller, da du die Daten einmal lädst und mehrfach darauf zugreifen kannst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige