dummer-esel
Goto Top

Viele Excel-Dateien zusammenführen

Hallo,

ich habe einige (über 300) Excel-Dateien, die ich automatisch zusammenführen möchte (z.B. in eine CSV-Datei).
Einige Schwierigkeiten hierbei:

- Jede Datei hat mehrere Registerkarten und diese Information sollte erhalten bleiben
- Am liebsten würde ich auswählen, welche Daten übernommen werden
- Aus den Feldern möchte ich nur die (berechneten) Werte, aber nicht die Formeln/Bezüge speichern
- Im Idealfall möchte ich Zellen nur kopieren, wenn sie nicht leer sind (also mit einer Bedingung)


Beispiel:
Ich stelle mir den Idealfall so vor:

1. Kopiere aus Registerkarte "Eins" die Felder A3 bis M15
2. Füge ins CSV ein (der Name der Registerkarte sollte beim Einfügen als Information erhalten bleiben): "Eins", A3, B3, ..., M3 \n "Eins", A4, B4, ... M4
3. Wenn jeweils Zelle B4 nicht leer ist, dann kopiere aus den Registerkarten "Zwei" bis "Zwölf" die Felder B4 bis B18
4. Füge sie ins CSV ein "Zwei", B4, B5, ..., B18 (...)
5. Öffne nächste Datei und führe Schritte 1-4 aus

Ich habe mit Makros noch keine große Erfahrung, so dass ich nicht weiß, ob das damit möglich wäre oder ob diese Aufgabe eine "größere Anstrengung" wäre (und es vermutlich schneller ginge, alles von Hand zu kopieren, wobei ich mir dies ersparen wollte).

Hat jemand einen Tipp?
Vielleicht gibt es ein Programm, mit dem man das erledigen kann?

Vielen Dank schon mal!

Content-ID: 201220

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

Ausgedruckt am: 23.11.2024 um 04:11 Uhr

106543
106543 04.02.2013 um 10:39:20 Uhr
Goto Top
Hallo,

wie oft kommt es denn vor, dass du sowas machen musst ?
Also sprich über 300 Excel-Dateien zusammenführen musst ?
Wenn´s in der Zukunft öfter vorkommt, kann ich die nur VBA und/oder VBS empfehlen, ansonsten per Hand machen face-smile

Grüße
Exzellius
dummer-esel
dummer-esel 04.02.2013 um 10:47:34 Uhr
Goto Top
Hi,

ist jetzt nur ein einmaliges Ding, um "alte" Daten in ein Datenbankformat zu bringen... trotzdem wäre es schön, wenn ich nicht eine Woche mit kopieren & einfügen beschätigt wäre. face-wink

Hast du eine Idee, wie man das geschickt mit VBA/VBS lösen kann?
Danke!
106543
106543 04.02.2013 aktualisiert um 11:06:29 Uhr
Goto Top
Hi,

wenns wirklich "nur":

1. Kopiere aus Registerkarte "Eins" die Felder A3 bis M15
2. Füge ins CSV ein (der Name der Registerkarte sollte beim Einfügen als Information erhalten bleiben): "Eins", A3, B3, ..., M3 \n "Eins", A4, B4, ... M4
3. Wenn jeweils Zelle B4 nicht leer ist, dann kopiere aus den Registerkarten "Zwei" bis "Zwölf" die Felder B4 bis B18
4. Füge sie ins CSV ein "Zwei", B4, B5, ..., B18 (...)
5. Öffne nächste Datei und führe Schritte 1-4 aus

sein soll, dann kann ich dir da was in VBA basteln ;)
wie soll denn die CSV genau aufgebaut sein ?

Grüße
Exzellius

[EDIT]
bzw. wie sind denn die Excel-Dateien aufgebaut ?
wie heißen die Excel-Dateien ?
liegen alle Dateien im selben Verzeichnis ?
etc. etc. ;)
[/EDIT]
dummer-esel
dummer-esel 04.02.2013 aktualisiert um 11:11:44 Uhr
Goto Top
Hi,

ja, das ist es wirklich "nur".
Der Aufbau der Dateien ist etwas umfangreicher, daher würde mir da ein Grundgerüst in VBA völlig reichen. Ich werde es dann schon hinbekommen, es so anzupassen, dass alle nötigen Zellen kopiert werden, sobald ich mal ein "Muster" habe, das funktioniert.

Wenn du mir o.g. in VBA basteln könntest, wäre das echt super! Vielen Dank schon mal!
Das führe ich dann als Makro in der "neuen" (also zusammengeführten) Excel aus, oder?

Danke & Gruß!

[edit]
Die Excel-Dateien liegen alle in einem Verzeichnis, die Namen haben kein bestimmtes Muster (nur Nummern .xls)
[/edit]
106543
106543 04.02.2013 um 11:19:39 Uhr
Goto Top
Hi,

[edit]
Die Excel-Dateien liegen alle in einem Verzeichnis, die Namen haben kein bestimmtes Muster (nur Nummern .xls)
[/edit]

hmm wie stellst du dir den Aufruf der Excel-Dateien vor ?
Ich könnte einfach alle gleichzeitig öffnen (was allerdings ziemlich sicher den PC abstürzen lässt)
oder ich muss irgend ein Muster beachten, wonach ich sie Stück für Stück öffne.#
Ich könnte auch jedes mal eine Benutzeroberfläche einblenden lassen, in der du dann eine Excel-Liste auswählen musst.

Das mit dem kleinen Makro basteln sollte kein Problem sein und ja das kommt dann in die "neue" Excel-Liste face-smile
bzgl. des Formats, wie soll das Ganze zusammengefasst sein ? Direkt in die Excel oder ein eine .CSV-Datei ?
Wenn CSV, dann wie soll die aussehen ;)
Im Stil von
Blatt1;Zellenwert1;Zellenwert2;...
Blatt2;Zellenwert1;Zellenwert2;...
etc. ?

Grüße
Exzellius
dummer-esel
dummer-esel 04.02.2013 aktualisiert um 11:26:41 Uhr
Goto Top
hmm wie stellst du dir den Aufruf der Excel-Dateien vor ?
Hab das ja noch nie gemacht... was wäre denn am einfachsten?
Ich dachte, dass man einfach das Verzeichnis als Liste aufruft und die Inhalte einer Datei nach der anderen einfügt. Ob das nun der einfachste/beste Weg ist, weiß ich auch nicht.

Ich könnte einfach alle gleichzeitig öffnen (was allerdings ziemlich sicher den PC abstürzen lässt)
Vermutlich... selbst bei meinen 8GB RAM. face-wink

oder ich muss irgend ein Muster beachten, wonach ich sie Stück für Stück öffne.#
Zur Not könnte ich eine Datei/Liste mit den Dateinamen im Verzeichnis erstellen...

Ich könnte auch jedes mal eine Benutzeroberfläche einblenden lassen, in der du dann eine Excel-Liste auswählen
musst.
Wäre auch eine Option. Die 300 Klicks zum Auswählen schaffe ich noch, falls das dann viel Aufwand ersparen sollte.

Das mit dem kleinen Makro basteln sollte kein Problem sein und ja das kommt dann in die "neue" Excel-Liste face-smile
super, vielen Dank schon mal!

bzgl. des Formats, wie soll das Ganze zusammengefasst sein ? Direkt in die Excel oder ein eine .CSV-Datei ?
Direkt in Excel ist ok, ich denk das ist das einfachste? Als .CSV ist auch gut.

Wenn CSV, dann wie soll die aussehen ;)
Im Stil von
Blatt1;Zellenwert1;Zellenwert2;...
Blatt2;Zellenwert1;Zellenwert2;...
etc. ?
richtig.
Wie eingangs beschrieben, auch mit Bedingungen, also z.B. dass eine Zeile nur eingefügt wird, wenn eine bestimmte Zelle nicht leer ist etc.
106543
106543 04.02.2013 um 11:29:50 Uhr
Goto Top
Hi,

so noch zwei Fragen dann mach ich mich an die Arbeit ;)
1) du brauchst keinen Verweis in welcher Zelle die Information vorher war ?
2) wenns leer ist und du einen Zellenverweis brauchst, soll der trotzdem drin sein oder nicht ?

Grüße
Exzellius
dummer-esel
dummer-esel 04.02.2013 um 11:34:48 Uhr
Goto Top
1) du brauchst keinen Verweis in welcher Zelle die Information vorher war ?
nein, es geht nur um die Informationen/Daten/Werte selbst die drin stehen bzw. im Original berechnet wurden

2) wenns leer ist und du einen Zellenverweis brauchst, soll der trotzdem drin sein oder nicht ?
die Frage verstehe ich nicht so ganz, sorry.
Mit der "Bedingung" meinte ich z.B., dass er eine Zeile nur einfügen soll, wenn im Original eine bestimmte Zelle ausgefüllt ist. Wenn im Original die Zelle leer ist, dann kann er zum nächsten Schritt übergehen.
106543
106543 04.02.2013 aktualisiert um 11:39:05 Uhr
Goto Top
Hi,

wenn jetzt z.B. folgende Excel dabei ist:
Tabellenblatt 1
A1:"Hier steht irgendein Text"
A2:"123412"
A3:leer
A4:"noch ein Text"

dann soll das später so aussehen oder ?
A1:Tabellenblatt_1
A2:"Hier steht irgendein Text"
A3:"123412"
A4:"noch ein Text"
B1:Tabellenblatt_2
B2:Daten
B3:Daten ...

Grüße
Exzellius
dummer-esel
dummer-esel 04.02.2013 aktualisiert um 11:47:54 Uhr
Goto Top
Habe es mir etwas anders vorgestellt, wobei ich das dann wohl anpassen kann:

Original:
Tabellenblatt "Name"
A1: "Hier steht ein Text"
A2: "1234"
A3: leer
A4: "5678"
Tabellenblatt "Name 2"
A1: leer
A2: "4321"
A3: leer
A4: "5678"

dann sollte das später so aussehen:
A1: "Name"
B1: "Hier steht ein Text"
C1: "1234"
D1: leer
E1: "5678"

[edit]
(A2-E2 wäre dann der nächste Datensatz; Da im Blatt "Name2" die Zelle A1 leer ist, wird diese Zeile aber nicht eingefügt)
[/edit]

Wie gesagt sind die Dateien etwas umfangreicher aufgebaut und ich will aus jedem Blatt ggf. mehrere Zeilen einfügen. Daher brauche ich nur eine Grundstruktur/ein Beispiel, wie es funktioniert und das ich dann anpassen und erweitern kann.

Also wenn das mit dem Auslesen der Dateien und der Extraktion aus den verschiedenen Blättern mit Bedingung funktioniert, bin ich glücklich! Den Rest schaffe ich dann schon. face-wink

Danke!
106543
106543 04.02.2013 um 12:27:54 Uhr
Goto Top
Hi,

ok ;) gib mir ein paar Minütchen zum zusamenbasteln

Grüße
Exzellius
106543
106543 04.02.2013 aktualisiert um 12:48:44 Uhr
Goto Top
Nochmal ne Nachfrage face-smile

Wenn jeweils Zelle B4 nicht leer ist, dann kopiere aus den Registerkarten "Zwei" bis "Zwölf" die Felder B4
bis B18

meint das, dass nur wenn die Zelle B4 nicht leer ist, dass dann die anderen Registerkarten gemacht werden sollen ?
und:
haben die Registerkaren einheitliche Namen ? also wie im Beispiel "eins","zwei",etc.?
dummer-esel
dummer-esel 04.02.2013 um 12:46:12 Uhr
Goto Top
meint das, dass nur wenn die Zelle B4 nicht leer ist, dass dann die anderen Registerkarten gemacht werden sollen ?
genau, nur dann!

haben die Registerkaren einheitliche Namen ? also wie im Beispiel "eins","zwei",etc.?
ja, die Namen sind überall gleich, z.B. "Übersicht", "Eins", "Zwei", ...
106543
106543 04.02.2013 um 12:50:47 Uhr
Goto Top
also wenn in "Übersicht" Zelle B4 nicht leer dann mache weiter mit "Eins","Zwei",...
gut das wäre geklärt face-smile
soll ich jetzt die Zellen in den Reigstern Senkrecht auslesen oder Waagerecht ? ;)
D.h.
soll ich folgendermaßen auslesen A1 -> A2 -> A3 -> ... oder A1 -> B1 -> C1 -> ... ?
dummer-esel
dummer-esel 04.02.2013 um 12:55:57 Uhr
Goto Top
also wenn in "Übersicht" Zelle B4 nicht leer dann mache weiter mit "Eins","Zwei",...
gut das wäre geklärt face-smile
top!

