Verzeichnisbaum nach Datei durchsuchen und bestimmte Zelle in eine andere Datei schreiben

  • Excel

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Frizzlefry.

    Verzeichnisbaum nach Datei durchsuchen und bestimmte Zelle in eine andere Datei schreiben

    Grüß Gott an Alle,
    hab schon geschätzte 3 std jetzt gegoogelt und dachte da richt ich mich an euch.
    Ich habe Folgendes Problem beim Makro schreiben:

    Es besteht aus einer Hauptdatei, welches eine Spalte B mit Dateinamen (z..b. Table_1.xls, Table_2.xls, ...) untereinander besitzt und links daneben eine leere Spalte A in die der Inhalt der Datei (Dateiname aus Spalte 1) kopiert werden soll.

    Beispiel: In der datei Hauptprogramm.xls steht in B2 Table_2.xls, nun soll das Programm nach der Datei Table_2.xls suchen, diese öffnen, den Wert z.b. aus Zelle A25 (ist in jeder Datei die gleiche Zelle) kopieren und ins Hauptprogramm nach A2 einfügen.

    Das ganze läuft in einer Schleife und arbeitet alle Dateinamen untereinander ab.

    Das klappt bis jetzt bei mir mit folgendem Code:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Makro1()
    3. 'Neues Excel Objekt anlegen
    4. 'um die zu betrachtende Exceldatei abzulegen
    5. Dim objExcel As New Excel.Application
    6. 'Sheet Objekt der jeweiligen Exceldatei anlegen
    7. Dim objSheet As Object
    8. 'Anlegen der Hilfsvariablen
    9. Dim iRow As Integer
    10. Dim strDateipfad As String
    11. Dim strPfad As String
    12. Dim strDateiname As String
    13. 'Pfad in welchem sich die Dateien der zu
    14. 'kopierenden Zellen sich befinden auswählen
    15. strPfad = "C:\VBA\Versuch1\"
    16. 'Schleife welche den Zelleninhalt aller aufgelisteten
    17. 'Dateien in mehrere Zellen des Hauptprogramms schreibt
    18. For iRow = 2 To 11
    19. 'Überprüfen, ob in Spalte "Dateiname" ein solcher eingetragen ist.
    20. 'Fals nicht, wird die Zeile mit einer Fehleranzeige übersprungen.
    21. '(der Arbeitsvorgang wird fortgesetzt)
    22. If Cells(iRow, 2) = "" Then
    23. MsgBox "Keinen Dateinamen gefunden, bitte Tabelle ergänzen. Arbeitsvorgang wird nun fortgesetzt. Inhalt fehlt in Zeile: " & iRow
    24. Cells(iRow, 3) = "X"
    25. Else
    26. strDateiname = Cells(iRow, 2)
    27. strDateipfad = strPfad & strDateiname
    28. 'Überprüfen, ob die in der Tabelle angegebene Datei vorhanden ist.
    29. 'fals nicht, wird die Zeile mit einer Fehleranzeige übersprungen.
    30. '(der Arbeitsvorgang wird fotzgesetzt)
    31. If Dir(strDateipfad) = "" Then
    32. MsgBox "Datei nicht gefunden, bitte vergewissern Sie sich ob die Datei " & strDateiname & " im jeweiligen Verzeichnis vorhanden ist. Arbeitsvorgang wird nun fortgesetzt"
    33. Cells(iRow, 3) = "X"
    34. Else
    35. objExcel.Workbooks.Open strDateipfad
    36. Set objSheet = objExcel.Sheets("Sheet1")
    37. Cells(iRow, 1) = objSheet.Cells(25, 1)
    38. Cells(iRow, 3) = "-"
    39. End If
    40. End If
    41. Next iRow
    42. 'Objekte (Mappe+Sheet) löschen
    43. 'Speicherdialog aufrufen
    44. objExcel.EnableEvents = False
    45. objExcel.DisplayAlerts = False
    46. objExcel.ActiveWorkbook.Close SaveChanges:=False
    47. objExcel.Quit
    48. Set objExcel = Nothing
    49. Set objSheet = Nothing
    50. Dim strDateinameNeu As String
    51. strDateinameNeu = "Tabelle mit Inhalt"
    52. Application.Dialogs(xlDialogSaveAs).Show "G:\030_Team\Support-Team\Students\Sprenger\" & strDateinameNeu
    53. End Sub


    So, nun ist meine Frage: Zur Zeit durchsucht mein Code nur das jeweils angegebene Verzeichnis. Ich will aber, dass z.b. in Verzeichnis A + Unterverzeichnis B + Unterverzeichnis C usw. nach der dementsprechenden Datei gesucht wird.


    Ich bedanke mich jetzt schon einmal, ihr seit meine letzte Hoffnung :D

    MfG Frizzle

    //EDIT: Da ich eine neuere Version als 2003 habe, ist mir nicht möglich die Applik. FileSearch zu benutzen

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

    Hallo,
    die Lösung liegt darin, den Code in eine Schleife zu packen, wo vor jedem Durchlauf von

    Visual Basic-Quellcode

    1. strDateipfad = strPfad & strDateiname
    strPfad angepasst wird.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Geh rekursiv durch das Basisverzeichnis durch:

    Visual Basic-Quellcode

    1. Sub Main
    2. ExecuteFolder "c:\Versuch1", "*.xls"
    3. End Sub
    4. Sub ExecuteFolder (ByVal Foldername as String, ByVal Filter as String)
    5. Set FSO=CreateObject("Scripting.FileSystemObject")
    6. Set Folder=FSO.GetFolder(Foldername)
    7. For Each SubFolder in Folder.Folders
    8. ExecuteFolder SubFolder.Path, Filter
    9. Next
    10. For Each File in Folder.Files
    11. If File.Name Like Filter Then
    12. ExecuteFile File.Path
    13. Endif
    14. Next
    15. End Sub
    16. Sub ExecuteFile (ByVal Filename as String)
    17. ' tu was immer du willst mit der Datei
    18. End Sub
    Anmerkung:
    FSO musst du allerdings nicht unbedingt jedesmal neu erzeugen.
    Du kannst das CreateObject auch irgendwo global machen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    also fals es jemanden interesiert, habe es nun ein bisschen anders geschafft.. und zwar lass ich mir alle Unterverzeichnisse in eine Spalte schreiben und überprüf dann jedes unterverzeichnis + das Hauptverzeichnis.

    Sieht dann so aus:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub Makro1()
    3. Dim fs, f, f1, fc, s, i
    4. Set fs = CreateObject("Scripting.FileSystemObject")
    5. Set f = fs.GetFolder("C:\Versuch1\")
    6. Set fc = f.SubFolders
    7. i = 2
    8. For Each f1 In fc
    9. Cells(i, 6) = f1.Name & "\"
    10. i = i + 1
    11. Next
    12. 'Neues Excel Objekt anlegen
    13. 'um die zu betrachtende Exceldatei abzulegen
    14. Dim objExcel As New Excel.Application
    15. 'Sheet Objekt der jeweiligen Exceldatei anlegen
    16. Dim objSheet As Object
    17. 'Anlegen der Hilfsvariablen
    18. Dim iRow As Integer
    19. Dim strDateipfad As String
    20. Dim strPfad As String
    21. Dim strDateiname As String
    22. Dim iVerzeichnisse As Integer
    23. Dim strHauptpfad As String
    24. 'Pfad in welchem sich die Dateien der zu
    25. 'kopierenden Zellen sich befinden auswählen
    26. strHauptpfad = "C:\Versuch1\"
    27. 'Schleife welche den Zelleninhalt aller aufgelisteten
    28. 'Dateien in mehrere Zellen des Hauptprogramms schreibt
    29. For iRow = 2 To 11
    30. 'Überprüfen, ob in Spalte "Dateiname" ein solcher eingetragen ist.
    31. 'Fals nicht, wird die Zeile mit einer Fehleranzeige übersprungen.
    32. '(der Arbeitsvorgang wird fortgesetzt)
    33. If Cells(iRow, 2) = "" Then
    34. Cells(iRow, 3) = "X"
    35. Else
    36. For iVerzeichnisse = 2 To 5
    37. strPfad = strHauptpfad & Cells(iVerzeichnisse, 6)
    38. strDateiname = Cells(iRow, 2)
    39. strDateipfad = strPfad & strDateiname
    40. 'Überprüfen, ob die in der Tabelle angegebene Datei vorhanden ist.
    41. 'fals nicht, wird die Zeile mit einer Fehleranzeige übersprungen.
    42. '(der Arbeitsvorgang wird fotzgesetzt)
    43. If Dir(strDateipfad) = "" Then
    44. Cells(iRow, 3) = "X"
    45. Else
    46. objExcel.Workbooks.Open strDateipfad
    47. Set objSheet = objExcel.Sheets("Sheet1")
    48. Cells(iRow, 1) = objSheet.Cells(25, 1)
    49. Cells(iRow, 3) = "-"
    50. GoTo DateiGefunden
    51. End If
    52. Next iVerzeichnisse
    53. DateiGefunden:
    54. End If
    55. Next iRow
    56. 'Objekte (Mappe+Sheet) löschen
    57. 'Speicherdialog aufrufen
    58. objExcel.EnableEvents = False
    59. objExcel.DisplayAlerts = False
    60. objExcel.ActiveWorkbook.Close SaveChanges:=False
    61. objExcel.Quit
    62. Set objExcel = Nothing
    63. Set objSheet = Nothing
    64. Dim strDateinameNeu As String
    65. strDateinameNeu = "Tabelle mit Inhalt"
    66. Application.Dialogs(xlDialogSaveAs).Show "C:\Versuch1\" & strDateinameNeu
    67. End Sub



    Danke für eure Hilfe! :thumbsup: