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

Summieren für mehrere Spalten

Summieren für mehrere Spalten
12.01.2016 12:52:41
Florian
Hallo zusammen,
ich benötige eine kleine Erweiterung meines Quellcodes.
Ich möchte für mehrere Spalten mit der selben Spaltenlänge die Summen per VBA erstellen. Den Code für die erste habe ich mir bereits hergeleitet. Nur habe ich immer etwas Probleme mit Schleifen. Ich benötige also eine Schleife um meinen Code für die weiteren Spalten ausführen zu können.
Sub BereichSummieren()
Dim Bereich As Range
Dim lngLastRow As Long
Dim i As Integer
lngLastRow = Application.Max(3, Cells(Rows.Count, 2).End(xlUp).Row)
Range(Cells(lngLastRow, 1), Cells(lngLastRow, 2)).Delete Shift:=xlUp
Set Bereich = Tabelle1.Range(Cells(3, 2), Cells(lngLastRow, 2))
Tabelle1.Range("B" & lngLastRow).Value = Application.WorksheetFunction.Sum(Bereich)
Tabelle1.Range("A" & lngLastRow).Value = "Bedarfszeit durch Projekte"
End Sub

kann mir jemand helfen?
Gruß Florian

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Summieren für mehrere Spalten
12.01.2016 13:07:58
Florian
habe mein Code noch etwas erweitert.
Sub BereichSummieren()
Dim Bereich As Range
Dim lngLastRow, lngLastCol As Long
Dim i As Double
'ermittlung der letzten Reihe in der Spalte 2 --> B
lngLastRow = Application.Max(3, Cells(Rows.Count, 1).End(xlUp).Row)
lngLastCol = Application.Max(2, Cells(2, Columns.Count).End(xlToLeft).Column)
'löschen der beschriebenen Zelle in der die Summe steht.
Range(Cells(lngLastRow, 1), Cells(lngLastRow, 2)).Delete Shift:=xlUp
'Festlegung des Bereiches der Zeilen die Summiert werden sollen.
Set Bereich = Tabelle1.Range(Cells(2, 2), Cells(lngLastRow, lngLastCol))
'Wo soll die Beschriftung eingetragen werden, soll mit rutschen.
Tabelle1.Range("A" & lngLastRow).Value = "Bedarfszeit durch Projekte"
For i = 2 To lngLastCol
'Wo soll die Summe eingetragen werden
Tabelle1.Range(i & lngLastRow).Value = Application.WorksheetFunction.Sum(Bereich)
Next
End Sub

nun tritt die Fehlermeldung auf: Die Methode range ist für das Object Worksheet fehlgeschlagen.
heißt das ich muss das mit Cells versuchen?

Anzeige
AW: Summieren für mehrere Spalten
12.01.2016 13:41:04
Florian
hallo zusammen,
Bitte helft mir.
folgendes Beispiel:
https://www.herber.de/bbs/user/102739.xlsx
mit diesem Code umgesetzt.
Sub BereichSummieren()
Dim Bereich As Range
Dim lngLastRow, lngLastCol As Long
Dim i, k, l As Double
'Ermittlung der letzten Reihe in der Spalte 2 --> B  Bzw. der letzten Zeile
lngLastRow = Application.Max(3, Cells(Rows.Count, 1).End(xlUp).Row)
lngLastCol = Application.Max(2, Cells(2, Columns.Count).End(xlToLeft).Column)
'löschen der beschriebenen Zelle in der die Summe steht.
Range(Cells(lngLastRow, 1), Cells(lngLastRow, lngLastCol)).Delete Shift:=xlUp
'Beginn Summenbildung
'Schleife
For i = 2 To lngLastCol
For l = 2 To lngLastRow
'Festlegung des Bereiches der Zeilen die Summiert werden sollen.
Set Bereich = Tabelle1.Range(Cells(2, 2), Cells(lngLastRow, i))
Next
Next
'Wo soll die Beschriftung eingetragen werden, soll mit rutschen.
Tabelle1.Range("A" & lngLastRow).Value = "Bedarfszeit durch Projekte"
'Wo soll die Summe eingetragen werden
Tabelle1.Range("B" & lngLastRow).Value = Application.WorksheetFunction.Sum(Bereich)
End Sub
Problem: es bildet sich keine summe pro Spalte.
Gruß Florian

