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

"inteligent" Summe bilden

"inteligent" Summe bilden
18.06.2009 13:07:03
Peter
Guten Tag
Ich muss viele Summenformeln einsetzen, das möchte ich gerne automatisieren in folgenden Schritten:
1. Ausgehend von der aktiven Zelle möchte ich die Zelle oberhalb in der gleichen Spalte ermitteln, in der eine SUMMEN-Formel steht.
2. In der aktiven Zeile möchte ich mit VBA eine Summenformel eintragen. Summiert werden soll ab der ersten Zelle nach der Summenformel oberhalb und bis eine Zelle vor der aktiven Zelle.
Beispiel
in Zelle D10 steht eine Summenformel
aktiv ist D20
nun möchte ich einen Makro starten, der mir in Zelle D20 die Formel
=SUMME(D11:D19) einträgt.
Kann mir jemand helfen?
Danke, Peter

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: "inteligent" Summe bilden
18.06.2009 13:19:41
D.Saster
Hallo,
das macht doch die AutoSumme von alleine.

Sub ttt()
Dim i As Long
i = Selection.Row - 1
Do Until Cells(i, Selection.Column).Formula Like "=SUM*"
i = i - 1
Loop
Selection.FormulaR1C1 = "=sum(r[-1]c:r" & i + 1 & "c)"
End Sub


Gruß
Dierk

@Dierk : like "=SUM(*"
18.06.2009 13:24:34
NoNet
Hallo Dierk,
kleine Korrektur : =SUMMENPRODUKT() oder =SUMMEWENN() oder =SUMMEX2PY2() entsprechen auch dem Muster like "=SUM" ;-) (auch in der engl. VBA-Fassung !)
Verwende daher besser : like "=SUM(*"
Gruß, NoNet
Recht hast du! owT
18.06.2009 13:30:10
D.Saster
AW: "inteligent" Summe bilden
18.06.2009 13:29:19
Peter
Hallo Dierk
Vielen Dank
So hat es auch funktionert.
Gruss, Peter
PS.: Autosumme macht in der Regel das, aber es gibt eben Konstellationen, wo das nicht funktioniert.
Anzeige
Intelligenter Einzeiler...mit Voraussetzungen
18.06.2009 13:19:55
NoNet
Hallo Peter,
das kann man mit einem VBA-"Einzeiler" lösen :
VBA-Code:
Sub IntelligenteSummenFunktion()
    ActiveCell.FormulaR1C1 = "=SUM(R" & _
        ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
                searchdirection:=xlPrevious).Row + 1 & "C:R" & ActiveCell.Offset(-1).Row & "C)"
End Sub
Gruß, NoNet
PS : Voraussetzung : Es steht auch irgendwo oberhalb der aktuellen Zelle eine =SUMME()-Funktion und zar nicht direkt in der Zeile über der aktuellen Zelle !
AW: Intelligenter Einzeiler...mit Voraussetzungen
Peter

Hallo NoNet
Vielen Dank auch das klappt!
Kleine Nachfrage: Kann ich den Code anpassen, so dass ich keine absolute Bezüge ($) mehr habe?
Gruss, Peter
Intelligente Summe - relative Zellbezüge
NoNet

Hallo Peter,
klaro geht das :
VBA-Code:
Sub IntelligenteSummenFunktion()
    ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell.Row - 1 - _
        ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
                searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub
Gruß, NoNet
AW: Intelligente Summe - relative Zellbezüge
Peter

Hallo NoNet
Ich bin beeindruckt - es funktioniert! allerdings bin ich daran gescheitert, zu verstehen, wie du das angestellt hast.
Könntest du mir diesen "Einzeiler" erläutern? Das wäre super.
Gruss, Peter
Erklärungsversuch des Einzeilers
NoNet

Hey Peter,
ich versuche es mal zu erklären : Dieser "Einzeiler" vereint 2 Excel-Funktionalitäten in einer :
- Zelle mit SUMME()-Funktion in der gleichen Spalte oberhalb der aktiven Zelle suchen
- In der Zelle oberhalb der aktiven Zelle eine weitere SUMME()-Funktion eintragen

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell _
font> .Row - 1 - _
ActiveCell.EntireColumn.Find(what:="=SUM(",  _
LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Mit ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, searchdirection:=xlPrevious).Row
wird zunächst einmal (ausgehend von der aktuellen Zelle) in der gleichen Spalte rückwärts (daher Searchdirection:=xlPrevious) die Funktion =SUMME(...) (engl.: =SUM(...)) gesucht.
Da es sich bei =SUMME( nur um einen Teil der in der Zelle stehenden Funktion handelt, ist hier das Argument lookat:=xlPart angegeben. Aus der gefundenen Zelle wird die Zeilennummer (.Row z.B. Zeile 10) ermittelt.
Wenn die aktuelle Zelle D20 ist, muss also die Funktion =SUMME(D11:D19) eingetragen werden.
In VBA werden Funktionen mit .Formula (oder .FormulaR1C1) in die Zelle geschrieben (der Funktionsname muss dann in englischer Syntax erfolgen, daher =SUM( und nicht =SUMME( !).
Wie in Excel gibt es aber auch in VBA die Möglichkeit, mit relativen und absoluten Zellebezügen zu arbeiten. Die Zellbezüge werden durch .FormulaR1C1 in der Z1S1-Schreibweise (siehe auch "Extras - Optionen - Allgemein : Z1S1-Bezugsart") angegeben, das erleichtert die Erstellung der relativen Zelladressierung.
Mehr zur R1C1-Darstellung siehe hier :
http://spotlight-wissen.de/lisp/pages/messages/amse-1136883848-12627 ).
Die Zeilennr. 11 inder Funktion =SUMME(D11:D19) ergibt sich aus der Zeilennr. der gefundenen SUMME()-Funktion (Zeile 10, s.o.)+1.
Um von der aktuellen Zelle (D20) aus die Zeile 11 zu referenzieren, muss man also 9 Zeilen "nach oben", das errechnet sich aus der aktuellen Zeile - gefundene Zeile (10) - 1.
Die Summe soll bis zur Zelle direkt oberhalb der aktuellen Zelle gebildet werden, also aktuelle Zeile -1, daher R[-1].
Per VBA wird also diese Funktion in die Zelle geschrieben : =SUM(R[-9]C:R[-1]C)
Das ist die Z1S1-Schreibweise für die Funktion mit den relativen Zellebezügen =SUMME(Z(-9)S:Z(-1)S) - ergibt (wenn in D20 eingetragen) die "lesbare" Funktion =SUMME(D11:D19) !
Ich hoffe, das war einigermassen verständlich ;-) kann aber auch gut sein, dass Du dir das nochmal durch Pansen, Netzmagen, Blättermagen, Labmagen und den Kopf gehen lassen musst, um das zu verstehen ;-)
Gruß, NoNet

AW: Erklärungsversuch des Einzeilers
Peter

Hallo NoNet
Vielen Dank für die ausführliche und verständliche Erklärung.
Nur wenn jemand sonst den Link zur R1C1-Darstellung noch ansehen möchte:
Im obigen Link fehlt "www." - kompletter Link:
http://www.spotlight-wissen.de/lisp/pages/messages/amse-1136883848-12627
Gruss, Peter
AW: Intelligente Summe - relative Zellbezüge
Peter

Hallo NoNet
Ich muss nochmals eine Frage zu deinem Code stellen.
Ich habe bemerkt, dass dieser nur nur funktioniert, wenn in der gleichen Spalte nicht schon weiter unten eine SUMMENFORMEL steht:
Wenn ich in Zelle D130 stehe und die vorige Summenformel in D120 steht funktioniert das, wenn nicht nach D130 auch schon eine Summenformel steht.
Steht beispielsweise bereits in Spalte D140 eine Summenformel, würde als Formel D129:D141 eingesetzt, was nicht funktioniert.
Kann man die Suchfunktion abändern, damit nicht von zunterst der Spalte (also die ganze Spalte), sondern von der aktiven Zelle nach oben gesucht wird?
Gruss, Peter
Intelligente Summe : nur Summen OBERHALB
NoNet

Hallo Peter,
habe Deine Frag erst jetzt gelesen. Klaro geht das :

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell.Row - 1 - _
Range(Cells(1, ActiveCell.Column), ActiveCell.Offset(-1)).Find( _
what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Gruß, NoNet

AW: Intelligente Summe : nur Summen OBERHALB
Peter

Hallo NoNet
Vielen Dank. Ich habe wieder dazu gelernt.
Gruss, Peter
Anzeige
AW: Intelligenter Einzeiler...mit Voraussetzungen
18.06.2009 13:30:24
Peter
Hallo NoNet
Vielen Dank auch das klappt!
Kleine Nachfrage: Kann ich den Code anpassen, so dass ich keine absolute Bezüge ($) mehr habe?
Gruss, Peter
Intelligente Summe - relative Zellbezüge
18.06.2009 13:43:26
NoNet
Hallo Peter,
klaro geht das :
VBA-Code:
Sub IntelligenteSummenFunktion()
    ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell.Row - 1 - _
        ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
                searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub
Gruß, NoNet
AW: Intelligente Summe - relative Zellbezüge
Peter

Hallo NoNet
Ich bin beeindruckt - es funktioniert! allerdings bin ich daran gescheitert, zu verstehen, wie du das angestellt hast.
Könntest du mir diesen "Einzeiler" erläutern? Das wäre super.
Gruss, Peter
Erklärungsversuch des Einzeilers
NoNet

Hey Peter,
ich versuche es mal zu erklären : Dieser "Einzeiler" vereint 2 Excel-Funktionalitäten in einer :
- Zelle mit SUMME()-Funktion in der gleichen Spalte oberhalb der aktiven Zelle suchen
- In der Zelle oberhalb der aktiven Zelle eine weitere SUMME()-Funktion eintragen

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell _
font> .Row - 1 - _
ActiveCell.EntireColumn.Find(what:="=SUM(",  _
LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Mit ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, searchdirection:=xlPrevious).Row
wird zunächst einmal (ausgehend von der aktuellen Zelle) in der gleichen Spalte rückwärts (daher Searchdirection:=xlPrevious) die Funktion =SUMME(...) (engl.: =SUM(...)) gesucht.
Da es sich bei =SUMME( nur um einen Teil der in der Zelle stehenden Funktion handelt, ist hier das Argument lookat:=xlPart angegeben. Aus der gefundenen Zelle wird die Zeilennummer (.Row z.B. Zeile 10) ermittelt.
Wenn die aktuelle Zelle D20 ist, muss also die Funktion =SUMME(D11:D19) eingetragen werden.
In VBA werden Funktionen mit .Formula (oder .FormulaR1C1) in die Zelle geschrieben (der Funktionsname muss dann in englischer Syntax erfolgen, daher =SUM( und nicht =SUMME( !).
Wie in Excel gibt es aber auch in VBA die Möglichkeit, mit relativen und absoluten Zellebezügen zu arbeiten. Die Zellbezüge werden durch .FormulaR1C1 in der Z1S1-Schreibweise (siehe auch "Extras - Optionen - Allgemein : Z1S1-Bezugsart") angegeben, das erleichtert die Erstellung der relativen Zelladressierung.
Mehr zur R1C1-Darstellung siehe hier :
http://spotlight-wissen.de/lisp/pages/messages/amse-1136883848-12627 ).
Die Zeilennr. 11 inder Funktion =SUMME(D11:D19) ergibt sich aus der Zeilennr. der gefundenen SUMME()-Funktion (Zeile 10, s.o.)+1.
Um von der aktuellen Zelle (D20) aus die Zeile 11 zu referenzieren, muss man also 9 Zeilen "nach oben", das errechnet sich aus der aktuellen Zeile - gefundene Zeile (10) - 1.
Die Summe soll bis zur Zelle direkt oberhalb der aktuellen Zelle gebildet werden, also aktuelle Zeile -1, daher R[-1].
Per VBA wird also diese Funktion in die Zelle geschrieben : =SUM(R[-9]C:R[-1]C)
Das ist die Z1S1-Schreibweise für die Funktion mit den relativen Zellebezügen =SUMME(Z(-9)S:Z(-1)S) - ergibt (wenn in D20 eingetragen) die "lesbare" Funktion =SUMME(D11:D19) !
Ich hoffe, das war einigermassen verständlich ;-) kann aber auch gut sein, dass Du dir das nochmal durch Pansen, Netzmagen, Blättermagen, Labmagen und den Kopf gehen lassen musst, um das zu verstehen ;-)
Gruß, NoNet

AW: Erklärungsversuch des Einzeilers
Peter

Hallo NoNet
Vielen Dank für die ausführliche und verständliche Erklärung.
Nur wenn jemand sonst den Link zur R1C1-Darstellung noch ansehen möchte:
Im obigen Link fehlt "www." - kompletter Link:
http://www.spotlight-wissen.de/lisp/pages/messages/amse-1136883848-12627
Gruss, Peter
AW: Intelligente Summe - relative Zellbezüge
Peter

Hallo NoNet
Ich muss nochmals eine Frage zu deinem Code stellen.
Ich habe bemerkt, dass dieser nur nur funktioniert, wenn in der gleichen Spalte nicht schon weiter unten eine SUMMENFORMEL steht:
Wenn ich in Zelle D130 stehe und die vorige Summenformel in D120 steht funktioniert das, wenn nicht nach D130 auch schon eine Summenformel steht.
Steht beispielsweise bereits in Spalte D140 eine Summenformel, würde als Formel D129:D141 eingesetzt, was nicht funktioniert.
Kann man die Suchfunktion abändern, damit nicht von zunterst der Spalte (also die ganze Spalte), sondern von der aktiven Zelle nach oben gesucht wird?
Gruss, Peter
Intelligente Summe : nur Summen OBERHALB
NoNet

Hallo Peter,
habe Deine Frag erst jetzt gelesen. Klaro geht das :

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell.Row - 1 - _
Range(Cells(1, ActiveCell.Column), ActiveCell.Offset(-1)).Find( _
what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Gruß, NoNet

AW: Intelligente Summe : nur Summen OBERHALB
Peter

Hallo NoNet
Vielen Dank. Ich habe wieder dazu gelernt.
Gruss, Peter
Anzeige
AW: Intelligente Summe - relative Zellbezüge
18.06.2009 14:02:33
Peter
Hallo NoNet
Ich bin beeindruckt - es funktioniert! allerdings bin ich daran gescheitert, zu verstehen, wie du das angestellt hast.
Könntest du mir diesen "Einzeiler" erläutern? Das wäre super.
Gruss, Peter
Erklärungsversuch des Einzeilers
18.06.2009 17:10:14
NoNet
Hey Peter,
ich versuche es mal zu erklären : Dieser "Einzeiler" vereint 2 Excel-Funktionalitäten in einer :
- Zelle mit SUMME()-Funktion in der gleichen Spalte oberhalb der aktiven Zelle suchen
- In der Zelle oberhalb der aktiven Zelle eine weitere SUMME()-Funktion eintragen

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell _
font> .Row - 1 - _
ActiveCell.EntireColumn.Find(what:="=SUM(",  _
LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Mit ActiveCell.EntireColumn.Find(what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, searchdirection:=xlPrevious).Row
wird zunächst einmal (ausgehend von der aktuellen Zelle) in der gleichen Spalte rückwärts (daher Searchdirection:=xlPrevious) die Funktion =SUMME(...) (engl.: =SUM(...)) gesucht.
Da es sich bei =SUMME( nur um einen Teil der in der Zelle stehenden Funktion handelt, ist hier das Argument lookat:=xlPart angegeben. Aus der gefundenen Zelle wird die Zeilennummer (.Row z.B. Zeile 10) ermittelt.
Wenn die aktuelle Zelle D20 ist, muss also die Funktion =SUMME(D11:D19) eingetragen werden.
In VBA werden Funktionen mit .Formula (oder .FormulaR1C1) in die Zelle geschrieben (der Funktionsname muss dann in englischer Syntax erfolgen, daher =SUM( und nicht =SUMME( !).
Wie in Excel gibt es aber auch in VBA die Möglichkeit, mit relativen und absoluten Zellebezügen zu arbeiten. Die Zellbezüge werden durch .FormulaR1C1 in der Z1S1-Schreibweise (siehe auch "Extras - Optionen - Allgemein : Z1S1-Bezugsart") angegeben, das erleichtert die Erstellung der relativen Zelladressierung.
Mehr zur R1C1-Darstellung siehe hier :
http://spotlight-wissen.de/lisp/pages/messages/amse-1136883848-12627 ).
Die Zeilennr. 11 inder Funktion =SUMME(D11:D19) ergibt sich aus der Zeilennr. der gefundenen SUMME()-Funktion (Zeile 10, s.o.)+1.
Um von der aktuellen Zelle (D20) aus die Zeile 11 zu referenzieren, muss man also 9 Zeilen "nach oben", das errechnet sich aus der aktuellen Zeile - gefundene Zeile (10) - 1.
Die Summe soll bis zur Zelle direkt oberhalb der aktuellen Zelle gebildet werden, also aktuelle Zeile -1, daher R[-1].
Per VBA wird also diese Funktion in die Zelle geschrieben : =SUM(R[-9]C:R[-1]C)
Das ist die Z1S1-Schreibweise für die Funktion mit den relativen Zellebezügen =SUMME(Z(-9)S:Z(-1)S) - ergibt (wenn in D20 eingetragen) die "lesbare" Funktion =SUMME(D11:D19) !
Ich hoffe, das war einigermassen verständlich ;-) kann aber auch gut sein, dass Du dir das nochmal durch Pansen, Netzmagen, Blättermagen, Labmagen und den Kopf gehen lassen musst, um das zu verstehen ;-)
Gruß, NoNet

Anzeige
AW: Intelligente Summe - relative Zellbezüge
18.06.2009 22:18:37
Peter
Hallo NoNet
Ich muss nochmals eine Frage zu deinem Code stellen.
Ich habe bemerkt, dass dieser nur nur funktioniert, wenn in der gleichen Spalte nicht schon weiter unten eine SUMMENFORMEL steht:
Wenn ich in Zelle D130 stehe und die vorige Summenformel in D120 steht funktioniert das, wenn nicht nach D130 auch schon eine Summenformel steht.
Steht beispielsweise bereits in Spalte D140 eine Summenformel, würde als Formel D129:D141 eingesetzt, was nicht funktioniert.
Kann man die Suchfunktion abändern, damit nicht von zunterst der Spalte (also die ganze Spalte), sondern von der aktiven Zelle nach oben gesucht wird?
Gruss, Peter
Anzeige
Intelligente Summe : nur Summen OBERHALB
19.06.2009 09:24:47
NoNet
Hallo Peter,
habe Deine Frag erst jetzt gelesen. Klaro geht das :

Sub IntelligenteSummenFunktion()
ActiveCell.FormulaR1C1 = "=SUM(R[-" & ActiveCell.Row - 1 - _
Range(Cells(1, ActiveCell.Column), ActiveCell.Offset(-1)).Find( _
what:="=SUM(", LookIn:=xlFormulas, lookat:=xlPart, _
searchdirection:=xlPrevious).Row & "]C:R[-1]C)"
End Sub


Gruß, NoNet

AW: Intelligente Summe : nur Summen OBERHALB
19.06.2009 09:38:41
Peter
Hallo NoNet
Vielen Dank. Ich habe wieder dazu gelernt.
Gruss, Peter

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige