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

arrayformel ist langsam

arrayformel ist langsam
14.12.2018 11:24:51
W.
Hallo Zusammen,
Ich hab hier eine Arrayformel im VBA die verdammt langsam ist.
Sinn und zweck ist aus einem Variablem Tabellenblatt ein neues Blatt zu generieren, welches die Werte dann dort kumuliert nach max und min werten anzeigt.
Das funktioniert auch alles soweit, nur eben wahnsinnig langsam.
Im neuen Blatt steht dann der eindeutige wert in Spalte A und B und die dazugehörigen min und max Werte in E, F un G
Hier bsp. wie der Ursprung aussieht:
A B E F G
BAZN Name Fabrikat Nummer BEGINN ENDE
101 Rotamint Top+Jackpot 10100485 1983-04 1987-01
101 Rotamint Top+Jackpot 10101336 1983-06 1987-05
101 Rotamint Top+Jackpot 10101620 1983-05 x
101 Rotamint Top+Jackpot 10102064 x 1987-04
102 Rototron Rasant 102xxxxx x 1988-12
103 Rototron Titan 10300698 1983-10 x
103 Rototron Titan 10301976 1983-12 x
104 Merkur Bahia 10400921 x x
104 Merkur Bahia 10402849 1984-02 1988-01
106 Mister´X 10600503 1983-05 x
106 Mister´X 10600615 x x
106 Mister´X 10600744 1983-06 1987-05
und so sieht es nach dem Makro aus:
A B F G H I
BAZN Name Fabrikat Min F. Max G. Min aus E. Max aus E.
101 Rotamint Top+Jackpot 1983-04 1987-05 10100485 10102064
102 Rototron Rasant 0 1988-12 103 Rototron Titan 1983-10 10300698 10301976
104 Merkur Bahia 1984-02 1988-01 10400921 10402849
106 Mister´X 1983-05 1987-05 10600503 10600744
Calculation und Enable und ScreenUpdating ist auf Manuel bzw. False
Die If´s mit den ClearContents halfen auch nicht wirklich.
Dachte wenn ich unnötige bzw. leere Zellen gleich lösche bring das was.
hier mal ein Auszug vom Makro:
a = 2
Do Until IsEmpty(Cells(a, 1))
Cells(a, 6).Select
ActiveCell.FormulaArray = "=MIN(IF(((RC[-5]='" & strName & "'!C[-5])*(RC[-4]='" & strName & "'!C[-4])),'" & strName & "'!C[-0]))"
Cells(a, 7).Select
ActiveCell.FormulaArray = "=MAX(IF(((RC[-6]='" & strName & "'!C[-6])*(RC[-5]='" & strName & "'!C[-5])),'" & strName & "'!C[-0]))"
If Cells(a, 6).Text = "1900-01" Then Cells(a, 6).ClearContents Else Cells(a, 7).Select
If Cells(a, 7).Text = "1900-01" Then Cells(a, 7).ClearContents
Cells(a, 8).Select
ActiveCell.FormulaArray = "=MIN(IF(((RC[-7]='" & strName & "'!C[-7])*(RC[-6]='" & strName & "'!C[-6])),'" & strName & "'!C[-3]))"
If Cells(a, 8).Value = "0" Then Cells(a, 8).ClearContents Else Cells(a, 9).Select
ActiveCell.FormulaArray = "=MAX(IF(((RC[-8]='" & strName & "'!C[-8])*(RC[-7]='" & strName & "'!C[-7])),'" & strName & "'!C[-4]))"
If Cells(a, 9).Value = Cells(a, 8).Value Then Cells(a, 9).ClearContents
a = a + 1
Loop
End If
Next
Hoffe man kann erkennen was ich damit erreichen will und es hat mir jemand einen guten Tipp.
Danke schon mal
Gruß
Ghostman

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: arrayformel ist langsam
14.12.2018 11:45:14
Luschi
Hallo Ghostman,
Du schreibst per 'FormulaArray' die Array-Formeln in die Zellen und Excel muß!!! sie dann ausrechnen.
Dann kannst Du doch gleich die Array-Formeln in die Zellen schreiben und der Effekt ist der gleiche.
Also muß eine andere Technologie her; ich verwende dazu AdoDB und definiere die Filterbedingung der Array-Formeln in den entsprechenden Recordset-Filter - und da gibt es erhebliche Zeit-Einsparpotentiale.
Aber wie gesagt, dazu braucht man schon mehr Vba-Wissen als 'bescheiden'.
Gruß von Luschi
aus klein-Paris
AW: arrayformel ist langsam
14.12.2018 12:03:55
Matthias
Moin!
Brauchst du die Formeln für später nochmal, damit die Berechnung / Anzeige immer aktuell ist? Wenn nicht, würde ich auf die Formeln verzichten und das gleich im Code vergleichen und und erfassen. Insb. da du ja eh schon durch jede Zeile gehst.
Ansonsten:
Verzichte auf das select. Du kannst die Formel auch gleich in die gewünschte Zelle schreiben. Dann nimmt deine Formel immer die ganze Spalte zum Durchsuchen. Evtl. wäre es da besser, den Bereich gleich einzugrenzen (bspw. in dem du die Spalte A durchgehst, bis eine andere Nummer kommt. Dann weißt du den geneauen Bereich und brauchst nur noch das Min / Max etc. aus diesem Bereich auswerten.)
VG
Anzeige
AW: arrayformel ist langsam
14.12.2018 12:45:32
W.
Hallo Matthias,
Also die Formel brauch ich später nicht mehr nur den errechneten Wert.
Das mit dem in jede Zelle springen nervt mich auch. Wusste aber so keine andere Lösung.
Da meine VBA Kenntnisse "bescheiden" sind, sprich ich zeichne grob alles auf und versuche dann mit dem WWW und probieren alles zu verfeinern, wäre es klasse wenn du mir noch einen Tipp geben könntest wie das im CODE dann aussehen würde.
Danke
Ghostman
AW: arrayformel ist langsam
14.12.2018 13:19:01
W.
Also das mit Select hab ich jetzt ja mal behoben.
Code sieht zwar nicht viel anders aus als vorhin.
a = 2
Do Until IsEmpty(Cells(a, 1))
Cells(a, 6).FormulaArray = "=MIN(IF(((RC[-5]='" & strName & "'!C[-5])*(RC[-4]='" & strName & "'!C[-4])),'" & strName & "'!C[-0]))"
Cells(a, 7).FormulaArray = "=MAX(IF(((RC[-6]='" & strName & "'!C[-6])*(RC[-5]='" & strName & "'!C[-5])),'" & strName & "'!C[-0]))"
If Cells(a, 6).Text = "1900-01" Then Cells(a, 6).ClearContents Else Cells(a, 7).Select
If Cells(a, 7).Text = "1900-01" Then Cells(a, 7).ClearContents
Cells(a, 8).FormulaArray = "=MIN(IF(((RC[-7]='" & strName & "'!C[-7])*(RC[-6]='" & strName & "'!C[-6])),'" & strName & "'!C[-3]))"
If Cells(a, 8).Value = "0" Then Cells(a, 8).ClearContents Else Cells(a, 9).FormulaArray = "=MAX(IF(((RC[-8]='" & strName & "'!C[-8])*(RC[-7]='" & strName & "'!C[-7])),'" & strName & "'!C[-4]))"
If Cells(a, 9).Value = Cells(a, 8).Value Then Cells(a, 9).ClearContents
a = a + 1
Loop
End If
Next
Anzeige
AW: arrayformel ist langsam
14.12.2018 21:54:41
Matthias
Moin!
Hier mal eine Variante, die ohne Formel auskommt und gleich prüft.
https://www.herber.de/bbs/user/126115.xls
Auf dem Ergebnisblatt werden die Daten dann ausgegeben (alte Werte aber nicht gelöscht - war ich grad zu faul für). Einfach mal testen, ob es schneller als die Formelvariante ist.
VG
AW: arrayformel ist langsam
15.12.2018 06:00:54
W.
Hallo Matthias,
WOW ich bin Platt.
So schnell konnte ich gar nicht schauen. Genau so hatte ich mir das vorgestellt.
Konnte jetzt zwar nicht 100% testen, weil ich nicht die Original Tabelle mitgenommen hatte, aber es funktioniert.
Da werde ich mich mal am Montag versuchen reinzudenken was der Makro alles macht.
Perfekt und Vielen, vielen Dank
Super das es solche Leute und Foren gibt
Gruß
Ghostman
Anzeige
AW: arrayformel ist langsam
15.12.2018 10:33:21
Matthias
Moin!
War jetzt nur auf die schnelle programmiert. Deshalb bitte mal ausgiebig testen. Bei deinem Beispiel hattest du die Nummern mit x am Ende rausgelassen. Die sind bei mir noch drin - wußte nicht nach welchen Kriterien du da vorgangen bist. Und das mit 1900-01 habe ich auch (noch) nicht berücksichtigt.
Wenn Fragen sind, einfach stellen.
VG
AW: arrayformel ist langsam
17.12.2018 13:51:46
W.
Hallo Matthias,
Hab es heute noch mal getestet mit der gesamten Liste.
Klappt einwandfrei, auch mit meinem Teil des Makros zusammen. Sprich Tabellenblatt wird eingefügt anhand der ListBox ...etc.
Das was du oben mit den X und 1900-01 ansprichst hat sich aufgrund deines Makros auch erledigt.
Bei meiner ursprünglichen Array lief er bei leeren Zellen auf Fehler. Dafür war das gedacht.
Vielen herzlich Dank noch mal
Gruß
Ghostman
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige