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

Performantes Makro das Summewenn Formel ersetzt

Performantes Makro das Summewenn Formel ersetzt
01.11.2013 17:40:25
nontacky
Hallo Allerseits,
da ich immer mehr Performance Probleme habe, möchte ich gerne ein paar sehr "hungrige" Funktionen in Makros auslagern, die ich dann per Knopfdruck berechnen lassen kann.
Aktuell möchte ich, dass ein Makro mir folgende Funktion in Spalte N von N3 bis N10000 runterkopiert, dann die Resultate errechnet und dann die Resultate in Werte umwandelt und damit die Performance hungrigen Funktionen wieder verschwinden lässt:
=SUMMEWENN(G:G;G3;J:J)-SUMMEWENN(G:G;G3;L:L)+SUMMEWENN(G:G;G3;M:M)
Das habe ich mit dem Makro Rekorder soweit auch hinbekommen, aber es ist elendig langsam. Ich nehme an, dass es da eine viel schnellere Lösung gibt, bei der die Formel wirklich im Makro drinsteht und damit "echte" Makroberechnung stattfindet, anstatt wie bei mir einfach einen manuelle Kopieraktion zu automatisieren.
Weiß da jemand eine Lösung?
Vielen Dank und viele Grüße,
Martin

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Performantes Makro das Summewenn Formel ersetzt
01.11.2013 18:00:44
Mike
Hilfreicher wäre, wenn Du schonmal vorab das Makro hier einstellst. Dieses Deinen Bedürfnissen anzupassen ist einfacher, als eins aus dem Hut zu zaubern. ^^
Gruß

SUMMEWENN-Ersatz in VBA
02.11.2013 01:03:25
Erich
Hi Martin,
probier mal, ob das flott genug ist:

Option Explicit
Sub mySummeWenn()
Dim lngZ As Long, arQ, oDic As Object, zz As Long, arErg() As Double
lngZ = Cells(Rows.Count, 7).End(xlUp).Row    ' Länge der Spalte G
arQ = Cells(1, 7).Resize(lngZ, 7)            ' Spalten G:M
Set oDic = CreateObject("Scripting.Dictionary")
For zz = 1 To lngZ
If oDic.Exists(arQ(zz, 1)) Then
oDic(arQ(zz, 1)) = oDic(arQ(zz, 1)) _
+ arQ(zz, 4) - arQ(zz, 6) + arQ(zz, 7)
Else
oDic.Add arQ(zz, 1), arQ(zz, 4) - arQ(zz, 6) + arQ(zz, 7)
End If
Next zz
ReDim arErg(3 To lngZ, 0)                    ' Ergebnismatrix
For zz = 3 To lngZ
arErg(zz, 0) = oDic(arQ(zz, 1))
Next zz
Cells(3, 14).Resize(lngZ - 2) = arErg        ' Ausgabe ab N3
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: SUMMEWENN-Ersatz in VBA
04.11.2013 10:28:22
nontacky
Hallo Erich,
vielen Dank - ich habe gerade mal versucht das einzubauen. Leider bekomme ich einen Fehler - der Debugger sagt mir, dass folgende Zeile im Code falsch ist:
oDic.Add arQ(zz, 1), arQ(zz, 4) - arQ(zz, 6) + arQ(zz, 7)
Ich habe leider wirklich quasi gar keinen Durchblick bei Deinem Makro (sieht beeindruckend aus :)), deswegen habe ich keine Ahnung woran es liegen könnte.
Zwei Dinge allerdings:
ich habe mich bei einer Sache vertan: die Liste geht erst ab Zeile 9 und nicht Zeile 3 los (also die Ergebnisse sollen ab N9 angezeigt werden und die Summewenn Formel fängt er in Zeile 9 an:
In Spalte N Zeile 9 steht also =SUMMEWENN(G:G;G9;J:J)-SUMMEWENN(G:G;G9;L:L)+SUMMEWENN(G:G;G9;M:M)
In Spalte N Zeile 10 entsprechend: =SUMMEWENN(G:G;G10;J:J)-SUMMEWENN(G:G;G9;L:L)+SUMMEWENN(G:G;G10;M:M)
usw - bis in Spalte G nichts mehr steht.
Mein Makro war so unglaublich primitiv, dass ich mich kaum traue es hier rein zu kopieren. Ich habe die Formeln einfach als "Vorlage" in Zeile 3 stehen und das Makro macht nichts anderes, als diese ab Zeile 9 bis Zeile 10.000 zu kopieren und die Ergebnisse dann einfach in Werte umzuwandeln:
Range("N3").Select
Selection.Copy
Range("N9").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.AutoFill Destination:=Range("N9:N10000")
Range("N9:N10000").Select
Range("N9").Select
Range("N9:N10000").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("N4").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = ""
Range("N5").Select

Anzeige
AW: SUMMEWENN-Ersatz in VBA
04.11.2013 11:18:23
nontacky
Ach so - ich habe das noch mal wieder auf "offene Frage" gesetzt.

Fehlermeldungen
04.11.2013 16:19:50
Erich
Hi Martin,
wenn VBA oder Excel Fehler melden und du hier die Fehler mitteilst, ist es recht sinnvoll,
möglichst viele Infos über den Fehler zu nennen.
Du hast - erfreulicherweise! - geschrieben, in welcher Zeile der Fehler auftritt.
Jetzt fehlte noch die Fehlernummer und der Fehlerhinweis, der dir angezeigt wird.
Ich vermute, du hast Laufzeitfehler 13 mit dem Text 'Typen unverträglich'. Aber das ist natürlich nur geraten.
Ist das der Fehler, der bei dir auftritt?
Nun kann ich weiter spekulieren: Wenn das der Fehler ist, kann es daran liegen, dass in den Zeilen
3 bis 8 in einer der beteiligten Zellen keine Zahl, sondern Text steht, der sich nicht addieren lässt.
Dann wäre der Fehler beseitigt allein dadurch, dass die Summation erst in Zeile 9 beginnt.
Probier mal

Option Explicit
Sub mySummeWenn_V2()
Dim lngZ As Long, arQ, oDic As Object, zz As Long, arErg() As Double
Const abZeile As Long = 3                 ' Datenbeginn-Zeile vorgeben
lngZ = Cells(Rows.Count, 7).End(xlUp).Row          ' Länge der Spalte G
If lngZ 
Zu deinem Code: Du solltest dir z. B. die beiden Seiten
http://www.online-excel.de/excel/singsel_vba.php?f=61
http://www.online-excel.de/excel/singsel_vba.php?f=78
mal genauer ansehen. Darin geht es um den Gebrauch von "Select" und ähnlichen Dingen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Fehlermeldungen
04.11.2013 17:52:29
nontacky
Hallo Erich,
super - jetzt klappt es. Es war in der Tat ein Laufzeitfehler 13 mit dem Text 'Typen unverträglich'. Ich habe Deinen neuen Code genommen, Const abZeile As Long = 3 umgeändert in Const abZeile As Long = 9 und schon ging es.
Ich habe mir auch eben noch die beiden Links angeschaut, da hast Du mal ins Schwarze getroffen: ich bin in der Tat quasi ein reiner Marko Recorder Nutzer. Die Erklärungen dort werde ich mir mal reinfahren .. hoffe, dass ich davon überhaupt was nachvollziehen kann :).
Der neue Code geht schon schnell, dauert so knapp 20 Sekunden.
Vielen Dank!
Anzeige

303 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige