ein paar Anmerkungen
06.12.2017 15:39:20
Werner
Hallo Burghard,
dein Code mit ein paar Änderungen:
Option Explicit
Sub Zusammenführen()
Dim wsQuelle As Worksheet, wsZiel As Worksheet
Dim anzQuelle As Long, anzZiel As Long
Application.ScreenUpdating = False
Set wsZiel = Worksheets("Auswertung")
anzZiel = wsZiel.Cells(wsZiel.Rows.Count, 1).End(xlUp).Row
wsZiel.Range("a2:b" & anzZiel).ClearContents
wsZiel.Range("a2:b" & anzZiel).Interior.ColorIndex = xlNone
For Each wsQuelle In ThisWorkbook.Worksheets
If wsQuelle.Name "Auswertung" Then
anzZiel = wsZiel.Cells(wsZiel.Rows.Count, 1).End(xlUp).Row
anzQuelle = wsQuelle.Cells(wsQuelle.Rows.Count, 7).End(xlUp).Row
wsQuelle.Range("G2:H" & anzQuelle).Copy Destination:=wsZiel.Range("a" & anzZiel + 1)
End If
Next wsQuelle
wsZiel.Range("A1") = "Ausgaben"
wsZiel.Range("B1") = "Wofür"
anzZiel = wsZiel.Cells(wsZiel.Rows.Count, 1).End(xlUp).Row
wsZiel.Cells(anzZiel + 2, 1).Formula = "=SumIf(A2:A" & anzZiel & ","">0"")/12"
wsZiel.Range("A" & anzZiel).Copy
wsZiel.Range("A" & anzZiel + 2).PasteSpecial Paste:=xlPasteFormats
Application.CutCopyMode = False
Set wsZiel = Nothing
Application.ScreenUpdating = True
End Sub
1. Niemals Code ohne dass die Variablen deklariert sind
2. Benutze oberhalb des Makros Option explicit, das zwingt dazu die Variablen zu deklarieren
3. Benutze "sprechende" Namen für deine Variablen, so ist der Code besser zu lesen. Mit ws1, ws2, ws3 hast du mehr Probleme dich im Code zurecht zu finden als wenn du wsQuelle, wsZiel wsZiel2 verwendest (das ist zumindest meine Meinung).
4. Du beginnst bei der Ermittlung der letzten Zeile bei Zeile 65356. Die neueren Excel-Versionen haben aber deutlich mehr Zeilen. Wenn du mit deinem Code auf eine neuere Version umsteigst, dann beginnst du mit der Suche nach der letzten belegten Zeile quasi mitten in der Tabelle. Mit wsZiel.Cells(wsZiel.Rows.Count, 1).End(xlUp).Row beginnst du immer ganz am Ende der Tabelle, egal welche Excel-Version du benutzt. Ganz richtig ist das eigentlich auch nicht, nämlich dann, wenn deine Spalte bis zur letzten Zeile befüllt ist, was aber wohl eher nie vorkommen wird.
5. Hier For i = 1 To 12 gehst du von Blatt 1 bis Blatt 12 in einer Schleife über die Blätter. Das funtioniert so lange, so lange deine Quellblätter an Stelle 1 bis Stelle 12 in der Auflistung stehen. Verschieb mal in deiner Datei Testweise das Auswertungsblatt von der letzten Stelle an die erste Stelle und lass den Code laufen. Dann fehlen dir die Daten von Blatt 12, weil das jetzt an Stelle 13 steht.
Mit einer For Each - Schleife kannst du über alle Blätter der Datei gehen, an welcher Stelle die Blätter dann stehen ist egal. Hierbei musst du dann nur darauf achten, dass u.U. weitere Blätter ausgenommen werden müssen. Fügst du beispielsweise ein weiteres Blatt "Jahresliste" in die Datei ein, dann muss das hier If Sheets(i).Name "Auswertung" Then auch mit ausgenommen werden, wenn es nicht in die Auswertung einfließen soll. If Sheets(i).Name "Auswertung" And Sheets(i).Name "Jahresliste" Then
6. Nicht Sheets benutzen sondern Worksheets
7. Hier
Range("A" & letztezeile).Copy
Range("A" & letztezeile + 2).PasteSpecial Paste:=xlPasteFormats
fehlt die Referenzierung auf das entsprechende Blatt. Das hat zur Folge, dass die Daten aus den Zellen des gerade aktiven Blattes benutzt werden. Wenn du die Schaltfläche zum Start deines Makros z.B. vom derzeitigen Blatt auf ein anderes legst, dann wird dieses Blatt benutzt.
8. Variablen die mit Set zugewiesen werden, sollten am Ende des Codes sicherheitshalber wieder geleert werden.
Gruß Werner