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

Dateien zusammenführen

Dateien zusammenführen
06.07.2022 04:35:04
Kisska
Hallo zusammen,
ich habe einen VBA-Code gefunden, mit den man mehrere Dateien mit allen darin enthaltenen Tabellenblättern konsolidiert.
Nun möchte ich aber, dass nicht alle Tabellenblätter zusammengeführt werden, sondern jeweils nur das erste Tabellenblatt jeder einzelnen Datei.
Könnt ihr mir bitte helfen?
Hier ist der Code:

Sub Dateien_zusammenfuehren()
'Führt alle Tabellenblätter der ausgewählten Excel-Dateien in dieser Arbeitsmappe zusammen
Dim wbQuelle As Workbook
Dim sh As Worksheet
Dim arrdateien As Variant
Dim cntDatei As Long
'Screenupdating deaktivieren
Application.ScreenUpdating = False
'Benutzer Dateien auswählen lassen
arrdateien = Application.GetOpenFilename(filefilter:="Excel-Dateien (*.xlsx),*.xlsx", MultiSelect:=True)
'Wurde mindestens eine Datei ausgewählt?
If IsArray(arrdateien) Then
'Schleife über alle ausgewählten Dateien
For cntDatei = 1 To UBound(arrdateien)
'Aktuelle Arbeitsmappe öffnen
Set wbQuelle = Workbooks.Open(Filename:=arrdateien(cntDatei), UpdateLinks:=False, ReadOnly:=True)
'Schleife über alle Tabellenblätter
For Each sh In wbQuelle.Worksheets
'Aktuelles Tabellenblatt kopieren
sh.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next sh
'Aktuelle Arbeitsmappe schließen
wbQuelle.Close savechanges:=False
Next cntDatei
End If
'Screenupdating aktivieren
Application.ScreenUpdating = True
'Bereitgestellt von VBATrainer: www.vbatrainer.de
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateien zusammenführen
06.07.2022 06:30:00
Oberschlumpf
Moin,
änder diesen Code...

For Each sh In wbQuelle.Worksheets
'Aktuelles Tabellenblatt kopieren
sh.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Next sh
...um in...

wbQuelle.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
Der Code, den du ändern sollst - For Each usw... - ist in diesem Fall eine Schleife, die aus der gerade geöffneten Datei - alle! - Tabellenblätter kopiert und in deine Datei einfügt.
Der neue Code kopiert aus der jeweils geöffneten Datei - nur Tabellenblatt 1 - und fügt dieses jeweils am Ende deiner Datei ein.
Hilfts?
Ciao
Thorsten
Anzeige
AW: Dateien zusammenführen / Zusatzfrage
06.07.2022 10:52:23
Kisska
Hallo Thorsten,
herzlichen Dank für die prompte Antwort und super Erklärung! Es funktioniert genau wie gewünscht :-)
Ich habe eine Zusatzfrage:
Gibt es die Möglichkeit bei den neu einkopierten Tabellenblättern den Tabellennamen per Abfrage zu definieren? Diese sollen den gleichen vordefinierten Namen bekommen, der dann durch "_Nr" erweitert wird, wobei Nr. fortlaufend gezählt werden soll ab 01.
Beispiel: Beim Ausführen des Codes markiere ich 3 Quelldateien, dann kommt die Abfrage zur Definition der Tabellennamen und ich tippe "Bereich" ein. Ergebnis: Ich bekomme zu den bereits vorhanden Tabellenblättern in meiner Zieldatei folgende drei neue: Bereich_01, Bereich_02, Bereich_03.
Viele Grüße
Kisska
Anzeige
AW: Dateien zusammenführen / Zusatzfrage
06.07.2022 11:11:34
Oberschlumpf
Hi,
(ungetestet)
schreib im DIM-Bereich zusätzlich...

Dim lstrDefi As String, liDefi As Integer
schreib unterhalb von...

If IsArray(arrdateien) Then
...diesen Code...

lstrDefi = InputBox("Wie sollen die neuen Blätter heißen?", "Bereich", "Abfrage zur Definition der Tabellennamen")
If lstrDefi = "" Then Exit Sub 'die InputBox wurde mit Klick auf "Abbrechen" geschlossen
liDefi = 1
schreib unterhalb von...

wbQuelle.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
...diesen Code...

ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = lstrDefi & "_" & Format(liDefi, "00")
Hilfts?
Ciao
Thorsten
Anzeige
AW: Dateien zusammenführen / Zusatzfrage - Fehler
06.07.2022 12:04:45
Kisska
Hallo Thorsten,
danke für deine Antwort!
Leider tritt der Laufzeitfehler 1004 auf: Anwendungs- oder objektdefinierter Fehler.
Der Name wird nur bei dem ersten Tabellenblatt richtig vergeben. Zudem wird nur ein zweites Tabellenblatt ergänzt mit dem Originalnamen. Weitere Tabellenblätter werden nicht ergänzt, da ein Fehler auftritt "Dieser Name wird bereits verwendet. Verwenden Sie einen anderen.", dabei bleibt die Quelldatei geöffnet.
Viele Grüße
Margarita
AW: Dateien zusammenführen / Zusatzfrage - Fehler
06.07.2022 12:10:08
Oberschlumpf
Hi Margarita,
und warum zeigst du per Upload nicht mal Bsp-Dateien mit Bsp-Daten?
was für Dateien können helfen?
- deine Datei mit dem Makro, in dem alles in neuen Blättern gesammelt werden soll
- 2-3 "Einzel-Dateien", aus denen jeweils Tabelle1 kopiert + in Datei mit Makro eingefügt werden soll
Ciao
Thorsten
Anzeige
AW: Dateien zusammenführen / Zusatzfrage - Fehler
06.07.2022 12:51:42
Oberschlumpf
Hi Margarita,
Bsp-Dateien ohne Bsp-Daten?
Ok, in diesem Fall kann ich damit noch leben.
Aber deine Zieldatei ohne Makro?
Ja klar, (fast) kein Problem, du kannst es dir ruhig einfach machen - aber du musst es für mich nich schwerer machen.
nun muss ich ja erst mal deinen Code von hier/meine Codeideen in der Zieldatei zusammenbringen..irgdwie.
Da musst du dich ein wenig gedulden.
Bis später
Thorsten
Anzeige
AW: Dateien zusammenführen / Zusatzfrage - Fehler
06.07.2022 12:57:24
Kisska
Hallo Thorsten,
was genau meinst du ? Der VBA-Code ist doch im Tabellenblatt (Tabelle1) enthalten.
Zu den Quelldateien: Der Inhalt ist irrelevant, daher sind keine Daten enthalten. Es geht bloß um das Einkopieren des ganzen Tabellenblatts der jeweiligen Quelldatei. Selbst ohne Daten tritt der vorher genannte Fehler auf.
Viele Grüße
Margarita
uppss..sorry
06.07.2022 13:00:37
Oberschlumpf
Hi,
ja, hast recht - code is enthalten!
Sorry, da ich keine BSP-Daten fand, hatte ich versäumt, im VBE nachzugucken, ob Code vorhanden, sondern einfach unterstellt, es sei keiner da...sorry.
Dauert trotzdem etwas, da ich gerad mit was anderem angefangen hab.
Ciao
Thorsten
Anzeige
AW: uppss..sorry
06.07.2022 13:07:13
Kisska
Kein Problem! Ich warte.
Danke für deine Unterstützung die Zeit!
VG
Margarita
AW: uppss..sorry
06.07.2022 14:59:27
Oberschlumpf
Hi Margarita,
so, hier deine Makro-Datei zurück
https://www.herber.de/bbs/user/154020.xlsm
Der Grund für den bei dir passierten Fehler war, dass ich vergaß, nach jedem Blatt-Kopiervorgang die Variable liDefi um 1 zu erhöhen.
(so was passiert, wenn man nix zum Testen hat)
Ein weiterer Fehler - wäre - passiert, wenn...
Stell dir vor, du hast einen Durchlauf mit Blättern "Bereich_01", "Bereich_02" + "Bereich_03" hinter dir.
Jetzt startest du das Makro erneut.
Mit dem alten Code hätte nächstes, neues Tabellenblatt wieder den Namen "Bereich_01" erhalten = Fehler, weil "Bereich_01" gibts ja schon wegen des 1. Durchlaufs.
Ich hab eine Kontrolle eingebaut, die sozusagen vor der Namensvergabe erstmal die nächste freie BlattNr, in diesem Fall also "Bereich_04" ermittelt.
Jetzt sollte es aber laufen, oder?
Ciao
Thorsten
Anzeige
fast perfekt
06.07.2022 16:04:03
Kisska
Hallo Thorsten,
das Ergebnis sieht toll aus! Danke für die Erklärung!
Nur eine Kleinigkeit ... falls es dich nicht zu viel Zeit kostet.
Wenn ich den Code erneut ausführe und ich bspw. das erste Tabellenblatt aktiviert habe, dann wird nur das erste neue Tabellenblatt wie gewünscht ans Ende gesetzt, alle anderen nachfolgenden Blätter werden nach dem ersten Tabellenblatt gesetzt.
Kann man alle neu hinzukommende Tabellenblätter immer an das Ende setzen?
VG
Marrgarita
AW: fast perfekt
06.07.2022 16:29:40
Oberschlumpf
Hi,
ähh? In der mir vorliegenden Testdatei (Makro) inkl der 3 anderen Dateien (ohne Makro) funktioniert alles wie gewünscht.
Guckst du, Makro wurde noch nicht gestartet...
Userbild
...Makro wurde das 1. Mal gestartet...
Userbild
...Makro wurde das 2. Mal gestartet...
Userbild
...Makro wurde das 3. Mal gestartet, diesmal auch mit anderem Blattnamen...
Userbild
Vor jedem erneuten Makrostart wurde immer ein anderes Blatt aktiviert, nie das letzte.
Und der Befehl...

wbQuelle.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
...macht auch alles richtig:
ein neues Blatt wird immer hinter (after:=) das letzte aller Blätter (ThisWorkbook.Sheets.Count) eingefügt.
Daher wüsst ich jetzt nicht, was in den Testdateien falsch ist - bin natürlich nicht sicher (weil ich diese nicht kenne), vermute aber, in deiner Originaldatei passt irgdwas noch nicht.
Ciao
Thorsten
Anzeige
Danke!
12.07.2022 21:15:02
Kisska
Hallo Thorsten,
sorry, konnte mich nicht eher melden.
Dein Code funktioniert doch einwandfrei. Keine Ahnung, warum es bei dem einen Mal schief gelaufen ist.
Vielen lieben Dank für deine Hilfe und einen schönen Abend noch
Margarita

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige