Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1368to1372
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

Esffektive Suche mit Application.Match ?

Esffektive Suche mit Application.Match ?
21.07.2014 13:56:29
Kuttel
Hallo an die Community,
da die Suche von Werten in einer Tabelle bei meinem Projekt eine zentale Rolle spielt, bin ich sehr an einer effektiven Suche interssiert. Bisher habe ich ein Makro, das Zelle für Zelle mit:
For i = 1 To Suchbereich.Columns.Count
If Suchbereich.Zelle(3,i).Value = Suchwert then
...
Exit For
...
End If
Next i

nach einem Wert sucht.
Wäre es vielleicht schneller/effektiver die Funktion Application.Match einzusetzen? Hinweis: die Werte in der Tabelle sind nicht geordnet. Außerdem ignoriert Application.Match Groß- und Kleinschreibung. Wie müsste man eine Suche mit Application.Match programmieren, die eine Groß- und Kleinschreibung beachtet und ggf. bei fehlender Übereinstimmung weiter sucht (ab da wo sie einen möglichen Treffer gefunden hat).
Mich würde interessieren, ob das dann am Ende schneller/effektiver ist als das Makro.
Danke und Gruß
Kuttel

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Esffektive Suche mit Application.Match ?
21.07.2014 14:49:21
Nepumuk
Hallo,
deine Suche in Zellen ist die langsamste Methode die es überhaupt gibt. Um 1.000.000 Zellen zu durchsuchen benötigt mein Rechner 8 Sekunden. Das selbe in einem Array dauert gerade mal 0,1 Sekunde.
Schau mal hier: http://www.office-loesung.de/ftopic641735_0_0_asc.php die Idee, finde ich gut.
Gruß
Nepumuk

AW: Esffektive Suche mit Application.Match ?
21.07.2014 15:17:40
UweD
Hallo
so?
Sub Ersetzen()
Dim Sh As Worksheet
Dim C
Dim SuchWert As String
Dim ErsetzWert As String
Dim SuchBereich As Range
Set Sh = ActiveSheet
Set SuchBereich = Sh.Rows(3)
SuchWert = "Alt"
ErsetzWert = "Neu"
Set C = SuchBereich.Find(SuchWert, LookIn:=xlValues)
If Not C Is Nothing Then
Do
'Mach was damit... z.B.
C.Value = ErsetzWert
Set C = SuchBereich.FindNext(C)
Loop While Not C Is Nothing
End If
End Sub
Gruß UweD

Anzeige
AW: Esffektive Suche mit Application.Match ?
21.07.2014 15:21:53
Nepumuk
Hallo Uwe,
hast du schon mal einen Vergleichstest gemacht? Also Find in der Tabelle versus lineares Durchsuchen eines Arrays? Da schneidet die Find-Methode nicht gut ab.
Gruß
Nepumuk

AW: Esffektive Suche mit Application.Match ?
21.07.2014 15:20:22
Daniel
Hi
wenn die Daten nicht sortiert sind und Gross-/Kleinschreibung beachtet werden muss, wäre die effetkivste Suche mit Hilfe der .FIND-Funktion
Set Zelle = Suchbereich.Rows(3).Find(What:=Suchwert, LookAt:=xlwhole, LookIn:=xlvalues,  _
MatchCase:=true)
If Zelle is Nothing then Msgbox Suchwert & " nicht vorhanden."
Application.Match ist dann sinnvoll, wenn die Daten sortiert sind, weil es dann eine wesentlich schnellere Suchmethode verwenden kann.
Wenn du denselben Suchbereich sehr oft verwenden willst, ohne dass sich die Inhalte verändern, kannst du auch so vorgehen:
1. Lese den Suchbereich in ein Array ein
2. Gehe mit einer Schleife durch das Array und vergleiche die Werte.
Schleifen über Arrays sind sehr schnell (ähnlich schnell wie die .Find-funktion) Zeit sparst du gegenüber .Find, weil du das Array nicht für jede Suche erneut einlesen musst:
Dim arrSuche
dim i as long
arrSuche = Suchbereich.Rows(3)
for i = 1 to Ubound(arrSuche, 2)
if arrSuche(i, 2) = Suchwert Then Exit For
Next
gruß Daniel

Anzeige
AW: Esffektive Suche mit Application.Match ?
21.07.2014 16:24:29
Kuttel
Vielen Dank zunächst an alle für die Tipps!
Gibt es beim Einlesen des Arrays eine Größenbeschränkung? Ist es problematisch, wenn ich einen Bereich mit ca. 120 Zeilen x 250 Spalten einlese oder vielleicht sogar ein ganzes Tabellenblatt (Zeilen und Spalten gehen in die Tausende...)?
Bringt die For-Each-Schleife eigentlich Vorteile/Schnelligkeit gegenüber der For-Next (bei Arrays bzw. in Range-Objekten)?
Danke und Gruß

AW: Esffektive Suche mit Application.Match ?
21.07.2014 17:25:47
Daniel
Hi
ja, bei den Arrays gibt es schon eine Grössenbeschränkung, aber die liegt irgendwo in den Millionen
bei Objekten ist For Each schneller als For Next (und oft auch die einzige Möglichkeit).
du kannst For Each auch auf Arrays anwenden, das hat aber den Nachteil, dass du dann nur den Wert kennst, aber nicht die Position im Array.
Gruß Daniel

Anzeige
Der 'Nachteil' ist relativ zu verstehen, denn, ...
21.07.2014 18:25:27
Luc:-?
…wenn man einen IndexZähler mitlaufen lässt, Daniel (& Kuttel),
hat man auch die Position. Dabei ist bei Matrizen allerdings zu beachten, dass im Ggsatz zu den entsprd ZellBereichen (Durchlauf Zeile für Zeile) DatenFelder (Arrays) normalerweise Spalte für Spalte durchlaufen wdn.
Außerdem gibt's ja auch noch die VBA-Entsprechung eines assoziativen Arrays, also das Dictionary, bei dem ein Index als Key festgelegt wdn kann.
Gruß, Luc :-?

AW: Der 'Nachteil' ist relativ zu verstehen, denn, ...
21.07.2014 18:34:27
Kuttel
Huch,
ich muss gestehen, dass Deine Ausführungen leider meinen Excel/VBA-Horizont übersteigen. Ein zweidimensionales Array kann ich doch auch mit zwei verschachtelten For-Next-Schleifen horizontal durchsuchen - oder ist das gerade wieder ineffektiv?
Diese Dictionaries und Collections sind leider noch Böhmische Dörfer für mich. Mit Collections habe ich nur ganz wenig gearbeitet, mit Dictionaries noch gar nicht. Lohnt sich das Befassen damit? Bringt es merkliche Unterschiede in Sachen Geschwindigkeit?
Gruß
Kuttel

Anzeige
AW: Der 'Nachteil' ist relativ zu verstehen, denn, ...
21.07.2014 19:42:51
Daniel
Hi
Die 2-d-Arrays kannst du problemlos mit zwei Schleifen durchlaufen.
Das for-each-in dürfte nicht viel bringen, wenn du zusätzlich noch die Zähler mitlaufen lässt (höchstens eine zusätzliche Fehlerquelle)
Dictionarys bzw. Assoziative Arrays sind im Prinzip eindimensionale Arrays mit einem Freitextindex.
Damit kann man schon tolle Sachen machen, aber es hängt von der konkreten Aufgabenstellung ab.
Gruß Daniel

AW: Der 'Nachteil' ist relativ zu verstehen, denn, ...
21.07.2014 22:08:44
Nepumuk
Hallo,
in der Zeit, die du brauchst um ein größeres Array in ein Dictionary zu packen, kannst du das Array 10mal durchsuchen.
Ich würde auf alle Fälle mal testen, wie es vom Zeitverhalten aussieht wenn du direkt in der Exceltabelle eine SQL-Abfrage machst. Dazu muss aber die Tabelle entsprechend aufgebaut sein (erste Zeile eine eindeutige Überschrift !!!) und du kannst immer nur Spaltenweise suchen.
Eine sehr effektive Methode ist es eine virtuelle Datenbanktabelle zu erstellen, denn SQL-Abfragen darin sind erheblich schneller als alles was VBA zu bieten hat. Dazu muss aber wie gesagt die Tabelle genau die vorgegebene Struktur haben.
Gruß
Nepumuk
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige