Excel 2007 VBA Summenbildung

randomc[]

Cadet 2nd Year
Registriert
Nov. 2008
Beiträge
21
Guten Tag,

ich habe ein Problem mit Excel und VBA. Also mein Problem ist folgendes, ich habe eine Exceltabelle mit Namen und ich will per VBA evt. per Schleife sollte das realisierbar sein, dass wenn zb. in der Zelle E3 bis E8 der gleiche Name steht, soll nix passieren, wenn dann aber in E9 ein anderer Name steht, dann soll Excel zwischen E8 und E9 eine neue Zeile einfügen und dann unter den Namen von E3 bis E8 die Summe bilden aus einer anderen Zelle, also muss geprüft werden, ob da ein gleicher Name steht, wenn ja gehe weiter, wenn nein, füge eine Zeile ein berechne die Summe und gehe dann weiter...
Ich weiß nicht, wie ich das mit VBA realisieren soll, need help:

Bsp:
Zelle Name Wert
E3 Hallo 10
E4 Hallo 10
E5 Hallo 10
E6 Test 20
E7 Test 20
E8 Hi 30

Also nun soll, zwischen Zelle E5 und E6 eine neue Zelle eingefügt werden und die Werte von E3 bis E5 summiert ausgegeben werden und dann soll er so weiter gehen...
Hoffe ist verständlich...

Mit freundlichem Gruß
 
Hoi,

ich sags gleich dazu: ich habe noch nie ein Makro selbst geschrieben - das ist quasi mein erstes vollkommen eigenes. Es gibt also bestimmt 1 Mio bessere Lösungen :D

Aber laufen tut's:
Code:
Sub Zeileeinfuegen()

Dim Z As Integer
Dim X As Integer
Z = 1
X = 1
  
  Do While Range("E" & Z) <> ""
    If Range("E" & Z) = Range("E" & Z + 1) Then
    Z = Z + 1
    Else
      Range("F" & Z + 1).Select
      Selection.EntireRow.Insert
      ActiveCell.Formula = "=SUM(F" & Z - X + 1 & ":F" & Z & ")"
      Z = Z + 2
      X = 0
    End If
    X = X + 1
  Loop

End Sub
Z ist die aktuelle Zeilennummer, X dient zum ermitteln, in welcher Zeile die Summe beginnt.
 
Zuletzt bearbeitet:
danke, aber was ist F und wo muss ich die Werte eintragen?? bin nicht so gut in VBA ^^
 
E und F sind Spalte E und F ;)

Du musst eigentlich nichts mehr ändern. Wenn deine Daten wie im ersten Post geschrieben in der Tabelle stehen (Name in E, Wert in F), dann musst du das Makro nur starten.


edit: okay, ich bin jetzt mal davon ausgegangen, dass deine Werte in F stehen. Geschrieben hattest du's nicht.
 
ich teste es mal, wenn ich noch probleme habe, melde ich mich nochmal ;) Danke schonmal!
 
hab noch eine frage, also einmal wie muss ich das in das makro schreiben, wenn ich will dass die gebildeten summen rot und fett werden ? und wie kann ich das dynamisch machen, also die tabelle soll zb nach lieferanten sortiert werden und wenn ich dann eine neue zelle einfüge, dass die automatisch mitgezählt wird?? weil über std formatierung, dann hab ich ja zb nur zelle E3 bis E8 aber das ist ja statisch und nicht dynamisch!
 
Farbe und Schriftauszeichnung änderst du so:
Code:
With Range("F" & Z + 1).Font
  .Bold = True
  .ColorIndex = 3
End With
Das ganze kommt zwischen Selection.EntireRow.Insert und ActiveCell.Formula = ...


Wie willst du sortieren? Meinst du, du hast diese Liste durcheinander, willst sie nach Namen sortieren und dann dann die summenberechnung starten?
 
ja liste ist durcheinander und will nach namen (a-z) sortieren, also zb

vorher:

z
a
v
d

danach:
a
d
v
z

und dann sollen von den gleichen die summen gebildet werden also summen von a und so weiter

und es soll dynamisch sein also wenn ich dann am ende der tabelle nochmal ein a einfüge und makro starte dann soll das mitgerechnet werden
 
Zuletzt bearbeitet:
Sortieren kannst du so:
Code:
Columns("E:F").Select
With ActiveWorkbook.Worksheets("Tabelle1").sort
  .Header = xlGuess
  .MatchCase = False
  .Orientation = xlTopToBottom
  .SortMethod = xlPinYin
  .Apply
End With
Der code kommt ganz oben direkt nach Sub Zeileeinfuegen(), du musst ggf. Tabelle1 an dein Tabellenblattnamen anpassen.


Ist denn die Zelle in Spalte E neben der Summe immer leer oder steht da irgendwas drin?



Ich würde zu Beginn immer erst die Zeilen mit den Summen löschen und dann das bisherige Makro durchlaufen lassen, inklusive dem Sortieren. Insgesamt sähe das so aus:
Code:
Sub Zeileeinfuegen()

Dim Y As Integer
Y = 1

Do While Range("F" & Y) <> ""
  
  If Range("E" & Y) = "" Then
    Range("E" & Y).Select
    Selection.EntireRow.Delete
  End If
  Y = Y + 1
  
Loop

    Columns("E:F").Select
    With ActiveWorkbook.Worksheets("Tabelle1").sort
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

Dim Z As Integer
Dim X As Integer
Z = 1
X = 1
  
  Do While Range("E" & Z) <> ""
    If Range("E" & Z) = Range("E" & Z + 1) Then
    Z = Z + 1
    Else
      Range("F" & Z + 1).Select
      Selection.EntireRow.Insert
            
      With Range("F" & Z + 1).Font
     .Bold = True
     .ColorIndex = 3
     End With
     
      ActiveCell.Formula = "=SUM(F" & Z - X + 1 & ":F" & Z & ")"
      Z = Z + 2
      X = 0
    End If
    X = X + 1
  Loop

End Sub
Du kannst also jetzt, nach du das Makro mal gestartet hattest, unten an der Liste neue Namen hinzufügen und das Makro wieder laufen lassen.
 
also wo die summen drinstehen ist der rest leer nur in dem feld wo die summe ausgegeben wird steht dann halt die summe
 
hm irgendwie klappt das nicht so ganz!
wäre nett, wenn du mir nochmal helfen könntest.
also in den zellen E stehen die Namen nach denen sortiert werden soll, in den Zellen L stehen die Werte aus denen die Summen gebildet werden sollen.Also soll dann wenn in E10 ein anderer Name als in E9 steht eine Leerzeile eingefügt werden und bei L die summengebildet werden. Summe dann rot und fett.
Die Zellen fangen erst bei Zelle E7 an und dann unendlich erweiterbar.
Hoffe nun kannst du es mir auf meine Tabelle passgenau erklären ;)
Wenn du mir noch was sagen könntest und zwar will ich, wenn in Zelle T eine Zahl steht, dann soll in Zelle U ein Wert aus Zelle L eingetragen werden.

Hoffe ist zu verstehen.

Mfg
 
Habe als Anhang die Datei Beispiel.rar angehängt.

Wenn du die Datei öffnest sind da verschiedene Variablen.
Überall wo "wert" steht sind für die Berechnung unwichtig!
In Zelle E sollen nach Namen sortiert werden. In L wo Summe steht, stehen Euro-Beträge, dort sollen halt die Summen gebildet werden, wenn in der nächsten zeile ein neuer Name steht..
Wenn in Zelle T bei zahl1 ein Wert steht, dann soll in U "zahl2" der Wert aus der Zelle L genommen werden, also den Betrag, aber nicht die errechnete Summe.
Wenn ein anderer Name steht, dann soll eine Zeile eingefügt werden und dann in der Zeile in L die Summe ausgegeben werden in rot und fett.

Hoffe verstehst es !

Mit freundlichem Gruß
 

