Daten aus mehreren Dateien importieren und auslisten

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Maik1406.

    Daten aus mehreren Dateien importieren und auslisten

    Hallo Leute,

    ich möchte mich verzweifelt an euch wenden mit der Hoffnung auf Hilfe.
    Bin ein "Learning by doing" Mensch, aber hier kommt ich nicht weiter.

    Habe meinem Bruder in Excel ein "Rechnungsprogramm" erstellt, womit er "lizensfrei" ( MS Office hat ohnehin jeder , somit kein separates Programm ) Rechnungen schreiben und archivieren kann.
    Hier arbeite ich mit einer Vorlage und einer einfachen Struktur.
    Die Vorlage ist immer gleich und die Rechnungen werden dann in das Verzeichnis "Offen" oder "Archiv" abgelegt nach Erstellung.
    Jede Rechnungsdatei hat immer ein Sheet mit dem Namen "Auslesen" wo die zum Export bereitstehenden Daten automatisch generiert sind.
    Das mal zum Hintergrund.

    Jetzt möchte diese Ordner auslesen.
    Auslesen bedeutet, das ich eine unabhängige Datei gebastelt habe, die die Ordnungsstrukturen auslesen soll.
    Hier habe ich bereits ein VBA Code der mir die Dateien auflistet, die in den jeweiligen Ordner "noch offen" und "Archiv" sind.

    dropbox.com/s/hj17z7br9uk6ms3/Struktur.JPG?dl=0

    Das klappt also schon.

    dropbox.com/s/6jxi8tod3pjb2pl/Aufbau.JPG?dl=0

    Jetzt benötige ich einen VBA Code, der mir dann aus den einzelnen Rechnungen - Sheet("Auslesen").Range(A2:H2) ausliest und
    dann in die Auslesedatei importiert ohne Sie zu öffnen. Am Besten ein klick und eh legt los.

    Was meint Ihr. Kann sowas funktionieren.
    Ich denke schon, weiß aber nicht wie ?( ?( ?(

    Habe die Dateien mal mit angehangen, aber leider nur als XLSX.

    Vielen Vielen Danke für eure Hilfe.
    PS: Wer mir weiterhilft und mal in der Nähe von Landsberg am Lech ist, den Lade ich auf nen Kaffee und ne Kleinigkeit zu Essen ein.

    Vielen Dank,
    Maik
    Dateien
    • Auslesen.xlsx

      (385,91 kB, 254 mal heruntergeladen, zuletzt: )
    • Vorlage Rechnung.xlsx

      (56,65 kB, 196 mal heruntergeladen, zuletzt: )
    Hallo,

    die Datei Auslesen soll quasi Rechnungen auslesen.
    Habe zwei Ordner ( noch offen und Archiv ) die die Rechnungsdateien beinhaltet.

    Also soll die Datei Auslesen ausschließlich Werte aus den Rechnungen lesen wie z.B. Betrag, Rechnungsträger, Erstelldatum etc.
    Dies ist in jeder Rechnungsdatei im Sheet Auslesen bereitgestellt.
    Ich denke, das ich diesen Reiter aber in Export umbenennen werde. Dann ist es einfacher zu verstehen.

    Also soll die Datei mit dem Namen Auslesen nur die einzelnen Parameter der jeweiligen Rechnungen lesen/erfassen/auslisten.
    Damit habe ich die Möglichkeit eines Reports ohne selbst zu dokumentieren.

    Kannst du mir helfen?

    Danke.
    @Maik1406 Hallo, ich habe mal ein kleines Beispiel zum Auslesen der Archiv Dateien erstellt.

    Les dich ein bisschen rein in die ganze ADO geschichte und passe den Code auf dich an.
    Ich empfehle dir, dass du per Debugger, Schritt für Schritt durch den Code gehst und dir anguckst was passiert

    EDIT: Setze cn auf Nothing im Sub getData
    (und ändere den Sub Namen in PrintData, er hat kein Return Value und der Name getData ist somit verwirrend)

    Hier der Code:
    (Führe den Sub ReadAllFiles aus)
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Function getConnection(ByVal target As String, Optional ByVal b_Open = True) As Object
    3. Dim cn As Object 'ADODB Connection
    4. Dim cnString As String 'Connection.ConnectionString
    5. cnString = "Provider=Microsoft.ACE.OLEDB.12.0; " & _
    6. "Extended Properties='Excel 12.0 Xml;HDR=YES';Data Source=" & _
    7. target
    8. Set cn = CreateObject("ADODB.Connection")
    9. cn.ConnectionString = cnString
    10. 'To use a connection you have to open it!
    11. If b_Open Then
    12. cn.Open
    13. End If
    14. Set getConnection = cn
    15. End Function
    16. Private Function getRecordset(ByVal sSQL As String, ByRef target As Object) As Object
    17. Dim rs As Object 'ADODB Recordset
    18. On Error Resume Next
    19. Set rs = CreateObject("ADODB.Recordset")
    20. rs.Open sSQL, target 'needs a valid SQL statement and a open ADODB Connection
    21. Set getRecordset = rs
    22. End Function
    23. Private Sub getData(ByVal targetFile As String)
    24. Dim cn As Object 'ADODB Connection
    25. Dim rs As Object 'ADODB Recordset
    26. Dim sSQL As String 'SQL Statement to execute
    27. Dim oRow As Variant 'used for looping
    28. 'Select everything from the Sheets Auslesen
    29. 'NOTE: you have to add the '$' at the end of sheet name!
    30. sSQL = "SELECT * FROM [Auslesen$];"
    31. Set cn = getConnection(targetFile) 'gets the Connection Object
    32. If cn Is Nothing Then Exit Sub
    33. Set rs = getRecordset(sSQL, cn) 'gets the Recordset Object
    34. If rs Is Nothing Or rs.BOF Or rs.EOF Then Exit Sub 'Exit if its nothing or empty
    35. 'use getString instead of getRows to set the Row and Column Delimiter yourself
    36. 'Row Delimiter = 3rd Statement
    37. 'Column Delimiter = 4th Statement
    38. For Each oRow In Split(rs.GetString(, , ";", "NEW_ROW"), "NEW_ROW")
    39. Debug.Print oRow
    40. Next oRow
    41. rs.Close
    42. Set rs.Source = Nothing
    43. cn.Close
    44. End Sub
    45. Public Sub ReadAllFiles()
    46. Dim fso As Object
    47. Dim folder As Object
    48. Dim targetFile As Variant
    49. Const ROOT_DIRECTORY As String = "I:\Nonne\Büro\Daten\Rechnungen\Archiv\"
    50. Set fso = CreateObject("Scripting.FileSystemObject")
    51. Set folder = fso.GetFolder(ROOT_DIRECTORY)
    52. 'Loop through all files and print the data
    53. For Each targetFile In folder.Files
    54. getData targetFile
    55. Next targetFile
    56. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Petersilie“ ()

    Hey,


    grandiose Antwort.
    Werde mich damit befassen und schauen, ob ich hier durchblicke.

    Das sieht schon sehr komplex aus.
    Da ist mein kleines VBA Projekt nur kleinen EINMALEINS :-).

    Ich denke, dass ich hier bestimmt nochmal auf dich zukommen werde.

    Vielen Dank für deine Bemühung.

    Gruß Maik.