Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1304to1308
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

alle Zeilen aus allen Blättern zusammenfügen

alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 11:05:55
rieckmann
Hallo,
ich suche eine Lösung wie ich alle Datensätze ab Zeile 2 (also ohne Überschriften) aus allen Tabellenblättern in das Tabellenblatt "Gesamt" beim öffnen der Mappe zusammenfügen kann.
Hier die Beispielmappe:
https://www.herber.de/bbs/user/84764.xls
Würde mich über eine Lösung sehr freuen.
Gruß
Fred

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 11:30:08
hary
Moin Fred
Dim wks As Worksheet
Dim letzteZ As Long
With Worksheets("Gesamt")
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
Next
End With

gruss hary

AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 11:45:34
rieckmann
Moin Hary,
das funktioniert so weit ganz gut.
Ich hatte leider vergessen zu sagen das sich auch Leerzeilen zwischendurch befinden.
Kann man dein Code so anweisen diese zu übergehen ?
Im "Gesamt" Tabellenblatt sollte in der Auflistung also keine Leerzeile entstehen.
Vielen Dank für deine Mühe.
Gruß
Fred

Anzeige
AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 11:51:26
rieckmann
Sorry, habe noch was vergessen !
Beim jeden neuen öffnen der Mappe soll die Liste im Tabellenblatt "Gesamt" erst gelöscht,
und dann wieder neu eingetragen werden.
Sonst werden die Datensätze wenn man die Datei speichert und wieder neu öffnet, doppelt unten angefügt.
Gruß
Fred

AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 11:59:58
rieckmann
O.K.
das mit den vorherigen löschen habe ich mit
Range(Rows(2), Rows(Rows.count)).Delete
hinbekommen.
Sub Auto_Open()
Dim wks As Worksheet
Dim letzteZ As Long
With Worksheets("Gesamt")
Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
Next
End With
End Sub

Anzeige
AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 12:07:51
hary
Hallo
Wenn du mit with arbeitest, musst du Punkte davor setzen. Sonst ist es das gerade aktive Blatt.
With Worksheets("Gesamt")
.Range(.Rows(2), .Rows(.Rows.Count)).Delete
Muss jetzt aber weg.
gruss hary

AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 12:34:43
rieckmann
O.K.
den Punkt habe ich nachgetragen.
Bleibt noch das überspringen/mitkopieren der Leerzeilen, was nicht sein sollte.
Bis dann
Gruß
Fred

AW: alle Zeilen aus allen Blättern zusammenfügen
07.04.2013 12:51:32
Matze
HalloFred , Moinz hary,
da reicht eine Zeile,
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Option Explicit
Private Sub Worksheet_Activate()
Dim wks As Worksheet
Dim letzteZ As Long
With Worksheets("Gesamt")
.Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
Next
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End Sub
Matze

Anzeige
Code in das Tabellenblatt Gesamt
07.04.2013 12:58:15
Matze
Hallo Fred,
das Makro so wie es ist in die Tabelle Gesamt einbinden.
es aktiviert sich sobald in das Blatt gewechselt wird.
Matze

AW: Code in das Tabellenblatt Gesamt
07.04.2013 13:36:03
rieckmann
Hallo Matze,
das mit der Leerzeilen klappt super.
Danke dafür.
Nur gibt es noch eine "Anwendungs- oder objektdefinierter Fehler - 1004"
und zwar hier ".Range(Rows(2), Rows(Rows.Count)).Delete"
wenn beim öffnen der Mappe nicht das Tabellenblatt "Gesamt" geöffnet ist.
Ich habe dann noch "Sheets("Gesamt").Select" zugefügt.
Nun funktioniert es bisher wunderbar !
Sub Auto_Open()
Dim wks As Worksheet
Dim letzteZ As Long
Sheets("Gesamt").Select
With Worksheets("Gesamt")
.Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
Next
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End With
End Sub

Gruß und Dank
Fred

Anzeige
Anwendungs- oder objektdefinierter Fehler - 1004
07.04.2013 13:41:49
robert
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Hi,
ich bekomme in beiden Versionen hier die Fehlermeldung-wieso gehts bei Euch?
Gruß
robert

Geht, alles klar-mein Fehler-sorry :-) owT
07.04.2013 13:51:35
robert

Richtig referenzieren
07.04.2013 14:56:50
Erich
Hi Fred,
der Fehler entsteht dadurch, dass vor einigen Eigenschaften der Punkt fehlt. In
.Range(Rows(2), Rows(Rows.Count)).Delete
gehört .Range wegen der With-Klammer zu Worksheets("Gesamt").
Rows(2) ist die Zeile 2 des gerade aktiven Tabellenblatts. Das muss nicht Worksheets("Gesamt") sein.
Auch Rows(..) und Rows.Count beziehen sich - da nichts anderes angegeben ist, auf das gerade aktive Blatt.
Wenn du schreibst:
.Range(.Rows(2), .Rows(.Rows.Count)).Delete
dann findet alles im Blatt "Gesamt" statt, ein
Sheets("Gesamt").Select
ist nicht nötig.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Es kommt zu einen Fehler, wenn
07.04.2013 15:17:10
Matze
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
..diese oberer Zeilencode mit einem "Leeren" Tabellenblatt angewandt wird.
Bzw wenn nur die Überschriften stehen und ab Zeile 2 keine Datensätze vorhanden sind.
Matze

AW: Es kommt zu einen Fehler, wenn
07.04.2013 16:18:36
rieckmann
Hallo Matze,
also bei mir ist alles Fehlerfrei was ich bisher ausprobiert habe.
Auch wenn im Blatt "Gesamt" nur die Überschrift steht, werden die Daten super eingelesen.
Gruß
Fred

AW: Es kommt zu einen Fehler, wenn
07.04.2013 16:29:15
Matze
ich meine nicht das Blatt Gesamt sondern "ALLE" andere Blätter.
Sobald dort nur die Überschrift steht oder das Blatt ganz leer ist
wird dieser Fehler auftauchen.
Wenn das bei dir NICHT vorkommen sollte, kannst du es so belassen.
Matze

Anzeige
AW: Es kommt zu einen Fehler, wenn
07.04.2013 17:22:54
rieckmann
Hallo Matze,
ja es stimmt !
Habe es ausprobiert.
Sowie in einem Tabellenblatt keine Datensätze vorhanden sind kommt ein Fehler bei:
"wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)"
Hast du eine Idee wie man das umgehen kann ?
Gruß
Fred

Probier mal das....
07.04.2013 18:20:24
robert

Private Sub Worksheet_Activate()
Dim wks As Worksheet
Dim letzteZ As Long, x As Long
Application.ScreenUpdating = False
With Worksheets("Gesamt")
.Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
x = Sheets(wks.Name).Cells(Rows.Count, 1).End(xlUp).Row + 1
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If x > 2 Then
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End If
End If
Next
End With
Application.ScreenUpdating = True
End Sub
Gruß
robert

Anzeige
AW: Probier mal das....
07.04.2013 19:23:06
rieckmann
Hallo Robert,
nun kommt der Fehler bei
".Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete"
haste ne Ahnung warum ?
Gruß
Fred

AW: hier eine Datei-ohne Fehler.....
07.04.2013 19:44:07
rieckmann
Hallo,
auch bei dieser kommt der Fehler wenn man auf einen Tabellenblatt einen neuen Datensatz eingibt und dann auf das Blatt "Gesamt" geht !
Meine Datei sieht auch so aus !
Gruß
Fred

Sorry, bei mir kein ! Fehler bei Neueingabe...
07.04.2013 19:57:13
robert
Hi,
wenn es bei dir so ist, dann bin ich draussen, denn wie gesagt,
bei mir kein Fehler, wenn ich zB. in Tabelle2 einen Datensatz hinzufüge.
PS: kannst Du deine Datei hier hochladen?
Gruß
robert

Anzeige
AW: Sorry, bei mir kein ! Fehler bei Neueingabe...
07.04.2013 20:04:59
rieckmann
Wenn ich das debuggen beende übernimmt er alles !
Hier die Datei:

Die Datei https://www.herber.de/bbs/user/84769.xls wurde aus Datenschutzgründen gelöscht


AW: Sorry, bei mir kein ! Fehler bei Neueingabe...
07.04.2013 22:18:27
Matze

Private Sub Worksheet_Activate()
Dim wks As Worksheet
Dim letzteZ As Long, x As Long
Application.ScreenUpdating = False
With Worksheets("Gesamt")
.Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
x = Sheets(wks.Name).Cells(Rows.Count, 1).End(xlUp).Row + 1
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If x > 2 Then
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
End If
Next
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'die muss doch hier hin
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Richtig referenzieren
07.04.2013 16:13:13
rieckmann
Hallo Erich,
danke für der Erklärung.
Das leutet ein.
Wieder etwas dazu gelernt.
Gruß
Fred

Bemerkungen zur abgeänderten Datei
08.04.2013 11:22:30
Erich
Hi Fred, hi Matze,
zu dem Code

Private Sub Worksheet_Activate()
Dim wks As Worksheet
Dim letzteZ As Long, x As Long
Application.ScreenUpdating = False
With Worksheets("Gesamt")
.Range(Rows(2), Rows(Rows.Count)).Delete
For Each wks In Worksheets
If wks.Name  "Gesamt" Then
x = Sheets(wks.Name).Cells(Rows.Count, 1).End(xlUp).Row + 1
letzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If x > 2 Then
wks.Cells(2, 1).Resize(wks.UsedRange.Rows.Count - 1, 9).Copy .Cells(letzteZ, 1)
End If
End If
Next
.Range("A:I").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'die muss doch hier hin
End With
Application.ScreenUpdating = True
End Sub
habe ich ein paar kritische Anmerkungen.
1.
Muss es "Worksheet_Activate" sein, also bei jedem Wechsel zum Blatt "Gesamt" laufen?
Oder soll der Code nur laufen beim Öffnen der Mappe (vgl. "AutoOpen" in Freds Code zu Beginn).
(Dann würde ich "Workbook_Open" anstelle des antiquierten "AutoOpen" verwenden.)
Wenn man das "Private" weglässt, kann man die Prozedur auch leicht zu Fuß starten,
etwa nach einer Änderung der Daten.
2.
"With Worksheets("Gesamt")" ist überflüssig. Denn alle nicht weiter bestimmten Bezüge wie Columns() usw.
beziehen sich auf das Blatt, in dem der Code steht. Der Blattname kommt im Code besser nicht vor.
Man kann dann den Blattnamen ändern, ohne den Code anpassen zu müssen.
3.
If wks.Name "Gesamt" Then
Auch hier braucht der Name "Gesamt" nicht zu stehen. ".Name" (in der With-Klammer) oder "Me.Name"
(wenn ohne With-Klammer) reicht aus.
4.
Ist Sheets(wks.Name) etwas anderes als wks? Statt
x = Sheets(wks.Name).Cells(...) reichte
x = wks.Cells(...)
5.
Mit
x = Sheets(wks.Name).Cells(Rows.Count, 1).End(xlUp).Row + 1
ist die Anzahl Quellzeilen bekannt. Warum dann
Resize(wks.UsedRange.Rows.Count - 1, ...) ?
x hängt nur von Spalte A ab, wks.UsedRange.Rows.Count - 1 kann größer sein
6.
SpecialCells(xlCellTypeBlanks) ist Nothing, wenn keine leere Zelle gefunden wird, dann tritt Fehler 1004 auf.
7.
SpecialCells(xlCellTypeBlanks).EntireRow.Delete löscht eine Zeile auch dann,
wenn sie nicht komplett leer ist. Es reicht eine leere Zelle in der Zeile.
Nach 1. die Frage: Wann soll der Code laufen?
Und nach 7.: Muss vor dem Löschen einer Zeile geprüft werden, dass die Zellen in allen Spalten A:I leer sind,
oder soll schon dann gelöscht werden, wenn die Zelle in Spalte A leer ist?
Um nicht nur zu meckern, hier zwei Code-Varianten. Die zweite gehört in das Modul zu " _ DieseArbeitsmappe".

Option Explicit
Private Sub Worksheet_Activate()
Dim wks As Worksheet, lngZ As Long, lngQ As Long, rngDel As Range
Application.ScreenUpdating = False
Range(Rows(2), Rows(Rows.Count)).Delete
lngZ = 2
For Each wks In Worksheets
If wks.Name  Me.Name Then
lngQ = wks.Cells(wks.Rows.Count, 1).End(xlUp).Row - 1
If lngQ > 0 Then
wks.Cells(2, 1).Resize(lngQ, 9).Copy Cells(lngZ, 1)
lngZ = lngZ + lngQ
End If
End If
Next wks
For lngQ = 2 To lngZ - 1
If IsEmpty(Cells(lngQ, 1)) Then
If rngDel Is Nothing Then
Set rngDel = Cells(lngQ, 1)
Else
Set rngDel = Union(rngDel, Cells(lngQ, 1))
End If
End If
Next lngQ
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
Application.ScreenUpdating = True
End Sub
Option Explicit
Sub Workbook_Open()
Dim wks As Worksheet, lngZ As Long, lngQ As Long, rngDel As Range
Application.ScreenUpdating = False
With Worksheets("Gesamt")
.Range(.Rows(2), .Rows(.Rows.Count)).Delete
lngZ = 2
For Each wks In Worksheets
If wks.Name  .Name Then
lngQ = wks.Cells(wks.Rows.Count, 1).End(xlUp).Row - 1
If lngQ > 0 Then
wks.Cells(2, 1).Resize(lngQ, 9).Copy .Cells(lngZ, 1)
lngZ = lngZ + lngQ
End If
End If
Next wks
For lngQ = 2 To lngZ - 1
If IsEmpty(.Cells(lngQ, 1)) Then
If rngDel Is Nothing Then
Set rngDel = .Cells(lngQ, 1)
Else
Set rngDel = Union(rngDel, .Cells(lngQ, 1))
End If
End If
Next lngQ
If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End With
Application.ScreenUpdating = True
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: Bemerkungen zur abgeänderten Datei
08.04.2013 14:15:54
rieckmann
Hallo Erich,
vielen Dank für deine Ausfühlichen Beschreibungen.
Da kann man mal wieder sehen das doch viele Wege nach Rom führen !
Ich bin leider im Bereich VBA ein Anfänger, der sich freut vorhandene Code-Teile in seine Mappe übernehmen zu können.
Auch die eine oder andere Anpassung bekomme ich schon mal hin, aber für das "Eingemachte" reicht es nicht!
Ich werde nachher deine beiden Beispiele ausprobieren.
Vorab schon einmal vielen dank dafür.
Gruß
Fred
Hallo Matze,
auch dir möchte ich meinen Dank aussprechen.
Die von dir zuletzt gepostete Mappe habe ich schon probiert, und sie funktioniert bisher wunderbar.
Also, noch mal Dank an alle Helfer.
Gruß
Fred

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige