Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung VB for Applications

Mitglied: CarlosGamle

CarlosGamle (Level 1) - Jetzt verbinden

09.09.2009, aktualisiert 13:43 Uhr, 17335 Aufrufe, 18 Kommentare

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
Mitglied: 76109
09.09.2009 um 14:04 Uhr
Hallo CarlosGamle!

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

Gruß Dieter
Bitte warten ..
Mitglied: CarlosGamle
09.09.2009 um 21:43 Uhr
Hallo Dieter,

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

Grüße,
Carlos
Bitte warten ..
Mitglied: 76109
10.09.2009 um 08:22 Uhr
Hallo CarlosGamle!

Yep, aber ein paar kleine Info's fehlen noch

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
Bitte warten ..
Mitglied: CarlosGamle
10.09.2009 um 08:45 Uhr
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
Bitte warten ..
Mitglied: 76109
10.09.2009 um 09:02 Uhr
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 gerne

Gruß Dieter
Bitte warten ..
Mitglied: 76109
10.09.2009 um 11:05 Uhr
Hallo CarlosGamle!

Hier mal ein Entwurf:
01.
Option Explicit 
02.
 
03.
Const ImportDatei = "Name der Leer-Datei" 
04.
Const StartOrdner = "Pfad des Start-Ordners" 
05.
 
06.
Sub SheetsImport() 
07.
    Dim Dlg As FileDialog, Wks As Worksheet, i As Integer 
08.
 
09.
    Set Wks = Workbooks(ImportDatei).Sheets(1):  Wks.Cells.Clear 
10.
     
11.
    Set Dlg = Application.FileDialog(msoFileDialogOpen) 
12.
     
13.
    Dlg.InitialFileName = StartOrdner 
14.
    Dlg.Filters.Add "Excel Dateien", "*.xls", 1 
15.
     
16.
DlgNext: 
17.
    If Dlg.Show = False Then Exit Sub 
18.
     
19.
    For i = 1 To Dlg.SelectedItems.Count 
20.
        Call SheetsInsert(Wks, Dlg.SelectedItems(i)) 
21.
    Next 
22.
     
23.
    GoTo DlgNext 
24.
End Sub 
25.
 
26.
Private Sub SheetsInsert(ByRef Wks, ByRef Path) 
27.
    Dim xWkb As Workbook, xWks As Worksheet, NextLine As Integer 
28.
     
29.
    Application.ScreenUpdating = False 
30.
     
31.
    Set xWkb = Workbooks.Open(Path):  Set xWks = xWkb.Sheets(1) 
32.
     
33.
    NextLine = Wks.Cells(Wks.Rows.Count, "A").End(xlUp).Row 
34.
     
35.
    If NextLine > 1 Then NextLine = NextLine + 1 
36.
     
37.
    xWks.Rows("3:" & xWks.Cells(xWks.Rows.Count, "A").End(xlUp).Row).Copy 
38.
    Wks.Rows(NextLine).Insert Shift:=xlDown 
39.
     
40.
    Application.CutCopyMode = False:  xWkb.Saved = True:  xWkb.Close 
41.
     
42.
    Application.ScreenUpdating = True 
43.
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:
01.
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]
Bitte warten ..
Mitglied: CarlosGamle
10.09.2009 um 20:22 Uhr
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
Bitte warten ..
Mitglied: 76109
10.09.2009 um 22:38 Uhr
Hallo CarlosGamle!

Scheinbar hast Du den Rest nach dem Code nicht richtig gelesen

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
Bitte warten ..
Mitglied: CarlosGamle
11.09.2009 um 16:15 Uhr
Hallo Dieter,

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

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?
Bitte warten ..
Mitglied: 76109
11.09.2009 um 19:42 Uhr
Hallo CarlosGamle!

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

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:
01.
Const ImportDatei = "Makro-Test.xls" 
02.
Const StartOrdner = "C:\Dokumente und Einstellungen\GeroldB\Eigene Dateien\Excel Test\*" 
Sollte jetzt unabhängig vom aktiven Fenster funktionieren.

Gruß Dieter
Bitte warten ..
Mitglied: CarlosGamle
11.09.2009 um 23:55 Uhr
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...

Guts nächtle,
Carlos
Bitte warten ..
Mitglied: 76109
12.09.2009 um 08:49 Uhr
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 mitteilen

Gruß Dieter
Bitte warten ..
Mitglied: CarlosGamle
12.09.2009 um 12:26 Uhr
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!!!

Wie muss das Makro angepasst werden?

Freue mich schon...

Grüße und einen schönen Samstag,
Carlos
Bitte warten ..
Mitglied: 76109
12.09.2009 um 13:22 Uhr
Hallo Carlos!

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

Grüße und ein schönes WE

Dieter
Bitte warten ..
Mitglied: 76109
12.09.2009 um 15:46 Uhr
Hallo Carlos!

Hier der neue Makro-Code:
01.
Option Explicit 
02.
 
03.
Const HomeDatei = "LeereArbeitsmappe.xls" 'Name Arbeitsmappe Makro-Excel-Datei 
04.
Const HomeDaten = "Daten-Import"          'Name Tabellenblatt Daten-Import 
05.
Const HomeListe = "Datei-Liste"           'Name Tabellenblatt Datei-Liste 
06.
Const HomeZeile = 3                       'Erste Zeile Einfügen 
07.
Const CopyZeile = 3                       'Erste Zeile Kopieren 
08.
Const ListDatei = "A1"                    'Zelle erster Dateiname 
09.
 
10.
Const ErrMsg = "Abbruch! Datei existiert nicht: " 
11.
 
12.
Sub SheetsImport() 
13.
    Dim WksHome As Worksheet, WksList As Worksheet, EndLine As Integer, NextLine As Integer 
14.
    Dim WkbCopy As Workbook, WksCopy As Worksheet, Fso As Object, File As Object 
15.
     
16.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
17.
     
18.
    Set WksHome = Workbooks(HomeDatei).Sheets(HomeDaten) 
19.
    Set WksList = Workbooks(HomeDatei).Sheets(HomeListe) 
20.
    
21.
    EndLine = GetEndLine(WksHome):  NextLine = HomeZeile 
22.
     
23.
    If EndLine >= HomeZeile Then WksHome.Rows("3:" & EndLine).Cells.Clear 
24.
     
25.
    Application.ScreenUpdating = False 
26.
     
27.
    For Each File In WksList.Range(ListDatei).CurrentRegion 
28.
        If Fso.FileExists(File) = False Then 
29.
            Application.ScreenUpdating = True 
30.
            MsgBox ErrMsg & File, vbExclamation, "Fehler":  Exit Sub 
31.
        End If 
32.
     
33.
        Set WkbCopy = Workbooks.Open(File):  Set WksCopy = WkbCopy.Sheets(1) 
34.
     
35.
        EndLine = GetEndLine(WksCopy) 
36.
     
37.
        If EndLine >= CopyZeile Then 
38.
            WksCopy.Rows("3:" & EndLine).Copy 
39.
            WksHome.Rows(NextLine).Insert Shift:=xlDown 
40.
            Application.CutCopyMode = False 
41.
            WkbCopy.Saved = True:  WkbCopy.Close 
42.
            NextLine = GetEndLine(WksHome) + 1 
43.
        End If 
44.
    Next 
45.
    Application.ScreenUpdating = True 
46.
End Sub 
47.
 
48.
Private Function GetEndLine(ByRef Wks) As Integer 
49.
    GetEndLine = Wks.Cells(Wks.Rows.Count, "A").End(xlUp).Row 
50.
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 funktioniert

Gruß Dieter
Bitte warten ..
Mitglied: CarlosGamle
13.09.2009 um 00:30 Uhr
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
Bitte warten ..
Mitglied: 76109
13.09.2009 um 09:34 Uhr
Hallo Carlos!

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

Auch Dir noch einen schönen Sonntag.

Gruß Dieter
Bitte warten ..
Mitglied: Mr-Lanzelot
03.05.2012 um 14:14 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Microsoft Office
gelöst CSV-Datei mit einem VBA Makro in Excel einlesen und leicht anpassen (5)

Frage von JoSiBa zum Thema Microsoft Office ...

Microsoft Office
gelöst Excel-Formel oder VBA (7)

Frage von nicki01 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...