fusselfrei
Goto Top

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:

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!

Content-ID: 125301

Url: https://administrator.de/contentid/125301

Ausgedruckt am: 26.11.2024 um 15:11 Uhr

Biber
Biber 18.09.2009 um 18:59:07 Uhr
Goto Top
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,
  • wenn es zwar eine einmalige Aktion ist mit dem Zusammenführen, es aber -zig Sheets sind, die Du sonst Copy&Pasten müsstest
-oder-
  • 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
Fusselfrei
Fusselfrei 19.09.2009 um 12:26:20 Uhr
Goto Top
Hallo Biber,

danke für den netten Empfang! Vielleicht hätte ich meinen Nicknamen nicht als Sonderangebot kaufen sollen...

Bei mir trifft Fall A ein (und später ggf. Fall B):

Ich möchte eine "Zusammenfassung" von Recherchen erstellen:

Aus Recherchen habe ich ca. 50 Sheets mit Rechercheergebnissen.
Die Namen der Sheets sind wie ich sagte "kunterbunt" (z.B. Müller, Becker, Koch)

Die SpaltenAnzahl und Reihenfolge der relevanten Rechercheergebnisse sind in allen Sheets identisch (Vorname, Datum1, Datum2, Typ1, Typ2) und beginnen stets an der gleichen Position (z.B. ab D9 bis H9)

Die Anzahl der Rechercheergebnisse unterscheiden sich, d.h.die ZeilenAnzahl ist unteschiedlich.


Später soll Fall B eintreffen, d.h. neue Recherchen mit neuen Rechercheergebnissen sollen zur "Zusammenfassung" hinzugefügt werden.

Vielen Dank im Voraus!

Fusselfrei
76109
76109 19.09.2009 um 15:34:18 Uhr
Goto Top
Hallo Fusselfrei!

Bleibt für mich noch die Frage? Was soll mit den Tabellen-Nachnamen passieren?

Gruß Dieter
Biber
Biber 19.09.2009 um 16:05:05 Uhr
Goto Top
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
76109
76109 19.09.2009 um 17:27:56 Uhr
Goto Top
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 gefallenface-smile

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
Fusselfrei
Fusselfrei 19.09.2009 um 18:28:12 Uhr
Goto Top
Hallo Dieter und Biber!

"Müller, Becker, Koch" war in meiner obigen Frage nicht wirklich richtig (Entschuldigung!)

Die Blätter sind nach dem Recherche-Datum benannt, wobei auch mehrere Recherchen (mit anderen Kriterien) pro Tag vorhanden sein können, d.h. die Blätter heißen z.B. 16.12.07 bei der ersten Recherche am 16.12.07,
bei einer zweiten Recherche am gleichen Tag 16.12.07 (2),
dann 16.12.07 (3) usw.

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).

Wie realisiere ich denn dann ein "Parsen" durch die Sheets, in denen dann jeweils in einer Spalte bzw. Zelle eine laufende Nummer des Sheets stünde ohne die Namen der Sheets verändern zu müssen?

Zu Deiner Frage Dieter:
Die Namen der Sheets sind zum jetzigen Zeitpunkt für mich irgendwie "logisch". Daher möchte ich diese ursprünglichen Blätter-Namen irgendwie "aufheben".

Grüße
Roland
Biber
Biber 19.09.2009 um 19:27:43 Uhr
Goto Top
Moin Fusselfrei,

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).

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" face-wink

Grüße
Biber
76109
76109 20.09.2009 um 15:23:45 Uhr
Goto Top
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:
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]
Fusselfrei
Fusselfrei 20.09.2009 um 16:45:44 Uhr
Goto Top
Hallo Dieter!

Vielen herzlichen Dank!! face-smile
Es funktioniert einwandfrei!


Grüße
Fusselfrei
76109
76109 22.09.2009 um 09:19:29 Uhr
Goto Top
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 anface-smile

Gruß Dieter

PS. Ich glaube ich Häng. Hast Deinen Text während meines textens einfach gelöscht.???face-sad