soll ich jetzt die Zellen in den Reigstern Senkrecht auslesen oder Waagerecht ? ;)
D.h.
soll ich folgendermaßen auslesen A1 -> A2 -> A3 -> ... oder A1 -> B1 -> C1 -> ... ?

eher waagerecht.
Wobei ich dann sowieso die Zellen direkt spezifizieren werde, also nicht dass alle Zellen komplett kopiert werden, sondern nur die Zellen B4 bis M4 zum Beispiel.

Eingefügt werden sollen sie in jedem Fall waagerecht. Also so, dass man es später einfach als CSV speichern und z.B. in eine Datenbank importieren kann.
106543
106543 04.02.2013 um 13:01:38 Uhr
Goto Top
Hi,

Eingefügt werden sollen sie in jedem Fall waagerecht. Also so, dass man es später einfach als CSV speichern und z.B. in
eine Datenbank importieren kann.

ok dann werd ich waagerecht auslesen und einfügen face-smile
106543
106543 04.02.2013 aktualisiert um 13:10:30 Uhr
Goto Top
Nochmal ne Nachfrage ;)
kannst du mir sagen, wieviele Zeilen deine Excel-Listen maximal haben werden bzw. wieviele Spalten ?
Und auf der Registerkarte "Übersicht" soll auch kopiert werden ?
dummer-esel
dummer-esel 04.02.2013 um 13:12:45 Uhr
Goto Top
wieviele Zeilen deine Excel-Listen maximal haben werden
ca. 180

bzw. wieviele Spalten ?
bis ca. AO, also ca. 41

...wobei ich vermutlich nur Bereiche aus den ersten 25 Zeilen und Spalten auslesen werde.
106543
106543 04.02.2013 um 13:22:25 Uhr
Goto Top
Soooo wie kann ich dir die Excel-File jetzt zukommen lassen ?
Per Quellcode geht das leider ungünstig
Kannst mir deine Mail-Adresse z.B. per PN schreiben oder du wartest bis ich daheim bin und kannst es dann vom File-Server runterladen ;)

Grüße
Exzellius
dummer-esel
dummer-esel 04.02.2013 um 13:26:13 Uhr
Goto Top
Hi,

cool, vielen Dank schon mal!
Da ich es nicht so super eilig habe, kann ich noch warten bis du daheim bist. Bei der File-Server-Variante haben ggf. spätere Interessenten auch noch was davon. face-wink

Herzlichen Dank für deine Mühe Exzellius!
106543
106543 04.02.2013 um 13:29:40 Uhr
Goto Top
Gerne doch face-smile
Ich schreib die File-Server-Adresse nicht hier ins Forum face-smile
bei späterem Interesse an dem Skriptchen einfach eine PN an mich und ihr bekommt Adresse und PW für den Server

Grüße
Exzellius
dummer-esel
dummer-esel 05.02.2013 um 08:18:09 Uhr
Goto Top
Hi nochmal!

Habe es inzwischen hinbekommen, auch wenn mein Makro nun etwas umfangreicher aussieht.
Falls es jemanden interessiert oder jemand ein ähnliches Problem hat, stelle ich den Code hier mal zur Verfügung.
Viel Spaß damit!

Sub zusammen()

Dim fs As Object
Dim fVerz As Object
Dim fDatei As Object
Dim fdateien As Object
Dim monate(1 To 12) As String
Dim zeile As Integer

zeile = 1 ' Ab welcher Zeile sollen die Daten hier eingefügt werden (Vorsicht, die werden überschrieben bei mehrmaliger Ausführung)  

' Liste der auszulesenden Registerkarten der Quelldateien (alle anderen werden ignoriert!)  
monate(1) = "Jan"  
monate(2) = "Feb"  
monate(3) = "März"  
monate(4) = "April"  
monate(5) = "Mai"  
monate(6) = "Juni"  
monate(7) = "Juli"  
monate(8) = "Aug"  
monate(9) = "Sept"  
monate(10) = "Okt"  
monate(11) = "Nov"  
monate(12) = "Dez"  

Pfad = InputBox("Pfad zu Quelldateien eingeben:", "Pfad Quelldateien", "C:\")  

Application.ScreenUpdating = False 'dient dazu, dass der Bildschirm nicht ständig flackert, wenn zwischen den Excel-Listen umgeschaltet wird (macht das Programm schneller)  

Set fs = CreateObject("scripting.FileSystemObject")  
Set fVerz = fs.getFolder(Pfad) ' Pfad mit einzufügenden Excels einlesen  
Set fdateien = fVerz.Files

Set Liste_Einfügen = ActiveWorkbook ' in aktuelles Excel einfügen  

For Each fDatei In fdateien ' Alle Dateien im Verzeichnis  
    Set Liste_Auslesen = Application.Workbooks.Open(fDatei)
    Liste_Auslesen.Activate
    For Each monat In monate ' Die im Array monate definierten Registerkarten durchgehen  
        Sheets(monat).Select
        For iZähler = 10 To 23 ' relevante Zeilen durchgehen  
            If Worksheets(ActiveSheet.Name).Cells(iZähler, 1).Value <> "" Then  
                For jZähler = 2 To 32 ' Spalte 2 bis 32 überprüfen  
                    If Worksheets(ActiveSheet.Name).Cells(iZähler, jZähler).Value <> "" And Worksheets(ActiveSheet.Name).Cells(iZähler, jZähler).Value <> "0" Then ' Nur wenn ein Wert drin steht  
                        zeile = zeile + 1
                        ' Alle Daten aus Quelldatei kopieren und hier einfügen:  
                        ' Jahr  
                        Range("Q5").Select  
                        Selection.Copy
                        Liste_Einfügen.Activate
                        Cells(zeile, 1).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        Liste_Auslesen.Activate
                        ' Monat  
                        Range("Q4").Select  
                        Selection.Copy
                        Liste_Einfügen.Activate
                        Cells(zeile, 2).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        Liste_Auslesen.Activate
                        ' Tag  
                        Cells(9, jZähler).Select
                        Selection.Copy
                        Liste_Einfügen.Activate
                        Cells(zeile, 3).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        Liste_Auslesen.Activate
                        ' Daten 1  
                        Range("C3").Select  
                        Selection.Copy
                        Liste_Einfügen.Activate
                        Cells(zeile, 4).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        Liste_Auslesen.Activate
                        ' Daten 2  
                        Range("C5").Select  
                        Selection.Copy
                        Liste_Einfügen.Activate
                        Cells(zeile, 5).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                        Liste_Auslesen.Activate
                      End If
                Next
            End If
        Next
    Next monat
    ActiveWorkbook.Close savechanges:=False
Next fDatei

Application.ScreenUpdating = True
End Sub
106543
106543 05.02.2013 um 08:32:14 Uhr
Goto Top
Hi,

meinen Respekt !
Hast es wirklich toll angepasst :D
Wenn du willst kannst du heut abend das Ding auf den Filer hochladen (müsste nur die Benutzerrechte überarbeiten face-smile)

Grüße
Exzellius
Flohwalzer
Flohwalzer 06.05.2013 um 17:48:01 Uhr
Goto Top
Hallo,

ich habe so ein ähnliches Problem. Vielleicht kannst Du auch mir auch weiterhelfen.
Habe 3 Tabellenblätter Jan. Feb. Mrz. April, welche ich auf einer Seite miteinander vergleichen möchte.
Es sind drauf Materialnummer, Bezeichnung Menge und Wert. Die Artikel-Nummern sind aber nicht immer die gleiche.

Viele Grüße
Flohwalzer
106543
106543 10.05.2013 um 09:01:51 Uhr
Goto Top
Hallo Flohwalzer,

wenn ich dir helfen soll, müsstest du dein Problem etwas genauer erläutern face-smile
Wie ist die Tabelle genau formatiert ?
Auf welchem Tabellenblatt steht was in welcher Spalte und Zeile etc.
was soll mit den Daten gemacht werden, wenn sie mal ausgelesen sind.
Möchtest du noch Materialnummer filtern ?

Hast du Erfahrung im schreiben von Makros in Excel?
Andere Programmier-Erfahrung?

Grüße
Exze