carlosgamle
Goto Top

Mehrere Excel ToDo Listen per VBA bzw Makro zusammenführen?

Ich benötige Hilfe, um mehrere Excel ToDo Listen per VBA bzw Makro zusammenführen.

Hallo zusammen,

mein Problem ist folgendes:
Ich möchte einige ToDo Listen, die immer den gleichen Aufbau haben, in einer Excelliste bei Bedarf zusammenführen. Leider bin ich in VBA Programmierung nicht fit und hoffe daher auf eure Untestützung.

Ich stelle es mir so vor, dass ich eine leere To Do ExcelDatei nehme, dort ein Makro ausführe und dann die einzelnen Punkte aus den verschiedenen Dateien zusammengeführt werden.
Das Makro sollte in den ToDo Listen immer ab Zeile 3 auslesen, soweit dieses Arbeitsblatt gefüllt ist. Das Makro muss in den Dateien nicht mehrere Reiter durchsuchen.
Die ausgelesenen Daten sollen dann untereinander in die leere ToDo Liste geschrieben werden.

Ich glaube bis da ist es nicht so schwer. Nur sind die Dateien die ausgelesen werden in unterschiedlichen Ordnern... Es muss also eine Möglichkeit geben, dass ich im Makrotext sämtliche Dateien die ausgelesen werden sollen, eingeben kann. Ich denke es werden etwa 10 Dateien sein.

Was meint ihr? Ist da etwas möglich?
Würde mich rießig über Lösungsvorschläge freuen.

Viele Grüße,
Carlos

Content-Key: 124561

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

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: 76109
76109 09.09.2009 um 14:04:50 Uhr
Goto Top
Hallo CarlosGamle!

Was sind ToDo-Listen? Sind das *.xls oder *.csv oder *.txt-Dateien und gegebenfalls mit Trennzeichen?

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 09.09.2009 um 21:43:31 Uhr
Goto Top
Hallo Dieter,

es sind *xls Dateien, also ganz normale Excel Dateien. Hast Du eine Idee wie es funktionieren kann?

Grüße,
Carlos
Mitglied: 76109
76109 10.09.2009 um 08:22:45 Uhr
Goto Top
Hallo CarlosGamle!

Yep, aber ein paar kleine Info's fehlen nochface-smile

Ist es in den einzelnen Arbeitsmappen immer das 1.Tabellenblatt (Zeile3 bis)? Spalten von bis?

Wie soll der Ablauf in der Arbeitsmappe mit dem Makro sein? Sollen die Daten:
Nach einem Import In eine neue Datei gesichert werden?
oder
Vor einem neuen Import gelöscht werden?
oder
Bei einem neuen Import angefügt werden?

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 10.09.2009 um 08:45:06 Uhr
Goto Top
Hallo Dieter,

es ist immer und nur das 1. Tabellenblatt.
Es ist immer von Zeile 3. Das bis ist variabel. Perfekt wäre es, wenn man definieren könnte, dass es bis zur ersten Zeile geht in der die Spalte A leer ist.

Also der Import der Daten aus den verschiedenen Exceldateien soll in eine separate Datei erfolgen. In diese Datei sollen die Inhalte der verschiedenen Exceldateien "kopiert" werden. Die Inhalte der verschiedenen Exceldateien soll somit nicht verändert werden.

Wir in der separaten Datei der Import wiederholt, sollte idealerweise zuvor die Daten in der separaten Datei gelöscht werden und anschließend neu aus den verschiedenen Exceldateien importiert werden.

Grüße,
Carlos
Mitglied: 76109
76109 10.09.2009 um 09:02:07 Uhr
Goto Top
Hallo CarlosGamle!

OK, soweit ist alles klar.

Jetzt bleibt noch die Möglichkeit, dass Du das Makro z.B. per Tastenkombination startest oder das das Makro beim öffnen der Arbeitsmappe automatisch den Inhalt löscht und einen neuen Import startet. Wie hättest Du's gerneface-smile

Gruß Dieter
Mitglied: 76109
76109 10.09.2009 um 11:05:40 Uhr
Goto Top
Hallo CarlosGamle!

Hier mal ein Entwurf:
Option Explicit

Const ImportDatei = "Name der Leer-Datei"  
Const StartOrdner = "Pfad des Start-Ordners"  

Sub SheetsImport()
    Dim Dlg As FileDialog, Wks As Worksheet, i As Integer

    Set Wks = Workbooks(ImportDatei).Sheets(1):  Wks.Cells.Clear
    
    Set Dlg = Application.FileDialog(msoFileDialogOpen)
    
    Dlg.InitialFileName = StartOrdner
    Dlg.Filters.Add "Excel Dateien", "*.xls", 1  
    
DlgNext:
    If Dlg.Show = False Then Exit Sub
    
    For i = 1 To Dlg.SelectedItems.Count
        Call SheetsInsert(Wks, Dlg.SelectedItems(i))
    Next
    
    GoTo DlgNext
End Sub

Private Sub SheetsInsert(ByRef Wks, ByRef Path)
    Dim xWkb As Workbook, xWks As Worksheet, NextLine As Integer
    
    Application.ScreenUpdating = False
    
    Set xWkb = Workbooks.Open(Path):  Set xWks = xWkb.Sheets(1)
    
    NextLine = Wks.Cells(Wks.Rows.Count, "A").End(xlUp).Row  
    
    If NextLine > 1 Then NextLine = NextLine + 1
    
    xWks.Rows("3:" & xWks.Cells(xWks.Rows.Count, "A").End(xlUp).Row).Copy  
    Wks.Rows(NextLine).Insert Shift:=xlDown
    
    Application.CutCopyMode = False:  xWkb.Saved = True:  xWkb.Close
    
    Application.ScreenUpdating = True
End Sub

Der Ablauf:
Beim Starten wird ein File-Dialog mit dem Datei-Typ *.xls angezeigt. Der Code wird solange ausgeführt, wie eine oder mehrere Dateien mit Öffnen bestätigt wird. Mit Abbrechen, wird das Makro beendet.

Wenn's automatisch laufen soll, dann Zeile 1 ändern in:
Private Sub Workbook_Open()
und in diese Arbeitsmappe kopieren. Ansonsten in ein Modul.

In Zeile 3 den Namen der leeren Excel-Datei angeben z.B. "Import.xls"
In Zeile 4 den Pfad des Start-Ordners angeben z.B. "C:\Test\*"

Und falls Du noch sortieren möchtest, dann Sort-Anweisung in Zeile 24 einfügen.

Gruß Dieter

[edit] Letzte Änderung am 11.09. um 23:00 Uhr [/edit]
Mitglied: CarlosGamle
CarlosGamle 10.09.2009 um 20:22:43 Uhr
Goto Top
Hallo Dieter,

werde es morgen im Geschäft testen und dann Feedback geben.

Ist es richtig, dass ich in Zeile 8 den Namen der Exceldatei reinschreibe, aus welcher das Makro rauskopieren soll, oder? Gebe ich dort den gesamten Pfad ein? Da es mehrere Dateien sind, wie gebe ich das ein? Einfach durch KOMMA und die nächste Datei in "" ?

Bis dann,
Carlos
Mitglied: 76109
76109 10.09.2009 um 22:38:07 Uhr
Goto Top
Hallo CarlosGamle!

Scheinbar hast Du den Rest nach dem Code nicht richtig gelesenface-smile

Beim Starten wird ein Datei Öffnen-Dialog angezeigt, indem Du den Ordner und die entsprechenden *.xls-Dateien auswählen kannst. Der Dialog wird nach jedem Kopiervorgang erneut geöffnet und erst beim betätigen des Button <Abbrechen>, wird das Makro beendet.

Im Code Zeile 9 (neu hinzugefügt) kann nach entfernen des Kommentarzeichens ' der Start Ordner-Pfad angegeben werden. Beispiel: C:\Test als "C\Test\*"

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 11.09.2009 um 16:15:05 Uhr
Goto Top
Hallo Dieter,

wie gesagt, ich bin nicht wirklich fit in Makroprogrammierung und kann es daher auch nicht wirklich so lesen face-wink

Ich habe es nun getestet und es hat nicht funktioniert, zumindest nicht so wie ich es mir gedacht hatte.

Ich habe folgendes gemacht:
1. habe ich 2 Testdateien die ausgelesen werden sollen einem Ordner unter "Eigene Dateien" angelegt (Markro-Test1.xls und Makro-Test2.xls)
2. habe ich auf dem Desktop eine leere Exceldatei (Makro-Test.xls) aufgemacht, in die die Daten kopiert werden sollen.
3. habe ich den Code in die leere Exceldatei geladen (neues Modul,...) An dem Code habe ich nur Zeile 9 wie folgt angepasst: >>'Dlg.InitialFileName = "C:\Dokumente und Einstellungen\GeroldB\Eigene Dateien\Excel Test"<<
4. habe ich das Makro ausgeführt
5. Daraufhin ist Datei öffnen aufgegangen und ich habe die erste Datei (Makro-Test1.xls) ausgewählt.
6. Fragedialog: Sollen ihre Änderungen in Makro-Test1.xls gespeichert werden?
7. ich habe JA geklickt.
8. anschließend mit den weiteren testdateien genauso verfahren
9. am schluss dann auf abbrechen bei datei öffnen

meine leere Exceldatei (Makro-Test.xls) ist leider leer geblieben... In den beiden anderen war jeweils die gefüllten Zeilen unten nochmals dran kopiert...!??

Ich hatte es mir so vorgestellt, dass die Inhalte der Dateien Markro-Test1.xls und Makro-Test2.xls in meine leere Datei Markro-Test.xls die leer ist und in der ich das Makro ausgeführt habe reinkopiert werden.

Was habe ich falsch gemacht?
Mitglied: 76109
76109 11.09.2009 um 19:42:23 Uhr
Goto Top
Hallo CarlosGamle!

Wahrscheinlich war die leere Excel-Datei nicht das aktive Fenster. Indem Fall funktioniert das Makro nicht korrektface-smile

Dieser Fehler kann nur ausgeschlossen werden, indem das Makro entweder automatisch über die Workbook-Open-Funktion ausgeführt wird oder explizit der Name des leeren Excel-Sheets festgelegt wird. Letzteres habe ich im geänderten Code jetzt mit eingebunden (Zeile 3).

In Zeile 3 den Namen der leeren Arbeitsmappe und in Zeile 4 den Pfad des Start-Ordners angeben:
Const ImportDatei = "Makro-Test.xls"  
Const StartOrdner = "C:\Dokumente und Einstellungen\GeroldB\Eigene Dateien\Excel Test\*"   

Sollte jetzt unabhängig vom aktiven Fenster funktionieren.

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 11.09.2009 um 23:55:30 Uhr
Goto Top
Hallo Dieter,
perfekt - jetzt hab ich es!!! Danke schon mal soweit...!

Ich hätte noch 2 Verbesserungsfragen:
1. Ist es möglich zu definieren, dass in der leer, datei auch erst in zeile 3 angefangen wird zu befüllen?
2. ist es möglich im code zu hinterlegen welche dateien ausgelesen werden sollen? dadurch würde ich es mir ersparen immer die dateien auszuwählen... wenn sich eine datei ändert (raus oder hinzu kommt), könnte ich dies ja dann wieder im code anpassen...
dann wäre es perfekt... face-smile

Guts nächtle,
Carlos
Mitglied: 76109
76109 12.09.2009 um 08:49:32 Uhr
Goto Top
Guten Morgen Carlos!

Zu 1. - Soll in den Zeilen 1-2 was drinstehen?
Zu 2. - Befinden sich die Import-Excel-Dateien alle im gleichen Ordner?

Falls ja, wäre es wesentlich einfacher, Du würdest im Datei-Öffnen-Dialog alle entsprechenden Dateien auf einmal markieren und gegebenenfalls nach dem Import sortieren oder per VBA-Code sortieren lassen.

Ansonsten kannst Du in der leeren Excel-Datei schon mal ein 2. Tabellenblatt einfügen und einen Tabellennamen für die Tabelle <Import-Daten> und die Tabelle <Datei-Liste> festlegen. Letzteres kann nach den entsprechenden Einträgen auch ausgeblendet werden.

Bei gleichem Ordner, könnte die Tabelle Datei-Liste so aussehen:
A B
1 Ordner: z.B. C:\Test\
2
3 Dateien: z.B. Test1.xls
4 z.B. Test2.xls
5 usw.
oder:
A
1 Pfad Import-Datei1
2 Pfad Import-Datei2
3 usw.

Die Tabellennamen und wo in Datei-Liste was drinsteht musst Du mir natürlich mitteilenface-smile

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 12.09.2009 um 12:26:08 Uhr
Goto Top
Hallo Dieter,

1. genau, in den ersten beiden Zeilen wird bzw. würde ich gerne fest etwas reinschreiben.

2. Genau das ist der Grund, dass ich es nicht über Datei öffnen machen möchte, da die Dateien in unterschiedlichsten Ordnern stehen. Somit wäre es die "oder:"Variante mit den Pfaden. Ich werde das leere Excel Sheet dann so aufbauen, dass der erste Reiter <Import-Daten> heißt und der zweite Reiter (Tabellenblatt <Datei-Liste> heißt. In die Dateiliste werde ich dann in die Spalte A (ab A1) die Dateinamen mit dem entsprechenden Pfad eingeben.

Das Hört sich perfekt an!!! face-smile

Wie muss das Makro angepasst werden?

Freue mich schon...

Grüße und einen schönen Samstag,
Carlos
Mitglied: 76109
76109 12.09.2009 um 13:22:56 Uhr
Goto Top
Hallo Carlos!

OK. Das Makro kann nicht angepasst werden, d.h. ich muss ein neues schreiben. Das kriegst Du aber heute nochface-smile

Grüße und ein schönes WE

Dieter
Mitglied: 76109
76109 12.09.2009 um 15:46:15 Uhr
Goto Top
Hallo Carlos!

Hier der neue Makro-Code:
Option Explicit

Const HomeDatei = "LeereArbeitsmappe.xls" 'Name Arbeitsmappe Makro-Excel-Datei  
Const HomeDaten = "Daten-Import"          'Name Tabellenblatt Daten-Import  
Const HomeListe = "Datei-Liste"           'Name Tabellenblatt Datei-Liste  
Const HomeZeile = 3                       'Erste Zeile Einfügen  
Const CopyZeile = 3                       'Erste Zeile Kopieren  
Const ListDatei = "A1"                    'Zelle erster Dateiname  

Const ErrMsg = "Abbruch! Datei existiert nicht: "  

Sub SheetsImport()
    Dim WksHome As Worksheet, WksList As Worksheet, EndLine As Integer, NextLine As Integer
    Dim WkbCopy As Workbook, WksCopy As Worksheet, Fso As Object, File As Object
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Set WksHome = Workbooks(HomeDatei).Sheets(HomeDaten)
    Set WksList = Workbooks(HomeDatei).Sheets(HomeListe)
   
    EndLine = GetEndLine(WksHome):  NextLine = HomeZeile
    
    If EndLine >= HomeZeile Then WksHome.Rows("3:" & EndLine).Cells.Clear  
    
    Application.ScreenUpdating = False
    
    For Each File In WksList.Range(ListDatei).CurrentRegion
        If Fso.FileExists(File) = False Then
            Application.ScreenUpdating = True
            MsgBox ErrMsg & File, vbExclamation, "Fehler":  Exit Sub  
        End If
    
        Set WkbCopy = Workbooks.Open(File):  Set WksCopy = WkbCopy.Sheets(1)
    
        EndLine = GetEndLine(WksCopy)
    
        If EndLine >= CopyZeile Then
            WksCopy.Rows("3:" & EndLine).Copy  
            WksHome.Rows(NextLine).Insert Shift:=xlDown
            Application.CutCopyMode = False
            WkbCopy.Saved = True:  WkbCopy.Close
            NextLine = GetEndLine(WksHome) + 1
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Private Function GetEndLine(ByRef Wks) As Integer
    GetEndLine = Wks.Cells(Wks.Rows.Count, "A").End(xlUp).Row  
End Function

Anmerkung:
In der Zeile 3 den Namen Deiner leeren Excel-Datei festlegen.
Im Tabellenblatt <Import-Daten> können die Zeilen 1-2 nach belieben beschriftet werden.
Existiert eine Datei nicht, dann wird der Vorgang abgebrochen und eine Fehlermeldung ausgegeben.
Die Datei-Pfade in <Datei-Liste> müssen untereinander ohne Leerzeilen eingetragen werden.

Hoffe, das es bei Dir auch funktioniertface-smile

Gruß Dieter
Mitglied: CarlosGamle
CarlosGamle 13.09.2009 um 00:30:06 Uhr
Goto Top
Hallo Dieter,

Hammer - es funktioniert!!! Perfekt...! Vielen, vielen Dank!
Bist Du zufällig bei Xing (www.xing.com)? Falls ja würde ich Dich gerne meinen Kontakten hinzufügen.

Viele Grüße und ein schönes Restwochenende,
Carlos
Mitglied: 76109
76109 13.09.2009 um 09:34:06 Uhr
Goto Top
Hallo Carlos!

Super, da funktioniert ja mal wasface-smile Und Nö, bin leider nicht bei Xing registriert.

Auch Dir noch einen schönen Sonntag.

Gruß Dieter
Mitglied: Mr-Lanzelot
Mr-Lanzelot 03.05.2012 um 14:14:06 Uhr
Goto Top
Hallo,

das Makro ist echt gut.

Wie würde aber nun der Code aussehen, wenn man nicht einzelne Quelldateien (also mehrere Datei-Pfade), sondern lediglich ein Quellverzeichnis angeben möchte?

Besten Dank für die Antwort.

Gruß,
L.