Anzeige
AW: Summieren für mehrere Spalten
12.01.2016 16:48:33
Daniel
Hi
man kann sich auch in VBA viel Arbeit sparen, wenn man Excelformeln verwendet:
probier mal:
With Tabelle1.Cells(1, 1).CurrentRegion
With .Rows(.Rows.Count)
.FormulaR1C1 = "=Sum(R2C:R[-1]C)"
.Formula = .Value
.Cells(1, 1).Value = "Bedarfszeit durch Projekte"
End with
End with
Die Hauptfehler in deinem Code sind:
1. Die Ermittlung des Zellbereichs für die Summe (Set Bereich = ...) muss innerhalb der Schleife über die Spalten stehen, weil dieser Bereich ja bei jeder Schleife neu ermittelt werden muss
als Spaltennummer musst du dann den Schleifenzähler i in beiden Cells verwenden
2. wenn du die Zielzelle zum einfügen der Summe über RANGE ermittelst, musst du die Spalte als Buchstabe angeben. Du hast aber keinen spaltenbuchstaben, sondern die Spaltennummer i, also musst du diese Zelle mit Cells ermitteln.
3. Zellbereiche ohne Sheet-Angabe davor beziehen sich immer auf das aktive Sheet. Möchtest du eine Range über zwei Cells Definieren, dann musst du das Blatt vor diesen beiden Cells innerhalb der Range angeben.
also in etwa so für den letzen Teil des Codes:
For i = 2 To lngLastCol
'Wo soll die Summe eingetragen werden
Set Bereich = Range(Tabelle1.Cells(2, lngLastcol), Tabelle1.Cells(lngLastRow - 1, lngLastCol))
Tabelle1.Cells(lngLastRow, i).Value = Application.WorksheetFunction.Sum(Bereich)
Next
End Sub
aber mein erster Code ist deutlich einfacher (keine Variablen, keine Schleifen) und in der Regel auch deutlich schneller (wobei dass nur bei sehr grossen Datenmengen spürbar wird)
Gruss Daniel

Anzeige
AW: Summieren für mehrere Spalten
12.01.2016 19:20:16
Florian
@Daniel vielen lieben Dank.
lässtn sie die CurrentRegion auch einschränken und auf einen bestimmten Teil einer Zeile anwenden?
Gruß Florian.

AW: Summieren für mehrere Spalten
12.01.2016 22:10:56
Daniel
HI
die CurrentRegion erweitert den Zellbereich von der Startzelle ausgehend recheckig, bis dieser vollständigen Leerzeilen/Leerspalten oder Blattrand umschlossen ist.
das ist normalerweise der einfachste Weg, eine Tabelle variabler grösse vollständig zu referenzienzieren ohne die Grösse direkt angeben zu müssen.
sollte das Blatt noch mehr Daten enthalten, müssen diese durch Leerzeilen und -spalten abgegrenzt werden.
du kannst aber den so ermittelten Zellbereich mit .RESIZE(zeilen, spalten) in der grösse anpassen und mit .OFFSET(zeilen, spalten) bei Bedarf verschieben.
wenn du also von der Tabelle nur die Spalten 2, 3 und 4 summieren willst, dann:
With Cells(1, 1).CurrentRegion.Resize(, 3).Offset(0, 1)
wenn du die Überschriftenzeile ausschliesen willst dann.
With Cells(1, 1).Resize(.Rows.count - 1).Offset(1, 0)
lässt du bei Offset und Resize einen der beiden Werte nicht an, dann wird der bereich hier nicht verändert.
Gruss Daniel

Anzeige
AW: Summieren für mehrere Spalten
13.01.2016 06:54:14
Florian
Hi Daniel,
Vielen Dank für die Ergänzung!
möchte ich den Bereich um 7 Zeilen von oben nahc unten Verschieben, muss das Offset Attribut
Offset(7,) definiert werden richtig?
oder benötige ich die Aussage bei Resize dazu?
Bei deinem Beispiel hast du Resize und Offset verschoben richtig?
Gruß Florian

AW: Summieren für mehrere Spalten
13.01.2016 10:13:10
Florian
@Daniel,
hab es :) ging über die Formel.
Vielen Dank nochmal!
Gruß Florian

