Microsoft Excel

Herbers Excel/VBA-Archiv

Code optimieren

Betrifft: Code optimieren von: Richi
Geschrieben am: 23.09.2020 15:51:58

Ciao Zäme
Ich hoffe jemand kann mir beim optimieren meines Codes behilflich sein. Im angefügten File sind 2 Module hinterlegt.

Module2:
Funktioniert grundsätzlich, jedoch bei grösseren Datenmengen wird es unheimlich langsam. Nehme an, dass der Grund beim einfüllen jeder einzelnen Zelle liegt (Comments und Farbe.

Modul3:
Ist der Code den ich mit dem ich die Optimierung erreichen will. Unterschied zu Module2 ist, dass jeweils nur in der ersten
Zelle alle Infos (Comments), hinterlegt und die Zellenfarbe mit errechnetem Range abgefüllt werden. Mein Problem ist, dass nicht mehr alle Zeileneinträge aus der Quellentabelle "Summaryplanung" übernommen werden. Muss irgendwie mit der Referenzierung der Zellen einen Zusammenhang haben. Ich komm nicht darauf warum.
Inputs eurerseits wären sehr hilfreich.

Liebe Gruess
Richi

https://www.herber.de/bbs/user/140382.xlsm

Betrifft: Thema 1 von 2 - Performance Gantt
von: ChrisL
Geschrieben am: 23.09.2020 19:18:35

Hi Richi

16 Zeilen (Tabelle Quelle) multipliziert mit 244 Spalten (Tabelle Ziel) = 3904 Durchläufe

Wie viele Zeilen sind im Normalfall vorhanden und wie lange wartest du ungefähr?

Datum (= Ganzzahl) minus fixer Wert ergibt deine Spaltennummer. Z.B. Datum 19.10.2020 - 44118 = 5

Da dein Gantt im 15 min. Takt aufgebaut ist, müsste man zusätzlich die Nachkommastellen verwerten. 1/24 = Stunden, 1/24/60 = Minuten usw.
(ich hoffe du verstehst, sonst mal zwecks Inspiration nach entsprechender Formellösung suchen, sinngemäss auf 1/4-Stunden runden)

Auf alle Fälle sollte die zweite For-Next-Schleife weg, bevor du das System in Modul 3 adaptierst.

Als Alternative zum beschriebenen Ansatz, könnte man es auch mit der Formel VERGLEICH() mit ungefährer Übereinstimmung probieren (Suchbereich Ziel Zeile 7). In VBA: Application.Match()

cu
Chris

Betrifft: AW: Thema 1 von 2 - Performance Gantt
von: Richi
Geschrieben am: 23.09.2020 19:48:42

Danke Chris
Fertig ausgebaut werden es gegen 1500 Zeilen. Aktuell habe ich 702 Zeilen und das Prg. läuft ca. 10-15min. wenn es dann mal durchläuft. Beim zweiten Run tut sich mein Arbeitsspeicher schwer. Stürzt ab. Ich bin "VBA-Anfänger" das macht es für mich nicht einfach neue Lösungswege zu finden, da mir gar nicht klar ist, in welche Richtung ich da suchen muss um For- Next-Schleifen eliminieren zu können.

Liebe Gruess
Richi

Betrifft: AW: Thema 1 von 2 - Performance Gantt
von: ralf_b
Geschrieben am: 23.09.2020 21:36:57

möglicherweise ist es auch schneller wenn du einige Berechnungen aus dem Stammblatt direkt im code machst. der Zugriff auf Zellwerte dauert auch ein wenig. z.b. diese Spaltenanzahl in Spalte Q.
Is aber nur ne Idee. application.screenupdating = false hilft auch sehr.

Betrifft: AW: Thema 1 von 2 - Performance Gantt
von: ChrisL
Geschrieben am: 24.09.2020 08:53:32

Hi Richi

Es hat erstmal nichts mit VBA zu tun, sondern mit normaler Mathematik (+, -, *, /). Hierzu müsstest du dich schon ein wenig selber mit der Rechenlogik von Excel in Kombination mit Datum/Uhrzeit auseinander setzen (auf 15min. runden wäre ein Beispiel zum Selbststudium).

19.10.2020 07:00 = Spalte 5
19.10.2020 18:30 = Spalte 51

Hast du erstmal die Spaltennummern, dann lässt sich der ganze Bereich bearbeiten, ohne die Zellen zu durchlaufen.
Range(Cells(xZeile, StartSpalte),Cells(xZeile, EndeSpalte))

Wie erwähnt, Start- und Endspalte liesse sich errechnen oder mittels Formel VERGLEICH() finden.
=VERGLEICH(I2;'W-sicht Modul2'!7:7;1)

cu
Chris

Betrifft: AW: Thema 1 von 2 - Performance Gantt
von: Richi
Geschrieben am: 24.09.2020 18:14:19

Hallo Chris
Hab deinen Rat umgesetzt. Mit Match Funktion. Ist richtig schnell geworden. Laufzeit ca. 30 sek.
Herzlichen Dank
Gruss
Richi

Betrifft: AW: Thema 1 von 2 - Performance Gantt
von: ChrisL
Geschrieben am: 24.09.2020 19:01:36

Hi Richi

Danke für die Rückmeldung.

Wenn du möchtest, lade noch einmal die Datei mit aktuellem Code ins Forum und ich schaue rein. 30 sek bei 1500 Zeilen sind OK, aber ich vermute einen weiteren Bremsklotz.

Sollte Thema 2 aus dem Ursprungsbeitrag noch aktuell sein, starte einen neuen Faden (mit frischem Code) und markiere als offen.

cu
Chris