Anhänge

Also eigtl. funktioniert das soweit, nur das Sortieren funktioniert nicht ganz, der sortiert zwar zum teil, aber das sieht ca so aus nach starten des makros

a
a

b
b

c

a

also name a steht oben und nochmal unten und das soll ja nicht so sein. a soll ja immer untereinander da ein name
 
Okay, da muss man an dem Makro nur Spalte F mit L ersetzen und insgesamt das Makro halt ab Zeile 7 beginnen lassen statt in Zeile 1:
Code:
Sub Zeileeinfuegen()

'
' Tabelle zurücksetzen, Zeilen mit Summen löschen
'
Dim Y As Integer
Y = 7

Do While Range("L" & Y) <> ""
  
  If Range("E" & Y) = "" Then
    Range("E" & Y).Select
    Selection.EntireRow.Delete
  End If
  Y = Y + 1
  
Loop

'
' Sortieren von A7 bis W10000 nach Spalte E
'
Range("A7:W10000").Sort Key1:=Range("E7"), Order1:=xlAscending, Header:=xlNo

'
' Einfügen einer neuen Zeile zwischen unterschiedlichen Werten in Spalte E
' Zelle fett/rot formatieren, Summenformel erzeugen
'
Dim Z As Integer
Dim X As Integer
Z = 7
X = 1
  
  Do While Range("E" & Z) <> ""
    If Range("E" & Z) = Range("E" & Z + 1) Then
    Z = Z + 1
    Else
      Range("L" & Z + 1).Select
      Selection.EntireRow.Insert
            
      With Range("L" & Z + 1).Font
     .Bold = True
     .ColorIndex = 3
     End With
     
      ActiveCell.Formula = "=SUM(L" & Z - X + 1 & ":L" & Z & ")"
      Z = Z + 2
      X = 0
    End If
    X = X + 1
  Loop

End Sub
Sortiert wird derzeit als von A7 bis W10000. Wenn deine List länger wird, musst du da halt W10000 entsprechend vergrößern.
Wenn in Zelle T bei zahl1 ein Wert steht, dann soll in U "zahl2" der Wert aus der Zelle L genommen werden, also den Betrag, aber nicht die errechnete Summe.
Das kannst du ja einfach mit einer Wenn-Funktion in Spalte U machen:
=WENN(T7<>"";L7;"")

Wobei - wäre direkt übers Makro wohl besser, oder? :D
 
Zuletzt bearbeitet: (Fehler im Code)
danke, ja habe das selber schon mit einer wenn funktion gemacht, also bei U7 =wenn(T7="";"";L7) aber in einem makro wäre es sinniger
 
Blubb :)
Code:
Sub Zeileeinfuegen()

Dim Y As Integer
Y = 7

Do While Range("L" & Y) <> ""
  
  If Range("E" & Y) = "" Then
    Range("E" & Y).Select
    Selection.EntireRow.Delete
  End If
  Y = Y + 1
  
Loop

Range("A7:W1000").Sort Key1:=Range("E7"), Order1:=xlAscending, Header:=xlNo

Dim Z As Integer
Dim X As Integer
Z = 7
X = 1
  
  Do While Range("E" & Z) <> ""
    If Range("T" & Z) <> "" Then
      Range("U" & Z) = "=L" & Z
    Else
      Range("U" & Z) = ""
    End If
  
    If Range("E" & Z) = Range("E" & Z + 1) Then
    Z = Z + 1
    Else
      Range("L" & Z + 1).Select
      Selection.EntireRow.Insert
            
      With Range("L" & Z + 1).Font
     .Bold = True
     .ColorIndex = 3
     End With
     
      ActiveCell.Formula = "=SUM(L" & Z - X + 1 & ":F" & Z & ")"
      Z = Z + 2
      X = 0
    End If
    X = X + 1
  Loop

End Sub
 
Zuletzt bearbeitet:
hast du dir das alles selbst beigebracht oder wie hast du dir das angeeignet ?!
 
Zurück
Oben