Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1436to1440
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

Effizient Array aus gefilterter Liste erstellen

Effizient Array aus gefilterter Liste erstellen
23.07.2015 17:02:51
Moritz
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

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Effizient Array aus gefilterter Liste erstellen
23.07.2015 17:29:41
Daniel
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

AW: Effizient Array aus gefilterter Liste erstellen
23.07.2015 18:28:38
Moritz
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

Anzeige
AW: Effizient Array aus gefilterter Liste erstellen
23.07.2015 18:34:08
Daniel
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

AW: Effizient Array aus gefilterter Liste erstellen
24.07.2015 16:23:45
Moritz
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

AW: Effizient Array aus gefilterter Liste erstellen
24.07.2015 16:33:59
Daniel
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

Anzeige
AW: Effizient Array aus gefilterter Liste erstellen
23.07.2015 17:47:21
Daniel
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
Anzeige

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige