michelle1995
Goto Top

Excel: Makro soll mehrer Dateien auslesen und in einer neuen Datei zusammenfassen

Hallo zusammen,

ich suche ein Makro, mit dem ich aus mehreren Exceltabellen, die alle in einem Verzeichnis liegen, die Daten auslesen und in einer neuen Datei neu strukturiert abspeichern kann.

Ich habe schon viele Makros dazu im Netz gefunden und probiert, aber keins passt auf meine Anforderungen. Ich stecke in der VBA Programmierung leider nicht so tief drin, dass ich die bestehenden Lösungen umschreiben könnte, daher hier meine Bitte um Hilfe.

Die einzulesenden Dateien sind von der Struktur alls so aufgebaut:

Name | Müller
Vorname | Bernd
Personalnummer | 123585
Standort | Hamburg

Das Zeichen | ist dabei nur als Kennzeichen hier für eine neue Spalte. Die Parameterbezeichnung und die Werte stehen also in getrennten Spalten nebeneinander.

In der neuen Datei sollen die Daten so abgelegt werden:

Name | Vorname | Personalnummer | Standort

darunter dann jeweils die Werte aus den einzelnen Tabellen

Kann mir dazu jemand ein Makro empfehlen? Wenn man mir sagt wie, dann schreibe ich es auch gern um, dass die richtigen Spalten angesprochen werden.

Vielen Dank.

LG

Michelle

Content-Key: 342908

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

Printed on: April 26, 2024 at 11:04 o'clock

Mitglied: 133417
133417 Jul 09, 2017, updated at Jul 13, 2017 at 10:18:44 (UTC)
Goto Top
Einfach mal den Link unter deinem Thread angesehen minimal angepasst indem man in die Doku schaut, dann wäre das eigentlich schnell erledigt gewesen...
Sub MergeWorksheets()
    Const FOLDER = "D:\daten"  
    Dim sh As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With ThisWorkbook.Sheets(1)
        file = Dir(FOLDER & "\*.xlsx")  
        While file <> ""  
            set sh = GetObject(FOLDER & "\" & file).Sheets(1)  
               sh.Range("B1:B4").Copy  
         .Cells(Rows.Count,"A").End(xlUp).Offset(1,0).pasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True  
            sh.Parent.Close False
            file = Dir()
        Wend
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Gruß
Member: Michelle1995
Michelle1995 Jul 09, 2017 at 20:04:58 (UTC)
Goto Top
Danke für den Hinweis aber welchen Link denn?
Mitglied: 133417
133417 Jul 10, 2017 updated at 15:15:22 (UTC)
Goto Top
Zitat von @Michelle1995:

Danke für den Hinweis aber welchen Link denn?
Unter "Ähnliche Inhalte" der erste Beitrag.
VBA Excel Dateien zusammenfassen

Wenns das dann war bitte noch als gelöst markieren.
Member: Michelle1995
Michelle1995 Jul 10, 2017 at 18:09:34 (UTC)
Goto Top
Vielen Dank. Das habe ich jetzt erst gesehen.

Der Quelltext von Dir lief auf einen Fehler, als ich dann auf den Link klickte, fand ich noch diesen Quelltext

Sub collectSheets()
On Error GoTo damn
  Dim ap As Excel.Application
  Dim wb As Excel.Workbook
  Dim sz As Excel.Worksheet
  Dim strPath As String, strFile As String
  Dim nextRow As Long

  strPath = "C:\Users\Excel_VBA\"  
  strFile = Dir(strPath)
  
  ' Ziel (current WB)  
  Set sz = ActiveWorkbook.ActiveSheet
  
  Set ap = CreateObject("Excel.Application")  
  
  nextRow = 1
  Do Until strFile = ""  
    Set wb = ap.Workbooks.Open(Filename:=strPath & strFile, ReadOnly:=True)
    wb.Sheets("Tabelle1").UsedRange.Copy  
    sz.Cells(nextRow, 1).PasteSpecial (xlPasteValues)
    
    Application.DisplayAlerts = False
    wb.Close
    Application.DisplayAlerts = True

    nextRow = sz.Cells.SpecialCells(xlLastCell).Row + 1

    strFile = Dir()
  Loop

damn:
  If Err.Number <> 0 Then MsgBox Err.Description
  ' Aufräumen  
  Application.DisplayAlerts = False
  Set wb = Nothing
  ap.Quit
  Set ap = Nothing
End Sub

der funktioniert grds und liest die Daten aus. Lediglich die neue Anordnung in Spalten funktioniert noch nicht so wie ich es benötige. Was muss ich schreiben, damit er die Werte nicht mehr untereinandere schreibt (so wie es ausgelesen wird) sondern in einer Zeile?

Vielen Dank.
Mitglied: 133417
133417 Jul 10, 2017 updated at 18:18:56 (UTC)
Goto Top
Was muss ich schreiben, damit er die Werte nicht mehr untereinandere schreibt (so wie es ausgelesen wird) sondern in einer Zeile?
So wie ich ihn oben extra dafür angepasst habe, läuft hier einwandfrei.
Du musst halt deine Fehlermeldung posten ...
Member: Michelle1995
Michelle1995 Jul 10, 2017 at 18:33:30 (UTC)
Goto Top
Fehler beim Kompilieren:

Unzulässige Verwendung einer Eigenschaft

Dabei Application in der Zeile Application ScreenUpdating = False - blau hinterlegt.

Was mache ich falsch?
Mitglied: 133417
133417 Jul 11, 2017 updated at 05:43:51 (UTC)
Goto Top
Da fehlt der Punkt face-wink, kopiers einfach nochmal.
Member: Michelle1995
Michelle1995 Jul 11, 2017 at 19:09:02 (UTC)
Goto Top
vielen Dank. Die Punkte habe ich gesetzt.

Mein Code sieht nun so aus:

Sub MergeWorksheets()
    Const FOLDER = "C:\Users\Desktop\Excel_VBA\"  
    Dim sh As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Sheets(1)
        file = Dir(FOLDER & "\*.xlsx")  
        While file <> ""  
            Set sh = GetObject(file).Sheets(1)
               sh.Range("B1:B4").Copy  
         .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True  
            sh.Parent.Close False
            file = Dir()
        Wend
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

 

und leider bekomme ich wieder eine Fehlermeldung face-sad sorry:

Systemfehler &H800401E4 (-2147221020). Ungültige Syntax

Woran liegt das?
Mitglied: 133417
133417 Jul 11, 2017 updated at 20:56:13 (UTC)
Goto Top
Weil dein Pfad am Ende einen Backslash hat, der wird ja schon in Zeile 7 gesetzt!
Member: Michelle1995
Michelle1995 Jul 12, 2017 at 17:12:57 (UTC)
Goto Top
Vielen Dank für deine Geduld und Hilfer. Ich habe das mit dem Backslash behoben aber der Fehler kommt immer noch face-sad:

Sub MergeWorksheets()
    Const FOLDER = "C:\Users\Desktop\Excel_VBA\"  
    Dim sh As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Sheets(1)
        file = Dir(FOLDER & "*.xlsx")  
        While file <> ""  
            Set sh = GetObject(file).Sheets(1)
               sh.Range("B1:B4").Copy  
         .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True  
            sh.Parent.Close False
            file = Dir()
        Wend
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Mitglied: 133417
133417 Jul 12, 2017, updated at Jul 13, 2017 at 10:20:47 (UTC)
Goto Top
Const FOLDER = "C:\Users\Desktop\Excel_VBA\" 
Jetzt fehlt der Username im Pfad ...ts, ts,ts..
Sub MergeWorksheets()
    Const FOLDER = "C:\Users\<DEINUSERNAME>\Desktop\Excel_VBA"  
    Dim sh As Worksheet
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With ThisWorkbook.Sheets(1)
        file = Dir(FOLDER & "\*.xlsx")  
        While file <> ""  
            set sh = GetObject(FOLDER & "\" & file).Sheets(1)  
               sh.Range("B1:B4").Copy  
         .Cells(Rows.Count,"A").End(xlUp).Offset(1,0).pasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True  
            sh.Parent.Close False
            file = Dir()
        Wend
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
Klappt hier einwandfrei!

Sorry all your faults, go buy a book and learn, instead of writing sad smileys.

Ciao.
Member: Michelle1995
Michelle1995 Jul 13, 2017 at 18:42:51 (UTC)
Goto Top
den Username habe ich HIER im Quelltext entfernt weil es keinen was angeht.

Aber wenn man es genau nimmt, steht nun in dem Quelltext in Zeile 9 was drin was vorher nicht da war. Damit läuft es durch!!! Das sieht schon ganz gut aus! Danke!!!

Was muss ich umschreiben, damit in der Zeile die beschrieben wird, z.B. B1, B3, B10 verwendet werden? Bzw. bei mehreren Dateien die jeweiligen Zeilen darunter? Ist das Zeile 10 wo aktuelle "B1:B4" steht?