Effizient Array aus gefilterter Liste erstellen

Bild

Betrifft: Effizient Array aus gefilterter Liste erstellen
von: Moritz
Geschrieben am: 23.07.2015 17:02:51

Hallo,
ich bin auf der Suche nach einer Möglichkeit 1-dimensionale Arrays auf Basis von Listen-Filtern zu erstellen.
Variante ohne Filter:
ValuesArray = .Worksheets(...).Range(.Worksheets(...).Cells(1,1), .Worksheets(...).Cells(100, 1))
Variante mit Filter:
j = 0
For i = 1 to 100
If cells(i,2) = "FilterKriterium" then
j = j + 1
ValuesArray(j,1) = cells(i,1)
End If
Next
Bei kleinen Listen und einem ValuesArray macht das zeitlich nicht so viel aus, wenn die Listen ab länger werden und ich auf Grund unterschiedlicher Kriterien mehrere Arrays benötige (z.B. ValuesArray1, ValuesArray2, ...), braucht VBA schon seine Zeit. Jede Zeile wird sich angeschaut und bei 5 ValuesArry noch 5 mal geprüft.
Ich hoffe meine Fragestellung ist soweit verständlich :).
Gibt es vielleicht eine effizientere Variante? Eine Variante, bei der ich vorher die Liste in Excel über VBA filtere und dann nur die relevanten Zeilen in den Array packe?
Viele Grüße
Moritz

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Daniel
Geschrieben am: 23.07.2015 17:29:41
Hi
beschleunigen kannst du das, in dem du auch die vollständigen Daten erstmal in ein Array schreibst und dann mit dem Array arbeitest anstatt mit den Zellen.

Dim Arr1
Dim Arr2
dim z1 as long
dim z2 as long
Arr2 = Range("A1:B100").Value
Redim Arr1(1 to Ubound(Arr2, 1), 1 to 1)
For i = 1 to Ubound(arr1)
    if Arr1(z1, 2) = "FilterKriterium" Then
        z2 = z2 + 1
        arr2(z2, 1) = arr1(z1, 1)
    end if
Next
gruß Daniel

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Moritz
Geschrieben am: 23.07.2015 18:28:38
Hi Daniel,
vielen Dank für Deine beiden Antworten. Was ich vielleicht bei der Frage also Info noch vergessen hatte, ich speichere in dem Array nur die Zeilennummer des Wertes, der relevant ist. Aus diesem Grund funktioniert das mit dem Sortieren nicht so direkt, es sei denn ich füge noch eine ID vorher ein. Die erste Variante mit dem vollständigen Array, ist vermutlich die einfachste. Ich habe jetzt keine Tests bisher gemacht, aber hast Du eine Idee, wie viel schneller man mit Arrays arbeiten kann anstatt mit Zellwerten?
Eine weitere Variante übers Filtern, bei dem die ursprüngliche Zeilennummer vorhanden bleibt, gibt es vermutlich nicht, oder :)?
Viele Grüße
Moritz

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Daniel
Geschrieben am: 23.07.2015 18:34:08
es ist auf jeden fall schneller, um wieviel, ist ja immer unterschiedlich, abhängig von dem was du so machst, dh das musst du selber testen.
Gruß Daniel

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Moritz
Geschrieben am: 24.07.2015 16:23:45
Hallo Daniel,
ich habe die Variante mal umgesetzt und sie ist wirklich deutlich schneller, statt 184 Sekunden nur 33 Sekunden, was eine Verbesserung der Durchlaufzeit von knapp 82% sind :).
Vielen Dank und viele Grüße
Moritz

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Daniel
Geschrieben am: 24.07.2015 16:33:59
Hi
teste mal, wie lang du brauchst, wenn du die Sortier-Variante verwendest.
die Zeilennummern kannst du ja vorher in einer Hilfsspalte mit Hilfe von Ausfüllen-Reihe hinterlegen.
Über diese Hilfsspalte kannst dann auch die Tabelle schnell wieder in den Ausgangszustand zurücksortieren, wenn die Tabelle selbst keine passenden Sortierkriterien enthält.
wie gesagt, im Sortieren ist Excel sehr schnell, Ausfüllen Reihe ebenfalls.
das .FIND braucht auch nicht viel Zeit, weil du ja nur zwei Zellen finden musst.
Gruß Daniel

Bild

Betrifft: AW: Effizient Array aus gefilterter Liste erstellen
von: Daniel
Geschrieben am: 23.07.2015 17:47:21
Hi
noch ne möglichkeit wäre, die Tabelle nicht zu filtern, sondern so zu sortieren, dass alles was ins Array muss, diretk untereinander steht.
Dann kannst du alle Werte zwischen dem ersten und letzten "Filterkriterium" direkt ins Array schreiben.
Im Sortieren ist Excel sehr schnell:

dim Zelle1 As Range, Zelle2 as range
dim ValuesArray
Range("A1:B100").sort Key1:=Range("B1"), Header:=xlguess
Set Zelle1 = Range("B1:B100").find(what:="Filterkriterium", SearchDirection:=xlnext)
Set Zelle2 = Range("B1:B100").find(what:="Filterkriterium", SearchDirection:=xlprevious)
ValuesArray = Range(Zelle1, Zelle2).Offset(0, -1).value
Gruß Daniel

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Effizient Array aus gefilterter Liste erstellen"