AW: Summieren für mehrere Spalten
13.01.2016 10:40:13
Florian
Noch eine kleine Erweiterung.
habe nun versucht mit deinem Ansatz eine Subtraktion durchzuführen.
und zwar Zeile 45 von Zeile 6 abziehen im Bereich von Spalte 4 bis 55.
Sub  ()
With oSH.Cells(LastRow + 2, 4).Range(.Cells(LastRow + 2, 4), .Cells(LastRow + 2, LastCol))
With .Columns(.Columns.Count)
.FormulaR1C1 = "=R[-39]C-R[-1]C"
.Formula = .Value
Selection.AutoFill Destination:=Range(.Cells(LastRow + 2, 4), .Cells(LastRow + 2, LastCol)),  _
Type:=xlFillDefault
End With
End With
End Sub
dabei umfasst das oSH alle tabellenblätter der Gesamten Arbeitsmappe.
LastRow und LastCol sollten genug sagen.
Das Funktioniert auch soweit. D.h. beim Debuggen wird die richtige Zeile angezeigt.
Nur Wird die Formel nicht in die Zellen eingetragen.

Anzeige
AW: Summieren für mehrere Spalten
13.01.2016 10:45:52
Florian
Hab es!.

AW: Summieren für mehrere Spalten
13.01.2016 11:14:31
Daniel
Schön.
das Autofill ist hier aber unnötig (vor allem in Verbindung mit dem Selection)
vor allem liegt eine Selection immer auf dem aktiven Blatt.
wenn du dann wie hier die Selektion wie hier mit einem bestimmen Tabellenblatt(oSH), welches nicht zwingend das aktive Blatt ist, verbindest, dann ist das grober Unfug.
Gruss Daniel

AW: Summieren für mehrere Spalten
13.01.2016 11:21:20
Florian
hab es nach dem Vorbild von dir gelöst.
Sub ()
With oSH.Cells(1, 1).CurrentRegion.Resize(LastRow, LastCol - 3).Offset(1, 3) 'Bereich  _
angeben
With .Rows(.Rows.Count)
.FormulaR1C1 = "=Sum(R7C:R[-1]C)"
.Formula = .Value
End With
End With
'Formel der vorletzte Zeile
With oSH.Cells(1, 1).CurrentRegion.Resize(LastRow, LastCol - 3).Offset(2, 3) 'Bereich angeben
With .Rows(.Rows.Count)
.FormulaR1C1 = "=R[-39]C-R[-1]C"
.Formula = .Value
End With
End With
'Formel der letzten Zeile
With oSH.Cells(1, 1).CurrentRegion.Resize(LastRow, LastCol - 3).Offset(3, 3) 'Bereich angeben
With .Rows(.Rows.Count)
.FormulaR1C1 = "=IF(R[-1]C>=0,"""",ROUNDUP(IF(R[-1]C

Anzeige
AW: Summieren für mehrere Spalten
13.01.2016 11:36:51
Florian
habe doch noch etwas gefunden xD
Sub ()
'Formel der vorletzte Zeile
With oSH.Cells(1, 1).CurrentRegion.Resize(LastRow, LastCol - 3).Offset(2, 3) 'Bereich angeben
With .Rows(.Rows.Count)
.FormulaR1C1 = "=R[-39]C-R[-1]C"
'Von der Zelle LastRow+2 werden die Zellen "bezogen"
'[R-39] Muss geänder/variabel gemacht werden
End Sub
Ist es möglich die [-39] variabel zu gestalten?
Beziehungsweise die Stelle mit "wandern" zu lassen, wenn im Dokument Zeilen angefügt werden.
Gruß Florian

AW: Summieren für mehrere Spalten
13.01.2016 13:16:14
Daniel
Hi
du kannst in R1C1 auch die Zeilen- und Spaltennummern, auf welche sich die Zelle beziehen soll als Absolutwert hinschreiben, dazu nach dem R die Zeilennummer ohne Klammern hinschreiben.
dann ist der zellbezug auf die angegebene Zelle unabhängig von der Zelle in welcher die Formel steht.
wenn du das Formelschreiben mit dem Recorder aufzeichnest, dann lasse nur die Bezüge, die zwingend relativ sein müssen relativ und setze alle anderen Bezüge absolut.
Gruß Daniel

Anzeige
AW: Summieren für mehrere Spalten
13.01.2016 13:55:07
Florian
alles Klar Vielen Dank :)
Gruß Florian

310 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige