PDA

Vollständige Version anzeigen : Summenfunktion mit Variable in vba (macht mich wahnsinnig)


HohesHaus
21.08.2017, 15:48
Ich hätte nie gedacht, dass so eine Grundfunktion mich derart in den Wahnsinn treiben kann.

Ich will Spalte D summieren, auf mehreren Tabellenblättern (nicht alle Tabellenblätter auf einem zusammenaddieren, sondern für jedes Tabellenblatt seperat). Der Anfang der Spalte ist immer gleich D3 das Ende ist jedoch ungewiss.
Code sieht folgendermaßen aus:


Sub addieren ()
zähler = Sheets.Count
For x = 3 To zähler ' Schleife fängt bei 3 an weil Tabellenblatt 1+2 nicht bearbeitet werden soll
Sheets(x).Select
Cells.Find(What:="Summen", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate 'Es soll nach der Summenspalte gesucht werden
ActiveCell.Offset(0, 3).Select 'Er bewegt sich in das richtige Feld in der die Formel soll
ActiveCell.Offset(-1, 0).Select 'Eins hoch um das Ende der Additionskette anzuzeigen
Grenze = ActiveCell.Address 'holen der festen Position z.B. D6
ActiveCell.Offset(1, 0).Select 'wieder zurück in das Feld wo die Formel rein soll
ActiveCell.FormulaLocal = Application.Worksheet.Sum("D3:" & Grenze)
Next x
End sub


Ich möchte dass am Ende dort eine Formel steht, so dass wenn ich eine Zahl in Spalte D änder, auch sich sofort die Summe ändert.
Ich möchte NICHT das reine Ergebnis in die Zelle schreiben, sondern nur die Formel da hinterlegen.

Bei meinem Code kommt Fehler 483. Ich hab schon 4 verschiedene Varianten versucht, aber ich bekomme es einfach nicht hin mit der Variable zu arbeiten.

R J
21.08.2017, 16:03
Hi,

probier es mal damit:

Sub addieren()
Dim zähler%, letzteZeile&
zähler = ThisWorkbook.Worksheets.Count
For X = 3 To zähler ' Schleife fängt bei 3 an weil Tabellenblatt 1+2 nicht bearbeitet werden soll
With ThisWorkbook.Worksheets(X)
letzteZeile = .Cells.SpecialCells(xlCellTypeLastCell).Row
.Cells(letzteZeile + 1, 4) = Application.Worksheet.Sum(.Name & "!D3:D" & letzteZeile)
End With
Next X
End Sub

HohesHaus
22.08.2017, 07:38
Leider gibt er mir hier auch den Fehler 483 (Objekt unterstützt diese Eigenschaft oder Methode nicht)

Hasso
22.08.2017, 07:52
Es muss doch wohl heißen: .Cells(letzteZeile + 1, 4) = Application.WorksheetFunction.Sum(.Name & "!D3:D" & letzteZeile)

R J
22.08.2017, 08:50
Es muss doch wohl heißen:....

...so sieht es aus, Hasso. Das hat man von Copy and Paste....;)

HohesHaus
22.08.2017, 10:08
Den Fehler hatte ich schon per Hand korriegiert, es funktioniert leider nicht.
Mehr konnte ich da auch nicht von Hand korrigieren da ich folgende Code Zeilen nicht verstehe

With ThisWorkbook.Worksheets(X) 'Kenne ich nur in Verbindung mit Format, wenn mehrer Zellen betroffen sind
letzteZeile = .Cells.SpecialCells(xlCellTypeLastCell).Row 'Definition der letzten Zelle?
.Cells(letzteZeile + 1, 4) = Application.WorksheetFunction.Sum(.Name & "!D3:D" & letzteZeile) '.Cells kenn ich nicht, das in Klammern heißt wohl "Letzte Zeile, eins runter, 4 nach rechts, da soll dann die Formel rein?" und warum .Name ?

Auch verstehe ich die DIMs nicht

Dim zähler%, letzteZeile&

Warum % und & ? Was besagen die? Ich kenne nur Dim as ...

Hasso
22.08.2017, 15:10
Warum % und & ? Was besagen die? I
% bedeutet Integer
& bedeutet Long
Das gehört zu den VBA-Grundlagen...

R J
22.08.2017, 15:19
Die Aussage es funktioniert leider nicht. ist ungefähr so hilfreich wie die Antwort "es ist Nacht" auf die Frage "wie ist das Wetter".

Lade mal die Datei hoch...

Hasso
22.08.2017, 16:47
Hallo HohesHaus,

ich habe mal eine Beispieldatei erstellt.
In jedem Blatt (ab Blatt 3) hast du folgenden Code:Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 4 Then
addieren (Me.Name)
End If
End Sub
Dieser ruft bei Änderung einer Zahl in Spalte D des betreffenden Blatts folgendes Makro auf:Option Explicit

Sub addieren(strBlatt As String)

Dim lngLetzteZeile As Long

On Error GoTo Fehler
'Ereignisse ausschalten:
Application.EnableEvents = False
With Worksheets(strBlatt)
'letzte Zeile in Spalte D ermitteln:
lngLetzteZeile = .Cells(Rows.Count, 4).End(xlUp).Row
'Steht dort keine Formel, diese eine Zeile darunter einfügen:
If Cells(lngLetzteZeile, 4).HasFormula = False Then
Cells(lngLetzteZeile + 1, 4).FormulaLocal = "=SUMME(D1:D" & lngLetzteZeile & ")"
End If
End With
Fehler:
'Ereignisse wieder einschalten:
Application.EnableEvents = True
End Sub
Ich hoffe, du kannst damit etwas anfangen. Sonst müsstest du uns mal deine Mappe zeigen.