Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA J-bilanz aus mehreren Sheets

VBA J-bilanz aus mehreren Sheets
19.12.2014 14:53:41
Matze
Hallo @ All,
die Aufgabe ist eine Zusammenfassung der Summen der Spalte W aus allen Blättern
wenn in Spalte V das Datum das entsprechende Jahr in der Auswertung hat.
Ich bekomme das mit den Datum nicht hin, Dank vorab
https://www.herber.de/bbs/user/94515.xlsm
Gruß Matze

Anzeige

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA J-bilanz aus mehreren Sheets
19.12.2014 14:59:56
{Boris}
Hi Matze,
B6:
=SUMMEWENN(INDIREKT("'"&$A6&"'!V:V");">=1.1."&B$2;INDIREKT("'"&$A6&"'!W:W")) -SUMMEWENN(INDIREKT("'"&$A6&"'!V:V");">31.12."&B$2;INDIREKT("'"&$A6&"'!W:W"))
und sowohl nach rechts als auch nach unten kopieren.
VG, Boris

Anzeige
Und ehe jetzt die Formelverkürzer...
19.12.2014 15:08:59
{Boris}
Hi Matze,
...um die Ecke kommen ;-) - natürlich kann man das auch so formulieren:
B6:
=SUMME(SUMMEWENN(INDIREKT("'"&$A6&"'!V:V");{">=1.1.".">31.12."}&B$2;INDIREKT("'"&$A6&"'!W:W")) *{1.-1})
und ebenfalls runter und nach rechts kopieren.
VG, Boris

Anzeige
AW: Und ehe jetzt die Formelverkürzer...
19.12.2014 16:16:26
Matze
Hallo Boris,
danke für deine Formel Lösungen, funktionieren wie sie sollen.
kannst du mir bitte mal aufzeigen wie ich den Schluss der Formel verstehen muss? *{1.-1}
Bin aber weiterhin an einer VBA Lösung interessiert, jetzt nicht unbedingt so das ich deine Formel
in die jeweilige Spalte einfüge. Da gibt's es doch bestimmt auch schöne Ansätze.
Gruß Matze

Anzeige
AW: Und ehe jetzt die Formelverkürzer...
19.12.2014 16:42:55
hary
Moin Matze
Du kannst auch Evaluate nehmen.
Bsp.
Dim a As String
Dim datum As Long
a = "10044 Scholter"
datum = 2013
MsgBox Evaluate("=SUMPRODUCT((YEAR('" & a & "'!V2:V10)=" & datum & ")*'" & a & "'!W2:W10)")

oder halt entsprchend auch Summewenns im Englischen.
gruss hary

Anzeige
AW: Und ehe jetzt die Formelverkürzer...
19.12.2014 17:00:04
Matze
Hi hary,
werde deinen Ansatz mal testen, sind ja nachher über 100 Blätter
und es werden immer noch welche da zu kommen.
Danke
Gruß Matze

AW: Und ehe jetzt die Formelverkürzer...
19.12.2014 17:42:52
{Boris}
HiMatze,
die Formel ermittelt 2 Summen: Alles größer 1.1.2013 UND alles größer 31.12.2013. Aber alles größer 31.12.2013 ist ja das, was wieder in Abzug gebracht werden muss. Daher {1.-1}.
VG, Boris

Anzeige
AW: Und ehe jetzt die Formelverkürzer...
19.12.2014 18:00:10
Matze
Hi Boris,
bestens, jetzt passt das auch bildlich in meinen Kopf,...supie, Danke
Schönes WE Matze

AW: VBA J-bilanz aus mehreren Sheets
19.12.2014 21:02:47
Daniel
Hi
als Formel würde ich hier SummeWenns verwenden, das ist etwas schneller als Summenprodukt:
=SUMMEWENNS(INDIREKT("'"&$A6&"'!W:W");INDIREKT("'"&$A6&"'!V:V");">="&DATUM(B$2;1;1); INDIREKT("'"&$A6&"'!V:V");"
einen eleganten Makrocode gibts natürlich auch, hier für den Fall geschrieben, dass die Blattnamen und Jahreszahlen in Zeile 2 und Spalte A schon von dir von Hand befüllt sind und die Werte dann nur zugeordnet werden:
Sub Auswertung()
Dim sh As Worksheet
Dim dicBlatt As Object
Dim dicSumme As Object
Dim arr
Dim z As Long
Dim Jahr
Dim arrBlatt
Dim arrJahr
Dim arrErg
Set dicBlatt = CreateObject("Scripting.dictionary")
With ThisWorkbook.Sheets("Auswertung")
'--- Summen lesen
For Each sh In ThisWorkbook.Worksheets
If sh.Name  .Name Then
Set dicSumme = CreateObject("Scripting.dictionary")
arr = sh.UsedRange.Columns(22).Resize(, 2).Value
For z = 2 To UBound(arr, 1)
If arr(z, 1) > 0 Then dicSumme(Year(arr(z, 1))) = dicSumme(Year(arr(z, 1))) +  _
arr(z, 2)
Next
Set dicBlatt(sh.Name) = dicSumme
End If
Next
'--- Ergebnis schreiben
arrBlatt = Range(.Cells(6, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value
arrJahr = Range(.Cells(2, 2), .Cells(2, .Columns.Count).End(xlToLeft)).Value
ReDim arrErg(1 To UBound(arrBlatt, 1), 1 To UBound(arrJahr, 2))
For z = 1 To UBound(arrBlatt, 1)
If dicSumme.exists(arrBlatt(z, 1)) Then
Set dicSumme = dicBlatt(arrBlatt(z, 1))
For Jahr = 1 To UBound(arrJahr, 2)
arrErg(z, Jahr) = dicSumme(arrJahr(1, Jahr))
Next
End If
Next
.Cells(6, 2).Resize(UBound(arrErg, 1), UBound(arrErg, 2)) = arrErg
End With
End Sub
ist die Frage, ob das wirklich besser ist, als ein Code, der "nur" die Formel in die Zellen schreibt und dann ggf die Formel durch die Werte ersetzt:
Sub Auswertung2()
Dim Zelle1 As Range
Dim Zelle2 As Range
With Sheets("Auswertung")
Set Zelle1 = .Cells(.Rows.Count, 1).End(xlUp)
Set Zelle2 = .Cells(2, .Columns.Count).End(xlToLeft)
With .Range(.Cells(6, 2), Intersect(Zelle1.EntireRow, Zelle2.EntireColumn))
.FormulaR1C1 = "=SUMIFS(INDIRECT(""'""&RC1&""'!W:W""),INDIRECT(""'""&RC1&""'!V:V"")" & _
","">=""&DATE(R2C,1,1),INDIRECT(""'""&RC1&""'!V:V""),""
Gruß Daniel

Anzeige
Verlesen?
19.12.2014 21:26:51
{Boris}
Hi Daniel,
als Formel würde ich hier SummeWenns verwenden, das ist etwas schneller als Summenprodukt:
Hier gibt´s keine Formel mit SUMMENPRODUKT - nur mit SUMMEWENN. Und die ist garantiert flotter als SUMMEWENNS
VG, Boris

AW: Verlesen?
19.12.2014 21:53:27
Daniel
Hi
ok, ab ich überlesen
das Problem ist aber, dass ein SummeWenn vielleicht schneller ist als ein SummeWenns.
du brauchst hier aber zwei SummeWenn, um den Wert für ein Jahr zu ermitteln!
Gruß Daniel

Anzeige
AW: Verlesen?
19.12.2014 21:59:01
{Boris}
Hi Daniel,
also rein optisch gibt es hier nur 1 SUMMEWENN:
=SUMME(SUMMEWENN(INDIREKT("'"&$A6&"'!V:V");{">=1.1.".">31.12."}&B$2;INDIREKT("'"&$A6&"'!W:W")) *{1.-1})
Ob das nun schneller oder langsamer ist als SUMMEWENNS, habe ich nicht untersucht und werde es auch nicht tun.
VG, Boris

Anzeige
AW: Verlesen?
19.12.2014 22:12:04
Daniel
Hi
ja, das optische interessiert aber nicht.
durch die {...} erstellst du eine Schleife, die so oft durchlaufen wird wie in der Klammer Elemente stehen. (Matrix-Formel, ist im Prinip ne For-Next-Schleife innerhalb der Formel)
wenn du keine Laufzeittests machst, solltest du dich mit Aussagen über Laufzeiten etwas zurückhalten.
Reine Vermutungen diesbezüglich stellen sich gelegentlich dann doch als Falsch heraus.
Gruß Daniel

Anzeige
AW: Verlesen?
19.12.2014 22:18:45
{Boris}
Hi Daniel,
die so oft durchlaufen wird wie in der Klammer Elemente stehen.
Ja - genau 2 mal.
wenn du keine Laufzeittests machst, solltest du dich mit Aussagen über Laufzeiten etwas zurückhalten.
Aber Du wirst ihn sicher machen. Gib doch bitte mal Info über das Ergebnis.
VG, Boris

Anzeige
AW: Verlesen?
19.12.2014 22:37:29
Daniel
HI
2x SummeWenn ist etwas langsamer als 1x SummeWenns mit 2 Bedingungen
(c.a 20%)
Getestet mit zwei vollständig gefüllten Spalten und jeweils 100 Formeln (um messbare Zeiten zu erhalten)
absolute Zeiten bringen dir nichts, weil die sind ja auf jedem Rechenr anders.
worauf beruhte denn deine Annahme, dass SummeWenn garantiert flotter ist als SummeWenns?
Gruß Daniel

Anzeige
Als ob es auf so etwas ankäme, ...
20.12.2014 00:26:14
Luc:-?
…Folks… :-|
Auch, wenn MS nun auf vielfachen Kundenwunsch Xl ab Vs12 derart erweitert hat, dass es nun wohl noch mehr Leute dazu verleitet, Xl als DB zu missbrauchen, bleibe ich bei meiner Meinung, dass man Xl nicht für Massen-DV verwenden sollte. Dafür sind DBn da! Primärdaten sollten schon in verdichteter Form aus diesen abgerufen wdn, was kein Problem sein dürfte, wenn man SQL beherrscht. Mit derart vorverdichteten Daten sollten kompliziertere Fmln dann auch keine nennenswerten Performance-Probleme verursachen, zumal Xl deren Berechnung ohnehin optimiert, was in 1.Linie wohl bedeutet, dass Notations­Redundanzen eliminiert wdn.
Performance-Tests sind für Software-Pgmierer wichtig, nicht aber für VBA-Bastler, sofern sie keine unabsichtlichen Redundanzen oder andere Ungeschicklichkeiten in ihre Pgmm einbauen, die man aber mit ausgiebigen Tests erkennen könnte.
Eine MatrixKonstante mit gerademal 2 Elementen nun noch zu hinterfragen ist schlichtweg albern! Um welche Dateigrößen geht's denn da, mehrere 10- oder gar 100Tsd fml-wirksame DSe…? ;->
Solche Detail-Überlegungen waren in den Anfangszeiten der EDV sinnvoll, aber heute…!?
Außerdem weiß keiner, der sie nicht selbst pgmiert hat, wie performant die jeweilige XlFkt nun wirklich ist oder ob sie dahingehend Schwächen hat. Möglicherweise wdn Nachteile in einem Anwendungs­Zusammenhang durch Vorteile in einem anderen aufgewogen. Das ist immer auch eine Ermessensfrage und kompromiss­lastig. Wichtig ist hier, dass Xl seine Möglichkeiten optimal nutzen kann und das gewünschte Ergebnis innerhalb des xl-üblichen Zeitrahmens zustande kommt. Alles Andere ist „Milli­Sekunden­Klauberei“, was noch lange keinen guten Pgmierer bzw FmlMeister ausmacht!
Gruß + schö4AdWE, Luc :-?

Anzeige
AW: VBA J-bilanz aus mehreren Sheets
21.12.2014 14:41:37
Matze
Hallo Daniel,
besten Dank für die Codezeilen, den unteren Auswertung2 hab ich verstanden und er macht das was er soll. Der ober Code ist für mich etwas zu komplex, habe es mit F8 durchgetestet, leider ist da irgendwo der Wurm drin.
arrBlatt = Range(.Cells(6, 1), .Cells(.Rows.Count, 1).End(xlUp)).Value
arrJahr = Range(.Cells(2, 2), .Cells(2, .Columns.Count).End(xlToLeft)).Value
erhalten keine Werte, es wird nix ins Blatt geschrieben; anbei meine Musterdatei.
https://www.herber.de/bbs/user/94535.xlsm
schau doch bitte nochmal drüber, eventuell eine Beischreibung in den Code mit beigeben,
damit ich kapiere was da passiert, dankend ,
Matze

Anzeige
AW: VBA J-bilanz aus mehreren Sheets
21.12.2014 14:51:46
Daniel
Hi
ändere mal in der letzen For-Schleife das:
If dicSumme.exists(arrBlatt(z, 1)) Then
in
If dicBlatt.exists(arrBlatt(z, 1)) Then
Gruß Daniel

Smile....Besten Dank Gruß Matze , owT
21.12.2014 15:17:04
Matze
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige