Zählenwenn... Beschleunigung VBA?
24.07.2021 01:37:47
Frank
leider muss ich ">" durch "gr." ersetzen, also in den Formeln steht anstatt ">" "gr.".
ich muss 700 Zählenwennfunktionen abarbeiten und ausgeben (gr.1, gr.2, gr.3 usw... jeweils als einzelnes Ergebnis in 700 Zellen, kann nicht zusammengefasst werden) und zwar über 800000 Zeilen aus Spalte A, die 700 Ergebnisse sind dann in Spalte B. Muss Excel benutzen, falls jemand das über eine Datenbank lösen will. Das geht leider nicht.
Ich bräuchte also VBA Code wäre für: Zählenwenn Spalte A >1, Ausgabe in Zelle B1.
VBA (countif?) soll wohl schneller sein wg. anderer Berechnungart als mit zählenwenn via Formel, dazu komme ich gleich.
sieht dann so aus, ganz einfach: (A=Spalte A)
A
5
(leere Zelle)
6
(leere Zelle)
(leere Zelle)
8
(leere Zelle)
4
.
.
usw.
Zum Glück sind nur ca. 2000 von 800000 Zeilen gefüllt in Spalte A, das gibt etwas Spielraum für Formeln / VBA.
Ohne VBA konnte ich mir nur bedingt behelfen:
Leider dauert eine Berechnung dann ca. 30 Sekunden da ich 700 Zählenwennfunktionen (Ausgabe in Spalte B1 bis B700) benutze und z.B. hier in Spalte B ausgebe
(also B1=Zählenwenn(A1:A800000;"gr."1)
(also B2=Zählenwenn(A1:A800000;"gr."2)
usw.
Ich konnte den Code schon etwas beschleunigen mit einer vorherigen Abbruchfunktion.
Habe aus
B1=zählenwenn(a1:a800000;"gr."1) diese Formel gemacht =wenn(a1:a800000<=1;0;zählenwenn(a1:a800000;"gr."1))
B2=zählenwenn(a1:a800000;"gr."2) diese Formel gemacht =wenn(a1:a800000<=2;0;zählenwenn(a1:a800000;"gr."2))
Komischerweise müsste der Code viel schneller sein wenn Excel wirklich abbrechen würde wenn die wenn-Funktion erfüllt ist, da von den 800000 Zellen nur ca. 2000 wirklich mit Werten gefüllt sind. Leider macht das Excel wohl intern nicht so und eine Berechnung dauert kürzer aber immer noch 25 Sekunden.
Daher ist das leider keine Lösung.
Eine sehr unelegante Lösung ohne VBA ist Folgende und dauert auch noch relativ lange, da die Zeilenanzahl aus Spalte A (800000) einfach zu hoch ist für's filtern/kopieren:
Filter setzen auf Spalte A, "leere" abwählen, dann die restlichen Zellen (nicht leeren) kopieren und in neue Tabelle kopieren in Spalte A und hier dann die Zählenwennfunktionen in Spalte B nur über z.b. 10000 Zellen ausführen (sind ja meistens nur 2000 gefüllt bei mir, da reichen dann 10000 aus, also Spalte B kann ich dann z.B. verringern von 800000 auf 10000 Zellen, das wäre dann: B1=zählenwenn(a1:a10000;"gr."1) und das geht dann natürlich deutlich schneller.
Das kann man auch alles in ein Makro packen, finde ich aber sehr unelegant und dauert auch noch relativ lange durch das einfügen der gefilterten Zellen in das
neue Tabellenblatt, da Excel trotzdem immer noch mit den 800000 Zellen zu kämpfen hat(warum auch immer) - obwohl ja nur noch 2000 kopiert/eingefügt werden.
Eine neue Berechnung ist dann auch noch nötig was wieder Zeit kostet.
kurz: Das ist Murks.
-----------------------
Habt Ihr viell. noch eine andere Lösung ohne VBA?
Ansonsten:
Ich habe gehört, dass die VBA-Excel-funktion (countif?) dieses Problem wohl nicht hat und deutlich schneller zählen kann.
Mir ist klar, dass auch das eine nicht unerhebliche Arbeit werden wird 700 mal VBA "count if" zu coden, aber dass muss ich dann nur einmal machen (da ich 700 Ergebnisse brauche in 700 Zellen)
Die Ausgabe wäre dann z.B. in Spalte B.
Spalte B1 wäre dann alle größer 1 aus Spalte A
Spalte B2 wäre dann alle größer 2 aus Spalte A
Spalte B3 wäre dann alle größer 3 aus Spalte A
Usw....
Kann mir hier jemand den VBA-Code für B1 zur Verfügung stellen?
Das wäre dann ohne VBA gesprochen:
B1 = zählenwenn(A1:A800000;"gr."1) - ich brauche also diese Formel in VBA (countif ist glaube der Ansatz). Kann mir auch gut vorstellen, dass wenn man die leeren Zellen via VBA nicht zählt der Code noch schneller läuft (oder langsamer?) - das weiß ich aber nicht.
Für B2 usw. kann ich dann ja (700 mal....) den Code aus B1 manuell abändern und dahinter einfügen (das wird wohl das längste Makro dass ich jemals hatte)...
Das Problem bei Zählenwenn ohne VBA ist wohl, dass Excel den entsprechenden Bereich der gezählt werden soll wohl nicht linear abarbeitet und immer wieder Zellen auf Veränderungen überprüft beim Zählen. Daher steigt die Rechenintensität bei Zählenwenn ohne VBA exorbitant an bei größeren Zellenmengen (bei mir halt 800000).
---------------
Vielleicht hat jemand von Euch noch eine ganze andere Lösung? VBA Code wäre super für Zählenwenn Spalte A >1, Ausgabe in Zelle B1.
Vielen Dank für Eure Mühe !