Rausschreiben der Dateinamen in Excel

  • Excel

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Odi123.

    Rausschreiben der Dateinamen in Excel

    Hallo liebe Forum-Gemeinde,

    ich habe mich hier angemeldet, weil ich nicht mehr weiter weis. Ich muss immoment ein Programm in der Arbeit schreiben, welches mehrere Dateien zusammenfügt (in meinem Fall xlsx). Soweit so gut. Das Zusammenfügen funktioniert bis jetzt einwandfrei. Mein Problem ist nun, das mein Chef möchte, dass ich in Spalte A den Dateinamen schreibe, aus welcher Datei die betreffende Zeile stammt. Ich bin neu in Visual Basic und hab kaum erfahrungen, hab mir vieles aus dem Internet geholt und zusammen gefummelt. Ich hoffe mir kann jmd. helfen, es eilt sehr.

    Vielen Dank, euere Odi

    Visual Basic-Quellcode

    1. Public Sub Daten_mehrerer_Dateien_zusammenfuehren()
    2. On Error GoTo errExit
    3. Dim WBQ As Workbook
    4. Dim WBZ As Workbook
    5. Dim varDateien As Variant
    6. Dim lngAnzahl As Long
    7. Dim lngLastQ As Long
    8. Dim x As Integer
    9. Set WBZ = ActiveWorkbook
    10. 'Altdaten auf Zielblatt löschen
    11. WBZ.Worksheets(1).Range("A1:IV65536").ClearContents
    12. varDateien = _
    13. Application.GetOpenFilename("Excel-Arbeitsmappe (*.xlsx),*.xlsx" & "Excel 97-2003-Arbeitsmappe (*.xls; *.xlsm),*.xls; *.xlsm,", False, "Bitte gewünschte Datei(en) markieren", False, True)
    14. With Application
    15. .ScreenUpdating = False
    16. .EnableEvents = False
    17. .Calculation = xlCalculationManual
    18. End With
    19. 'Lese Tabellenüberschriften aus
    20. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    21. Range("A1").Value = "SOURCE_FILE" 'Beschriftet Spalte A für den Dateipfad
    22. Set WBQ = Workbooks.Open(Filename:=varDateien(lngAnzahl))
    23. WBQ.Worksheets(1).Range("A1:Z1").Copy _
    24. Destination:=WBZ.Worksheets(1).Range("B" & WBZ.Worksheets(1).Range("B65536").End(xlUp).Row + 0)
    25. WBQ.Close
    26. Next
    27. 'Lese Tabelleninhalt aus
    28. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    29. x = ActiveSheet.Cells(1048576, 2).End(xlUp).Row + 1 'Soll mir die Größe des Excels bestimmen
    30. Range("A2:A" & x).Value = varDateien 'Soll Dateien in Spalte A schreiben -> funktioniert leider nicht. Ich bekomme immer die letzte Zeile aus der Variante und das rein schreiben funktioniert auch nicht wirklich
    31. Set WBQ = Workbooks.Open(Filename:=varDateien(lngAnzahl))
    32. lngLastQ = WBQ.Worksheets(1).Range("A65536").End(xlUp).Row
    33. WBQ.Worksheets(1).Range("A2:Z" & lngLastQ).Copy _
    34. Destination:=WBZ.Worksheets(1).Range("B" & WBZ.Worksheets(1).Range("B65536").End(xlUp).Row + 1)
    35. WBQ.Close
    36. Next
    37. With Application
    38. .ScreenUpdating = True
    39. .EnableEvents = True
    40. .Calculation = xlCalculationAutomatic
    41. End With
    42. MsgBox "Es wurden " & UBound(varDateien) & " Dateien zusammengefügt.", 64
    43. Exit Sub
    44. errExit:
    45. With Application
    46. .ScreenUpdating = True
    47. .EnableEvents = True
    48. .Calculation = xlCalculationAutomatic
    49. End With
    50. If Err.Number = 13 Then
    51. MsgBox "Es wurde keine Datei ausgewählt"
    52. Else
    53. MsgBox "Es ist ein Fehler aufgetreten!" & vbCr _
    54. & "Fehlernummer: " & Err.Number & vbCr _
    55. & "Fehlerbeschreibung: " & Err.Description
    56. End If
    57. End Sub

    Hi und Willkommen.

    So erhältst du die letzte Zeile in Column "A" + 1 für die erste freie

    Visual Basic-Quellcode

    1. Dim lastrow as Long
    2. lastrow = Cells(Rows.Count, "A").End(xlUp).Row + 1


    So verwendet man das Array und schreibt den Wert rein:

    Visual Basic-Quellcode

    1. Dim lastrow
    2. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    3. 'Range("A2:A" & x).Value = varDateien
    4. lastrow = Cells(Rows.Count, "A").End(xlUp).Row + 1
    5. Sheets(1).Cells(lastrow, 1).Value = varDateien(lngAnzahl)


    Wieso hast denn solche Aufgaben wenn du dich damit Nüsse auskennst :D


    //Edit:

    eigentlich brauchst du ja lastrow nicht mal, ist ja eh fixiert wo es losgeht:

    Visual Basic-Quellcode

    1. dim rowCounter as long
    2. rowCounter = 1
    3. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    4. rowCounter = rowCounter + 1
    5. Sheets(1).Cells(rowCounter, 1).Value = varDateien(lngAnzahl)
    6. ..
    7. Next
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    Visual Basic-Quellcode

    Dim lastrow
    For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    'Range("A2:A" & x).Value = varDateien
    lastrow = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Sheets(1).Cells(lastrow, 1).Value = varDateien(lngAnzahl)


    Also ich hab das jetzt nach dieser Version von dir gemacht und bekomme auch endlich die richtigen Werte raus :)

    VB.NET-Quellcode

    1. 'Lese Tabelleninhalt aus
    2. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    3. lastrow = Cells(Rows.Count, "A").End(xlUp).Row + 1
    4. Sheets(1).Cells(lastrow, 1).Value = varDateien(lngAnzahl)
    5. Set WBQ = Workbooks.Open(Filename:=varDateien(lngAnzahl))
    6. lngLastQ = WBQ.Worksheets(1).Range("A65536").End(xlUp).Row
    7. WBQ.Worksheets(1).Range("A2:Z" & lngLastQ).Copy _
    8. Destination:=WBZ.Worksheets(1).Range("B" & WBZ.Worksheets(1).Range("B65536").End(xlUp).Row + 1)
    9. WBQ.Close
    10. Next


    Mein Problem ist jetzt nur, das er nur 3 Zeilen anstatt 6 befüllt, also irgendwie nur die Hälfte? :|

    Zu deiner Frage: Ich soll das lernen ;)
    Hab ich gemacht; Da kommt dann das selbe Ergebnis :o

    Jeder dieser 3 Source_Files hat 2 Zeilen -> Insgesamt müssen 6 eingelesen werden, aus jeder 2, also stimmt das schonmal. Nur macht er halt nur bei den ersten 3 die Source File, auch mit deiner Edit Variante.


    SOURCE_FILE
    Name
    Geschlecht
    Wohnort
    C:\Users\Z003DJCT\Desktop\Test1 - Kopie (2).xlsx
    Marina
    WMünchen
    C:\Users\Z003DJCT\Desktop\Test1 - Kopie.xlsx
    Brunhilde
    W
    Nürnberg
    C:\Users\Z003DJCT\Desktop\Test1.xlsx
    Geier
    M
    München

    Klaus
    M
    Hannover

    Rudolf
    M
    Berlin

    Günther
    W
    Hamburg
    Ok, jetzt verstehe ich das Problem erst.


    Visual Basic-Quellcode

    1. Dim lastrowB as Long
    2. Dim lastrowA as Long
    3. For lngAnzahl = LBound(varDateien) To UBound(varDateien)
    4. Set WBQ = Workbooks.Open(Filename:=varDateien(lngAnzahl))
    5. lngLastQ = WBQ.Worksheets(1).Range("A65536").End(xlUp).Row
    6. WBQ.Worksheets(1).Range("A2:Z" & lngLastQ).Copy _
    7. Destination:=WBZ.Worksheets(1).Range("B" & WBZ.Worksheets(1).Range("B65536").End(xlUp).Row + 1)
    8. WBQ.Close
    9. lastrowA = Cells(Rows.Count, "A").End(xlUp).Row + 1
    10. lastRowB = Cells(Rows.Count, "B").End(xlUp).Row
    11. Sheets(1).Range(Cells(lastRowA,1), Cells(lastRowB, 1)).Value = varDateien(lngAnzahl)
    12. Next


    Ich würde dir übrigens eher von Copy abraten. Du kannst auch einfach die Value Eigenschaften beider Ranges verwenden und diese zuweisen (wenn dir die Formatierung unwichtig ist)
    Das ist meine Signatur und sie wird wunderbar sein!
    Wenn du es lernen sollst, dann empfehle ich dir, dich damit zu beschäftigen. Lieber länger brauchen und selber hinbekommen als schnell schnell und nicht wirklich kapieren was man tut.
    Du hast jetzt einen Ansatz bekommen, wie du es theoretisch auch ohne Copy machen könntest. (ist das selbe Prinzip wie dein eigentliches Problem) ;)

    Hf
    Das ist meine Signatur und sie wird wunderbar sein!
    Jetzt hab ich doch noch mal ne Frage. Und zwar soll, nachdem ich alles hübsch eingelesen wurde, das Ergerbnis in einer NEUEN Datei gepseichert werden. Ich habe das jetzt folgendermaßen gelöst:

    VB.NET-Quellcode

    1. MsgBox "Es wurden " & UBound(varDateien) & " Dateien zusammengefügt.", 64
    2. Call CommandButton1_Click
    3. WBZ.Worksheets(1).Range("A1:IV65536").ClearContents
    4. Exit Sub
    5. errExit:
    6. With Application
    7. .ScreenUpdating = True
    8. .EnableEvents = True
    9. .Calculation = xlCalculationAutomatic
    10. End With
    11. If Err.Number = 13 Then
    12. MsgBox "Es wurde keine Datei ausgewählt"
    13. WBZ.Worksheets(1).Range("A1:IV65536").ClearContents
    14. Application.Quit
    15. Application.DisplayAlerts = False
    16. ActiveWorkbook.Close savechanges:=False
    17. Else
    18. MsgBox "Es ist ein Fehler aufgetreten!" & vbCr _
    19. & "Fehlernummer: " & Err.Number & vbCr _
    20. & "Fehlerbeschreibung: " & Err.Description
    21. End If
    22. End Sub
    23. Private Sub CommandButton1_Click()
    24. Application.DisplayAlerts = False
    25. ' Dateiname und Pfad in Variable speichern
    26. template_file = ActiveWorkbook.FullName
    27. fileSaveName = Application.GetSaveAsFilename( _
    28. InitialFileName:=ThisWorkbook.Path & ThisWorkbook.Name + ".txt", _
    29. fileFilter:=" Excel-Arbeitsmappe (*.xlsx), *.xlsx," & _
    30. " Excel-Arbeitsmappe mit Makros (*.xlsm), *.xlsm," & _
    31. " Excel 97-2003-Arbeitsmappe (*.xls), *.xls," & _
    32. " Text (*.txt), *.txt")
    33. If fileSaveName = False Then
    34. Exit Sub
    35. End If
    36. file_name_saved = ActiveWorkbook.FullName
    37. MsgBox "Datei erfolgreich gespeichert unter: " & vbCr & vbCr & file_name_saved
    38. End Sub


    Meine Probleme sind jetzt Folgende:

    1. Wie kann ich den Dateinamen im Speichern Unter Fenster vorgeben? Also z.B. mein aktuelles Worksheet und mein aktuelles Dateiformat? Ich hab zwar schon was versucht, aber das geht irgendwie nicht.
    2. Ich kann bereits alles schön speichern aber hab das Problem, das wenn ich es gespeichert hab und mein Excel schließe, dass es mir meine Datei komplett zerschießt und er anscheinend keine neue Datei anlegt, sondern das Ergebnis fest in der aktuellen Datei speichert, welche aber NUR als Arbeitsgrundlage dienen soll und nicht das Ergebnis beinhalten soll.

    Vielen vielen Dank!

    LG Odi
    1. Wie kann ich den Dateinamen im Speichern Unter Fenster vorgeben?

    Visual Basic-Quellcode

    1. fileSaveName = Application.GetSaveAsFilename( _
    2. InitialFileName:= ThisWorkbook.Name, _
    3. fileFilter:=" Excel-Arbeitsmappe (*.xlsx), *.xlsx," & _
    4. " Excel-Arbeitsmappe mit Makros (*.xlsm), *.xlsm," & _
    5. " Excel 97-2003-Arbeitsmappe (*.xls), *.xls," & _
    6. " Text (*.txt), *.txt")


    Hast doch schon dastehen, nur verwende halt nicht ".txt" sondern einfach nur ThisWorkbook.Name.

    Wenn du das verwendest:

    Visual Basic-Quellcode

    1. Set WBZ = ActiveWorkbook


    Dann schreibst du logischerweise alles ins aktive Workbook. Wenn du ein neues haben willst, dann öffne ein neues:

    Visual Basic-Quellcode

    1. ​Set WBZ = Workbooks.Add()
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo Mono,

    super jetzt hab ich das auch! Hab tausend Dank :) Nur jetzt hab ich noch das Problem, das er beim Kopieren auch das Makro mit kopiert, bzw. mein Modul und das darf nicht passieren. Ich habe schon wie ein blöder übers Wochenende Gegoogled, aber leider bin ich nicht wirklich weiter gekommen. Gibt es da ne Möglichkeit beim Kopieren das Modul auszuschließen?

    LG Johannes
    Also halt wenn die Datei als neue Datei gespeichert wird, dann speichert er leider auch das Modul mit in die neue Datei.

    Nochmal kurz zum besseren Verständnis der Sinn meines kleines Programms.
    Das Programm wird per Batch-Datei gestartet und es öffnet sich ein Fenster, worin die Dateien, welche zusammengeführt werden sollen, ausgewählt werden. Dann fügt er die Dateien zusammen und es kommt dann sofort das "Speichern unter" Fenster. Da soll man dann halt den Dateinamen angeben usw., was auch jetzt prima funktioniert. Das Problem ist halt, wenn man dann "Speichern" drückt, dass er das Modul aus meinem Programm mit speichert, was er aber nicht soll, da das Excel nur als Programm dienen soll und nicht als Speicher für die zusammengesetzten Dateien.
    Zeig den Code bitte. Offenbar speicherst du das aktuelle Workbook mit einem neuen Namen. Du musst aber ein NEUES Workbook hinzufügen (Siehe Post 10) und diesem neuen Workbook die Daten reinkopieren und dieses dann speichern.
    Das ist meine Signatur und sie wird wunderbar sein!
    Hab den Code noch etwas vereinfacht übers Wochenende, aber das hat anscheinend nix gebracht.

    VB.NET-Quellcode

    1. Private Sub CommandButton1_Click()
    2. Dim Saved As Boolean
    3. Application.ScreenUpdating = False
    4. Application.DisplayAlerts = False
    5. Saved = True
    6. Saved = Application.Dialogs(xlDialogSaveAs).Show("")
    7. If Saved = False Then
    8. MsgBox "Vorgang abgebrochen!"
    9. Application.Quit
    10. Application.DisplayAlerts = False
    11. ActiveWorkbook.Close savechanges:=False
    12. Exit Sub
    13. End If
    14. Application.DisplayAlerts = True
    15. Application.ScreenUpdating = True
    16. MsgBox "Datei erfolgreich gespeichert!"
    17. End Sub