Excel: mit Werten in einer andern Tabelle rechen und dort speichern

Dieser Thread ist Teil einer Diskussion zu einem Artikel:  Zum News-Artikel gehen

Fritz50

Stammgast
Hallo
Weil es sich um ein anderes Problem/Aufgabe handelt als im letzten Thread, aber doch im gleichen Zusammenhang, wähle ich ein neue Thema.
Ich habe auch viel gegoogelt, aber keine Lösung für meine Frage gefunden. Die Augangslage ist also folgende

Da ist eine Tabelle Buchungen mit vielen Einträgen. Zu jedem Eintrag gehören auch zwei Kontonummern. Ich möchte nun neue Tabellen für jedes Konto errichten.
Das mache ich mit der Ereignisprozedur "Worksheet_BeforeDoubleClick()". Viele Fragen in diesem Zusammenhang haben wir diskutiert und Andreas hat mir viele Tipps verraten. Für jedes neue Tabellenblatt braucht es einen neuen DoubleClick auf die entsprechende Kontonnummer. Der Blattname wird in dieser Prozedur gebildet und in einer Variable strKontoName gespeichert.

Das habe ich auch alles sauber hingekriegt. Das neue Tabellenblatt entsteht und enthält die richtigen Buchungen.

Was ich jetzt noch möchte/brauche ist die Summe in beiden Spalten der neuen Tabelle. Aber eben der Code steht in der Clickprozedur der Haupttabelle.
Ich bringe die Summe nicht zusammen. Ich denke es ist auch nicht schlau während des Aufbaus der Tabelle die Summen fortlaufen nachzuführen und dann zuletzt in die Tabelle einzutragen.

Ich habe folgend Konstrukte versucht. Entweder ohne Erfolg, mit Fehlermeldung, oder komplett falschen Resultaten

Code:
' 
               Sheets(strKontoName).Range("F" & nrZeile) = Application.Sum(Range(Cells(2, "F"), Cells(nrZeile - 2, "F")))
oder
                Sheets(strKontoName).Range("F" & nrZeile) = Sheets(strKontoName).Sum(Range(Cells(2, "F"), Cells(nrZeile - 2, "F")))
oder
                With Worksheets(strKontoName)
a)                    Sheets(strKontoName).Range("E" & nrZeile) = Application.Sum(Range(Cells(2, "E"), Cells(nrZeile - 2, "E")))
b)                   .Range("E" & nrZeile) = Application.Sum(Range(Cells(2, "E"), Cells(nrZeile - 2, "E")))
                End With
 oder           
                Sheets(strKontoName).Cells(nrZeile, "E") = Application.Sum(Range(Cells(2, "E"), Cells(nrZeile - 2, "E")))

Ich hoffe doch es gibt eine Lösung.

Freundliche Grüsse
Fritz

P.S. könnte eine public Prozedur, die mit dem Parameter(strKontoName) aufgerufen wird, die Lösung sein.
 

nochEinAndreas

Stammgast
Hallo Fritz,

auch hier meine Bitte, mal eine Beispielmappe hochzuladen. Dann kann man sich ein besseres Bild machen, um was es genau geht.

Eine Idee wäre, dass du die Summenberechnung per VBA in eine Zelle einträgst:
Sheets(strKontoName).Range("C25").FormulaLocal = "=SUMME(C1:C24)"
oder so ähnlich.

Grüße, Andreas
 

nochEinAndreas

Stammgast
Hallo Fritz,

noch ein paar Tips zu Referenzen auf andere Blätter:
Je nachdem, in welchem Codebereich eine Prozedur steht, ist das Verhalten unterschiedlich:
1. Die Prozedur steht im Codebereich eines Tabellenblattes:
  • Range("A1") bezieht sich immer auf die Zelle A1 auf diesem Tabellenblatt.
  • Soll es sich auf ein anderes Blatt beziehen, braucht es den Zusatz, auf welches Blatt es sich beziehen soll: Sheets("Tabelle2").Range("A1")
2. Die Prozedur steht in einem Standard-Modul (erzeugt im VBA-Editor über Einfügen - Modul):
  • Range("A1") bezieht sich immer auf die Zelle A1 des momentan aktiven Tabellenblattes (das Blatt, was zu sehen ist).
  • Willst du dich auf ein anderes Tabellenblatt beziehen, musst dieses erst in den Vordergrund holen: Sheets("Tabelle2").Activate
  • Oder du musst wieder mit dem Zusatz des Blattnamens arbeiten: Sheets("Tabelle2").Range("A1")
Das ist tückisch, und wenn man hier nicht aufpasst, wundert man sich über falsche Ergebnisse.
Und dann ist da noch der Fallstrick mit dem
With:
Prinzipiell ist das With eine schöne Sache, um sich viel Tipparbeit zu sparen. Ich benutze es auch oft. Aber!: Man muss genau darauf achten auf was man referenziert: Ich nehme mal dein Beispiel b) aus deinem letzten Post.
Code:
With Worksheets(strKontoName)
    .Range("E" & nrZeile) = Application.Sum(Range(Cells(2, "E"), Cells(nrZeile - 2, "E")))
End With
Ab der With-Zeile beziehen sich die Range- und Cells-Angaben auf das Blatt strKontoName, aber NUR(!) wenn ein Punkt davor steht.
Das
.Range("E" & nrZeile) ist also richtig.Der Rest der Zeile bezieht sich nicht auf dieses Blatt, sondern je nachdem, wo die Prozedur steht (siehe weiter oben) auf das akvtive Blatt oder das Blatt, in dessen Codebereich die Prozedur steht.
Wenn sich alles auf strKontoName beziehen soll, muss überall ein Punkt davor:
Code:
With Worksheets(strKontoName)
    .Range("E" & nrZeile) = Application.Sum(.Range(.Cells(2, "E"), .Cells(nrZeile - 2, "E")))
End With

Ich hoffe, dass dich das etwas weiter bringt.

Grüße, Andreas
 

Fritz50

Stammgast
Hallo Andreas
Eine Prozedur zum Summieren funktioniert auch. Ich werde deine Beispiel noch üben.
Dann stelle ich auch mal meine beiden Excel-Dateien hier ins Forum.

Freundliche Grüsse
Fritz
 

Anhänge

  • Buchhaltung_Excel(0).zip
    34,2 KB · Aufrufe: 4
  • ÜbungZugriffe(0).zip
    52,8 KB · Aufrufe: 4

nochEinAndreas

Stammgast
Guten Abend Fritz,

ich habe mir mal deine Buchhaltung-Mappe angeschaut. Im VBA-Editor habe ich einige Anmerkungen und Kommentare gemacht. Die habe ich mit mehreren Apostrophs begonnen, damit sie sich von deinen eigenen Kommentaren unterscheiden. Einige deiner Codezeilen habe ich auskommentiert und durch etwas veränderte ersetzt.
Prinzipiell läuft der Makro. ich glaube aber, dass du bei dem Verschieben der Daten innerhalb des Datenfeldes vBuchung noch ein paar Bugs drin hast. Ich überlasse es dir, das zu ändern.
Ich hoffe, du bist über meine Änderungen nicht verärgert. Ich will dich nicht kritisieren, sondern dir ein paar Tipps geben.

Melde dich, wenn du noch weitere Fragen hast.

Grüße, Andreas

PS: Die ÜbungZugriffe habe ich mir noch nicht angeschaut.
 

Anhänge

  • Buchhaltung_Excel(1).zip
    36,9 KB · Aufrufe: 4

nochEinAndreas

Stammgast
Nachtrag:
Ich habe eben mal durch die ÜbungZugriffe geschaut. Das einzige, was mir "unangenehm" aufgefallen ist, sind die unnötigen Select-Anweisungen. Das kann man immer vereinfachen, z.B.:
Statt
Code:
Range("H5").Select
With Selection.Interior
ist es einfacher zu schreiben:
Code:
With Range("H5").Interior
In diesem einfachen Fall fällt es vermutlich nicht auf, aber wenn man viele Select-Anweisungen benutzt, die eventuell noch über mehrere Blätter gehen, sieht es für den Anwender recht unruhig aus.
Deswegen: Select ist in 99.9% der Fälle unnötig!

Grüße und schönen Abend, Andreas
 

Fritz50

Stammgast
Hallo Andreas

Es geht ja auch darum optimal und elegant zu programmieren. Darum bin ich nicht verärget über deine Vorschläge.
Einmal habe ich es ja auch mit der With-Anweisung versucht, bin aber nicht zum Ziel gekommen.
Mir ist vorher einmal aufgefallen, dass ein Konstrukt mit .(Punkt) begonnen hast. Da habe ich aber nicht realisiert um was es geht, sondern den Befehl sogar noch "umgebogen" um ohne Punkte auszukommen.
Dann wegen dem Teil, der für dich keinen Sinn ergibt (ein zweiter Range wird geprüft). Das war/ist auch nur ein Anhängsel, so für Testzweckee quasi.
Damit hat sich das Thema für mich erledigt. Danke für deine wertvollen Hinweise.

Freundliche Grüsse
Fritz
 
Oben