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

Code optimieren

Code optimieren
07.08.2015 13:05:54
Marcel
Hallo zusammen,
ich habe einen VBA-Code geschrieben, der sich inzwischen leider ein wenig aufgebläht hat (3000 Zeilen). Ich würde ihn gerne etwas "verkürzen"/"optimieren", um die Performance zu verbesseren. Zudem wird sich der Code voraussichtlich noch weiter verlängern.
Dazu folgender Auszug:

Range("E2").Formula = _
"=IF(D2=0,0,((SUMIFS(Tabelle1!D:D,Tabelle1!B:B,"">=1"",Tabelle1!B:B,""=1"",Tabelle1!C:C,""=1.16"",Tabelle1!B:B,""=1.16"",Tabelle1!C:C,""=1.33"",Tabelle1!B:B,""=1.33"",Tabelle1!C:C,""=1.50"",Tabelle1!B:B,""=1.50"",Tabelle1!C:C,""=1.66"",Tabelle1!B:B,""=1.66"",Tabelle1!C:C,""=1.83"",Tabelle1!B:B,""=1.83"",Tabelle1!C:C,""=2"",Tabelle1!B:B,""=2"",Tabelle1!C:C,""=2.16"",Tabelle1!B:B,""=2.16"",Tabelle1!C:C,""=2.33"",Tabelle1!B:B,""=2.33"",Tabelle1!C:C,""=2.50"",Tabelle1!B:B,""=2.50"",Tabelle1!C:C,""=2.66"",Tabelle1!B:B,""=2.66"",Tabelle1!C:C,""=2.83"",Tabelle1!B:B,""=2.83"",Tabelle1!C:C,""

Diese Logik geht dann noch so weiter (Blockanzahl im hohen 2-stelligen Bereich), ist natürlich nicht sehr effizient und hat inzwischen zu einer "Procedure too long"-Fehlermeldung geführt (die ich bisher mit einer "call"-Anweisung umgehe.
Das Ganze gibt es dann im gleichen Code außerdem in ähnlicher/gleicher Logik mit "Summenprodukt":

Range("M2").Formula = "=SUMPRODUCT((Tabelle1!H:H>=1)*(Tabelle1!H:H=1.16)*(Tabelle1!H:H=1.33)*(Tabelle1!H:H=1.50)*(Tabelle1!H:H=1.66)*(Tabelle1!H:H=1.83)*(Tabelle1!H:H=2)*(Tabelle1!H:H=2.16)*(Tabelle1!H:H=2.33)*(Tabelle1!H:H=2.50)*(Tabelle1!H:H=2.66)*(Tabelle1!H:H=2.83)*(Tabelle1!H:H
Kann mir hierbei jemand helfen? (vielleicht das Ganze mit einer "For-Schleife" oder ähnlichem und Variablen umzusetzen, dass das nicht jeweils manuell in jede Zelle geschrieben werden muss?)
Über jede Hilfe oder Ideen bin ich dankbar! :)
Viele Grüße
Marcel

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code optimieren
07.08.2015 13:51:59
Daniel
Hi
wenn du die Vergleichswerte für die ZählenWenns in Hilfspalten in die Tabelle einträgst und sich die Formel dann die Werte aus der jeweiligen Hilfsspalte holt, dann wäre die Formel für alle Zellen innerhalb der Spalte gleich und du könntest sie dann in alle Zellen gleichzeitig eintragen.
Oder du findest einen Weg, diesen Vergleichswert mit Hilfe aus der Zeilennummer in der die Formel steht zu berechnen, dann ist auch die Formel für alle Zellen gleich aber du brauchst keine Hilfsspalten.
Range("E2:E3000").Formula = "=SumIfs(..."
kleiner Tip noch am Rande: nimm in VBA die R1C1-Schreibweise für Zellbezüge.
dann sieht man schneller, welche Formeln "gleich" sind, dh mit Copy-Paste in die anderen Zellen übertragen werden können.
Gruß´Daniel

Anzeige
AW: Code optimieren
07.08.2015 14:08:33
Rudi
Hallo,
als Anregung für den oberen Block:
Sub aa()
Dim i As Long, arr, m As Integer, n As Integer, arrFormel(), lAnzahl As Long
arr = Array(0, 0.16, 0.33, 0.5, 0.66, 0.83)
lAnzahl = 100
ReDim arrFormel(1 To lAnzahl, 1 To 1)
m = 1
For i = 1 To lAnzahl
arrFormel(i, 1) = _
"=IF(RC[-1]=0,0,((SUMIFS(Tabelle1!C[-1],Tabelle1!C[-3],"">=" & m + arr(n) _
& """,Tabelle1!C[-3],""=" & m + arr(n) _
& """,Tabelle1!C[-2],""
Gruß
Rudi

AW: Code optimieren V2
07.08.2015 14:28:19
Rudi
Hallo,
ohne Hilfsarray:
Sub aa()
Dim i As Long, arrFormel(), lAnzahl As Long
Dim sngWert As Single
lAnzahl = 1000  'Anzahl Formeln
ReDim arrFormel(1 To lAnzahl, 1 To 1)
For i = 1 To lAnzahl
sngWert = Int(((i + 1) / 6 + 2 / 3) * 100) / 100
arrFormel(i, 1) = _
"=IF(RC[-1]=0,0,((SUMIFS(Tabelle1!C[-1],Tabelle1!C[-3],"">=" & sngWert _
& """,Tabelle1!C[-3],""=" & sngWert _
& """,Tabelle1!C[-2],""

Gruß
Rudi

Anzeige
AW: Code optimieren V3
07.08.2015 14:43:32
Rudi
kann man auch direkt als Formel eintragen:
Sub ab()
Cells(5, 2).Resize(100).FormulaR1C1 = _
"=IF(RC[-1]=0,0,((SUMIFS(Tabelle1!C[-1],Tabelle1!C[-3],"">=""&INT((ROW()/6+2/3)*100)/100"  _
_
& ",Tabelle1!C[-3],""=""&INT((ROW()/6+2/3)*100)/100" _
& ",Tabelle1!C[-2],""

Gruß
Rudi

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige