VBA für Excel zum Zusammenführen von Tabellen in Blättern
Liebes Forum,
ich habe als VBA-Neuling ein (für mich) großes Vorhaben:
Eine Excel-Datei (2007) enhält mehrere Blätter mit diversen Nachnamen (z.B. Müller, Becker, Koch, ... Lüdenscheid)
Die Tabellen in den Blättern sehen so aus:
Die Anzahl der Spalten in den Blättern beträgt 5,
die Tabellen sind unterschiedlich lang (z.B. bis Name3 oder Name6),
teilweise sind Felder leer.
Ich möchte aus allen Blättern ( Müller, Becker, Koch, ... Lüdenscheid) die Tabelleninhalte in eine neue Tabelle in ein neues Blatt kopieren.
Was muss ich dazu lernen und wissen? Oder könnte mir sogar jemand einen Vorschlag machen?
Vielen Dank im Voraus!
ich habe als VBA-Neuling ein (für mich) großes Vorhaben:
Eine Excel-Datei (2007) enhält mehrere Blätter mit diversen Nachnamen (z.B. Müller, Becker, Koch, ... Lüdenscheid)
Die Tabellen in den Blättern sehen so aus:
Vorname | Datum1 | Datum2 | Typ1 | Typ2 |
Name1 | 02.03. | 21.04. | E1 | E4; E7 |
Name2 | 04.08. | E2 | E6; E9 | |
Name3 | 26.09. | 07.09. | E4 | |
... | ... | ... | ... | ... |
Namex | 07.08. | 08.08. | E1 | E4; E7 |
Die Anzahl der Spalten in den Blättern beträgt 5,
die Tabellen sind unterschiedlich lang (z.B. bis Name3 oder Name6),
teilweise sind Felder leer.
Ich möchte aus allen Blättern ( Müller, Becker, Koch, ... Lüdenscheid) die Tabelleninhalte in eine neue Tabelle in ein neues Blatt kopieren.
Was muss ich dazu lernen und wissen? Oder könnte mir sogar jemand einen Vorschlag machen?
Vielen Dank im Voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 125301
Url: https://administrator.de/contentid/125301
Ausgedruckt am: 26.11.2024 um 15:11 Uhr
10 Kommentare
Neuester Kommentar
Moin Fusselfrei,
willkommen im Forum.
ein paar Nachfragen.
Wo zum Gates kauft ihr eure Nicknames?
Wenn die ZeilenAnzahl unteschiedlich ist - okay.
Ist aber umgekehrt gewährleistet, das die Spalten-Anzahl und Reihenfolge in allen Sheets identisch ist?
Wenn ja- kann dann die Zeile 1 (mit den Spaltenüberschriften) blind aus dem erst(best)en Bladel übernommen werden und aus allen folgenden Blättern eben alles ab Zeile 2?
Und grundsätzlich: Eine Office-Automation lohnt sich doch nur,
Falls es Fall B ist, empfehle ich den Prozess zu ändern und keinen Aufwand in diesen ja doch gut 30-Zeilen-makro zu stecken.
Und falls Fall A, dann wüsste ich schon gern, ob "-zig Tabellenbätter" wirklich mehr als 3 sind.
Grüße
Biber
willkommen im Forum.
ein paar Nachfragen.
Wenn die ZeilenAnzahl unteschiedlich ist - okay.
Ist aber umgekehrt gewährleistet, das die Spalten-Anzahl und Reihenfolge in allen Sheets identisch ist?
Wenn ja- kann dann die Zeile 1 (mit den Spaltenüberschriften) blind aus dem erst(best)en Bladel übernommen werden und aus allen folgenden Blättern eben alles ab Zeile 2?
Und grundsätzlich: Eine Office-Automation lohnt sich doch nur,
- wenn es zwar eine einmalige Aktion ist mit dem Zusammenführen, es aber -zig Sheets sind, die Du sonst Copy&Pasten müsstest
- wenn es eine immer wiederkehrende Aktion ist, die dich die kommenden Monate & Jahre begleitet
Falls es Fall B ist, empfehle ich den Prozess zu ändern und keinen Aufwand in diesen ja doch gut 30-Zeilen-makro zu stecken.
Und falls Fall A, dann wüsste ich schon gern, ob "-zig Tabellenbätter" wirklich mehr als 3 sind.
Grüße
Biber
Hallo Fusselfrei!
Bleibt für mich noch die Frage? Was soll mit den Tabellen-Nachnamen passieren?
Gruß Dieter
Bleibt für mich noch die Frage? Was soll mit den Tabellen-Nachnamen passieren?
Gruß Dieter
Moin didi1954,
rein pragmatisch würdfe ich anregen, zwei neue Spalten rechts daneben anzulegen - eine mit dem bisherigen Blattnamen "Müller" etc und noch eine Spalte mit der laufenden Nummer des Quell-Blatts, falls mal ein doppelter Müller auftaucht.
Okay, ist jetzt nicht zu erwarten, wenn alle Sheets in einer Excel-Datei sind, aber langfristig kann es auftreten bei Plan B.
Grüße
Biber
rein pragmatisch würdfe ich anregen, zwei neue Spalten rechts daneben anzulegen - eine mit dem bisherigen Blattnamen "Müller" etc und noch eine Spalte mit der laufenden Nummer des Quell-Blatts, falls mal ein doppelter Müller auftaucht.
Okay, ist jetzt nicht zu erwarten, wenn alle Sheets in einer Excel-Datei sind, aber langfristig kann es auftreten bei Plan B.
Grüße
Biber
Hallo Biber!
Ich bleibe mal bei Plan A und würde dabei rein pragmatisch gesehen, die Nachnamen in die 1. Spalte schreiben und die anderen Spalten um 1 nach rechts verschieben. Würde zumindest mir, von der Optik her bessser gefallen
Bei Plan B bleibt die Frage, ob die bisherigen Einträge in den einzelnen Sheets erhalten bleiben und neue hinzugefügt werden oder wie ist das gedacht?
Gruß Dieter
Ich bleibe mal bei Plan A und würde dabei rein pragmatisch gesehen, die Nachnamen in die 1. Spalte schreiben und die anderen Spalten um 1 nach rechts verschieben. Würde zumindest mir, von der Optik her bessser gefallen
Bei Plan B bleibt die Frage, ob die bisherigen Einträge in den einzelnen Sheets erhalten bleiben und neue hinzugefügt werden oder wie ist das gedacht?
Gruß Dieter
Moin Fusselfrei,
zu Deiner Frage
Nein, nein.. nicht manuell und mit Zusatzaufwand.
didi1954 und oder ich werden ha ohnehin in irgendeiner Schleife über die vorhandenen Sheets schrapeln und dabei von 1 bis 50 zahlen. und diese 1 bis 50 können wir dabei "nebenbei" in eine weitere Spalte schreiben, genau wie die ja einzig identifizierende Quellinformation, den bisherigen Namen des Sheets.
Dann kannst Du später sowohl mit "Daten"->"Autofilter" (oder wie immer das unter Excel 2007 heißen mag) danach schnell suchen oder auch den ganzen Klump mit "Teilsummen()" aufaggregieren... denn vermutlich ist das mittelfristige Ziel ja ein Vergleich mit Summen/Durchschnitt und Prozentwerten.
Also keine Angst: Du sollst weder etwas zusätzlich von Hand durchnummerieren noch die Blatt-Namen verlieren.
BTW, "Roland Fusselfrei" hört sich noch beknackter an "Fusselfrei"
Grüße
Biber
zu Deiner Frage
Zu Deinem Vorschlag Biber:
Den Blättern eine laufende Nummer zu vergeben ist zum jetzigen Zeitpunkt (bei 50 Sheets)
noch gerade machbar (was den Arbeitsaufwand und die Monotonie betrifft).
Den Blättern eine laufende Nummer zu vergeben ist zum jetzigen Zeitpunkt (bei 50 Sheets)
noch gerade machbar (was den Arbeitsaufwand und die Monotonie betrifft).
Nein, nein.. nicht manuell und mit Zusatzaufwand.
didi1954 und oder ich werden ha ohnehin in irgendeiner Schleife über die vorhandenen Sheets schrapeln und dabei von 1 bis 50 zahlen. und diese 1 bis 50 können wir dabei "nebenbei" in eine weitere Spalte schreiben, genau wie die ja einzig identifizierende Quellinformation, den bisherigen Namen des Sheets.
Dann kannst Du später sowohl mit "Daten"->"Autofilter" (oder wie immer das unter Excel 2007 heißen mag) danach schnell suchen oder auch den ganzen Klump mit "Teilsummen()" aufaggregieren... denn vermutlich ist das mittelfristige Ziel ja ein Vergleich mit Summen/Durchschnitt und Prozentwerten.
Also keine Angst: Du sollst weder etwas zusätzlich von Hand durchnummerieren noch die Blatt-Namen verlieren.
BTW, "Roland Fusselfrei" hört sich noch beknackter an "Fusselfrei"
Grüße
Biber
Hallo Fusselfrei und Biber!
Nur so als Anmerkung. 50 Sheets umzubenamsen dauerte bei mir knapp 2 Minuten (rechte Hand Doppelklick und linke Hand Zahl eingeben)
Die fortlaufende Nummer kann man sich eigentlichen sparen, hab's aber trotzdem mal mit eingebunden.
Es wird angenommen, dass sich in den einzelnen Sheets in Spalte D9 unter den Vornamen keine sonstigen Einträge mehr befinden.
Das Tabellenblatt mit der Zusammenfassung (Konstante ListDaten = Name) wird automatisch erstellt, sofern noch kein's existiert.
Die Spalten (siehe Konstanten) A = Lfd.-Nr., B = Name Quell-Tabellenblatt und C:G = Quell-Tabelle.
So, diesen Entwurf habe ich dann mal zusammengeschrappelt:
Das Ergebnis sieht in etwa so aus:
Den Rest kannst Du ja entsprechend anpassen.
Gruß Dieter
[edit] Für den Fall das Copy-Tabelle leer ist: Zeile 23 geändert [/edit]
Nur so als Anmerkung. 50 Sheets umzubenamsen dauerte bei mir knapp 2 Minuten (rechte Hand Doppelklick und linke Hand Zahl eingeben)
Die fortlaufende Nummer kann man sich eigentlichen sparen, hab's aber trotzdem mal mit eingebunden.
Es wird angenommen, dass sich in den einzelnen Sheets in Spalte D9 unter den Vornamen keine sonstigen Einträge mehr befinden.
Das Tabellenblatt mit der Zusammenfassung (Konstante ListDaten = Name) wird automatisch erstellt, sofern noch kein's existiert.
Die Spalten (siehe Konstanten) A = Lfd.-Nr., B = Name Quell-Tabellenblatt und C:G = Quell-Tabelle.
So, diesen Entwurf habe ich dann mal zusammengeschrappelt:
Option Explicit
Const ListDaten = "Alle Daten" 'Tabellenblatt Alle Daten
Const CopyRng = "D9" 'Kopieren Zelle 1
Const CopyBeg = "D" 'Kopieren Spalte 1
Const CopyEnd = "H" 'Kopieren Spalte n
Const ListId = "A" 'Alle Daten Spalte Lfd-Nr.
Const ListName = "B" 'Alle Daten Spalte Tabellenname
Const ListPaste = "C" 'Alle Daten Spalte Datenkopie
Sub InitDaten()
Dim Wks As Worksheet, Found As Object, NextLine As Integer, Id As Integer
Call InitListSheet
Application.ScreenUpdating = False
For Each Wks In Worksheets
If Wks.Name <> ActiveSheet.Name Then
Set Found = Columns(ListName).Find(Wks.Name, LookIn:=xlValues, LookAt:=xlWhole)
If Found Is Nothing And Not IsEmpty(Wks.Range(CopyRng)) Then
NextLine = GetEndLine(ActiveSheet, ListPaste) + 1
Cells(NextLine, ListId) = GetNextId(): Cells(NextLine, ListName) = Wks.Name
Range(Wks.Range(CopyRng), Wks.Cells(GetEndLine(Wks, CopyBeg), CopyEnd)).Copy
ActiveSheet.Paste Destination:=Cells(NextLine, ListPaste)
Application.CutCopyMode = False
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Private Sub InitListSheet()
Dim Wks As Worksheet
On Error Resume Next: Set Wks = Sheets(ListDaten): On Error GoTo 0
If Wks Is Nothing Then
Sheets.Add Before:=Sheets(1): ActiveSheet.Name = ListDaten
With Range("A1:G1")
.Value = Array("Lfd.-Nr.", "Blattname", "Vorname", "Datum1", "Datum2", "Typ1", "Typ2")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Font.FontStyle = "Fett"
End With
Else
Wks.Activate
End If
End Sub
Private Function GetEndLine(ByRef Wks, Col As String) As Integer
GetEndLine = Wks.Cells(Wks.Rows.Count, Col).End(xlUp).Row
End Function
Private Function GetNextId() As Integer
Dim EndLine As Integer
EndLine = GetEndLine(ActiveSheet, ListId)
If EndLine = 1 Then GetNextId = 1 Else GetNextId = Cells(EndLine, ListId) + 1
End Function
Das Ergebnis sieht in etwa so aus:
Lfd.-Nr. | Blattname | Vorname | Datum1 | Datum2 | Typ1 | Typ2 |
1 | Tabelle 1 | Name | Datum | Datum | Text | Text |
Name | Datum | Datum | Text | Text | ||
Name | Datum | Datum | Text | Text | ||
2 | Tabelle 2 | Name | Datum | Datum | Text | Text |
... | ... | ... | ... | ... |
Den Rest kannst Du ja entsprechend anpassen.
Gruß Dieter
[edit] Für den Fall das Copy-Tabelle leer ist: Zeile 23 geändert [/edit]
Hallo Fusselfrei!
War jetzt reiner Zufall, dass ich Deine Textänderung entdeckt habe. Das nächstemal bitte eine seperate Antwort schreiben, damt auch eine Benachrichtigung erfolgt.
Deine Vornamenänderungswünsche sehe ich mir mal an
Gruß Dieter
PS. Ich glaube ich Häng. Hast Deinen Text während meines textens einfach gelöscht.???
War jetzt reiner Zufall, dass ich Deine Textänderung entdeckt habe. Das nächstemal bitte eine seperate Antwort schreiben, damt auch eine Benachrichtigung erfolgt.
Deine Vornamenänderungswünsche sehe ich mir mal an
Gruß Dieter
PS. Ich glaube ich Häng. Hast Deinen Text während meines textens einfach gelöscht.???