Ich verwende eine SUMMEWENNS-Formel welche ich über ca. 85.000 Zeilen anwende - die Berechnung läuft ca. 20 min. - gibt es hier eventuell eine schnellere Alternative? Matrixformel?
Bitte um Eure Vorschläge - Danke!
Lg,
Chrisi
=SUMMEWENNS('PPM Import Database - pre-month'!G:G;'PPM Import Database - pre-month'!K:K;K5; 'PPM Import Database - pre-month'!D:D;D5;'PPM Import Database - pre-month'!N:N;N5; 'PPM Import Database - pre-month'!L:L;L5;'PPM Import Database - pre-month'!C:C;C5))
=INDEX('PPM Import Database - pre-month'!$A$5:$O$100000;VERGLEICH(C5&D5&K5&L5&N5; 'PPM Import Database - pre-month'!$C$5:$C$100000&'PPM Import Database - pre-month'!$D$5:$D$100000&'PPM Import Database - pre-month'!$K$5:$K$100000&'PPM Import Database - pre-month'!$L$5:$L$100000&'PPM Import Database - pre-month'!$N$5:$N$100000; 0);7)
Berechnung dauert aber ebenfalls lange...
Sub Fen2()
Anf = Timer
Dim Res()
Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction
PreM = Sheets("PPM Import Database - pre-month").Cells(1).CurrentRegion
ActM = Sheets("PPM Import Database").Cells(1).CurrentRegion
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(ActM)
iStr = Join(Array(ActM(i, 11), ActM(i, 4), ActM(i, 14), ActM(i, 12), ActM(i, 3)), "|")
y = .Item(iStr)
Next i
'summieren
For i = 2 To UBound(PreM)
iStr = Join(Array(ActM(i, 11), ActM(i, 4), ActM(i, 14), ActM(i, 12), ActM(i, 3)), "|")
If .exists(iStr) Then .Item(iStr) = .Item(iStr) + PreM(i, 7)
Next i
Sheets("PPM Import Database").Cells(2, "Q").Resize(.Count + 1) = Application.Transpose(. _
items)
End With
Debug.Print Timer - Anf
End Sub
mfg
For i = 2 To UBound(ActM)
auf
For i = 5 To UBound(ActM)
und
For i = 2 To UBound(PreM)
auf
For i = 5 To UBound(PreM)
geändert.
Sub vergleich()
Anf = Timer
Dim Res(), Rs()
Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction
PreM = Sheets("PPM Import Database - pre-month").Cells(4, 1).CurrentRegion
ActM = Sheets("PPM Import Database").Cells(4, 1).CurrentRegion
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(ActM)
iStr = Join(Array(ActM(i, 11), ActM(i, 4), ActM(i, 14), ActM(i, 12), ActM(i, 3)), "|")
y = .Item(iStr)
Next i
'summieren
For i = 2 To UBound(PreM)
iStr = Join(Array(ActM(i, 11), ActM(i, 4), ActM(i, 14), ActM(i, 12), ActM(i, 3)), "|")
If .exists(iStr) Then .Item(iStr) = .Item(iStr) + PreM(i, 7)
Next i
'Ausgabe
Res = .items
ReDim Rs(UBound(ActM) + 3, 0)
For i = 0 To .Count - 1
Rs(i, 0) = Res(i)
Next i
Sheets("PPM Import Database").Cells(5, "Q").Resize(.Count) = Rs
End With
Debug.Print Timer - Anf
End Sub
mfg
Sheets("PPM Import Database").Cells(5, "Q").Resize(.Count) = Rs
auf
Sheets("PPM Import Database").Cells(6, "Q").Resize(.Count) = Rs
ändere, dann passt nun die Position, jedoch fehlt in Zeile 5 der Wert.Sub Vergleichen()
Anf = Timer
Dim Res(), Rs()
Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction
PreM = Sheets("PPM Import Database - pre-month").Cells(4, 1).CurrentRegion
ActM = Sheets("PPM Import Database").Cells(4, 1).CurrentRegion
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(ActM)
iStr = Join(Array(ActM(i, 11), ActM(i, 4), ActM(i, 14), ActM(i, 12), ActM(i, 3)), "|" _
)
y = .Item(iStr)
Next i
'summieren
For i = 2 To UBound(PreM)
iStr = Join(Array(PreM(i, 11), PreM(i, 4), PreM(i, 14), PreM(i, 12), PreM(i, 3)), "|" _
)
If .exists(iStr) Then .Item(iStr) = .Item(iStr) + PreM(i, 7)
Next i
'Ausgabe
Res = .items
ReDim Rs(UBound(ActM) + 3, 0)
For i = 0 To .Count - 1
Rs(i, 0) = Res(i)
Next i
Sheets("PPM Import Database").Cells(5, "Q").Resize(.Count) = Rs
End With
Debug.Print Timer - Anf
End Sub
Problem: In der Schleife des 'Summieren-Blocks wurde das falsche (gleiche) Array angesprochen....Um die Berechnungsgeschwindigkeit der SUMMEWENNS-Formel zu erhöhen, kannst Du die folgenden Schritte befolgen:
Formel anpassen: Reduziere den verwendeten Bereich in Deiner Formel. Anstatt G:G, verwende z.B. G$1:G$85000. Dies hilft Excel, nur die relevanten Zeilen zu berücksichtigen.
=SUMMEWENNS('PPM Import Database - pre-month'!G$1:G$85000; ...)
Pivot-Tabellen nutzen: Überlege, ob Du die Daten mithilfe von Pivot-Tabellen analysieren kannst. Dies kann die Berechnung erheblich beschleunigen, da die Daten nur einmal geladen werden müssen.
Hilfsspalten verwenden: Füge eine Hilfsspalte ein, die alle Kriterien in einem Text zusammenfasst. Verwende dazu die Funktion VERKETTEN. So kannst Du die Suche optimieren.
Daten sortieren: Stelle sicher, dass die Daten in der Tabelle nach den gleichen Kriterien sortiert sind. Das verbessert die Performance der Vergleiche in Excel.
Lange Berechnungszeiten: Wenn die SUMMEWENNS-Formel viele Zeilen durchsucht, kann dies zu langen Wartezeiten führen. Reduziere die Bereiche oder nutze die oben genannten Alternativen.
Falsche Ergebnisse: Wenn die Sortierung der Daten nicht übereinstimmt, erhältst Du möglicherweise falsche Werte. Achte darauf, dass beide Tabellen gleich sortiert sind.
Typen unverträglich: Wenn Du beim Anpassen von VBA-Code auf diesen Fehler stößt, überprüfe, ob die Datenformate übereinstimmen und dass Du die richtigen Startzeilen verwendest.
VBA-Programmierung: Wenn Du mit VBA vertraut bist, kann ein Skript die Daten schneller verarbeiten, indem es die Daten in Arrays lädt und Berechnungen darin durchführt. Hier ist ein Beispiel:
Sub SchnelleBerechnung()
Dim Daten() As Variant
Dim Ergebnis As Double
' Lade die Daten in ein Array
Daten = Range("A2:B10000").Value
' Führe Berechnungen durch
' ...
End Sub
Power Query: In neueren Excel-Versionen kannst Du Power Query verwenden, um Daten zu transformieren und zu laden, was die Berechnungszeit erheblich verkürzen kann.
Hier ist ein praktisches Beispiel, um die SUMMEWENNS-Formel zu optimieren:
Originalformel:
=SUMMEWENNS('PPM Import Database - pre-month'!G:G;'PPM Import Database - pre-month'!K:K;K5; ...)
Optimierte Version:
=SUMMEWENNS('PPM Import Database - pre-month'!G$1:G$85000;'PPM Import Database - pre-month'!K$1:K$85000;K5; ...)
Durch die Reduzierung des Berechnungsbereichs kannst Du die Performance erheblich steigern.
Nutze Array-Formeln: Diese können bei großen Datenmengen schneller sein, wenn sie korrekt angewendet werden.
Datenstruktur: Halte Deine Daten gut strukturiert. Verwende klare und eindeutige Bezeichnungen für Deine Spalten, um die Fehleranfälligkeit zu reduzieren.
VBA-Dictionary: Verwende ein Dictionary in VBA, um die Suche und die Berechnung noch weiter zu beschleunigen.
1. Warum ist die SUMMEWENNS-Berechnung langsam?
Die Berechnung kann langsam sein, wenn Du große Datenmengen oder ganze Spalten ohne spezifische Bereiche verwendest.
2. Gibt es eine Formel-Alternative zur SUMMEWENNS?
Eine Kombination aus VERGLEICH und INDEX kann ebenfalls verwendet werden, um die Berechnungsgeschwindigkeit zu verbessern, indem Du gezielt nur die benötigten Daten summierst.
3. Wie kann ich die Berechnungszeit weiter reduzieren?
Sortiere die Daten und verwende Hilfsspalten. Das kann die Effizienz der Abfragen erheblich verbessern.
4. Ist Power Query für alle Excel-Versionen verfügbar?
Power Query ist nur in neueren Versionen von Excel (ab 2010) verfügbar. In Excel 2007 ist es nicht integriert.