Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA überspringt For Each Schleife

VBA überspringt For Each Schleife
27.09.2021 16:40:20
Elias
Hallo zusammen,
Ich habe ein Problem mit folgendem Code:

Dim fso As Object, OFols As Object, fols As Object, fol As Object, fils As Object, fil As Object
Set fso = CreateObject("scripting.FileSystemObject")
Set OFols = fso.getfolder(PicPath)
Set fols = OFols.subfolders
For Each fol In fols
If Left(fol.Name, 7) = snr Then
PicPath = PicPath & fol.Name & "Dateiname"
Set fils = fol.Files
    For Each fil In fils  
fil.Copy
Next fil
End If
Next fol

Ich möchte einen Ordner wählen der Unterordner mit bestimmten Namen enthält. Dort will ich den passenden Unterordner ansprechen und die Dateien die er enthält in eine PPT kopieren. Bis zur For Each Schleife läuft der Code, aber die Schleife wird einfach übersprungen. Scheinbar erkennt er die Einzelfile-Variable fil nicht. Ist aber bei der ersten For Each Schleife ja im Prinzip das gleiche auf Ordner-Ebene, da funktioniert es.
Jemand eine Idee wo das Problem liegen könnte?
Liebe Grüße,
Elias


		

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA überspringt For Each Schleife
27.09.2021 16:47:17
ralf_b
was passiert denn wenn du es so machst?

For Each fil In  fol.Files

AW: VBA überspringt For Each Schleife
27.09.2021 16:51:32
Elias
Ändert sich nichts..
AW: VBA überspringt For Each Schleife
27.09.2021 17:02:08
Yal
Hallo Elias,
versuchst Du Unterordner von Unterordner in unbeknante Tiefe anzusprechen?
Willkommen in der Problematik der "Baum"-Verarbeitung und der Rekursivität.
Darüber hinaus, verwende in dem Fall den Early Binding (Extras, Verweise, "Microsoft Scripting Runtime" anklicken) anstatt Late Binding (CreateObject(..)), so hast Du den IntelliSense (Strg+Leertaste) und das Objekt-Katalog (F2, von "<Alle Bibliotheken>" auf "Scripting" wechseln) zur Verfügung.
Hast Du aber eine festdefinierte Anzahl an Ebene, kannst Du mit einem festen Anzahl an verschachtelten For Each..Next-Schleifen das Problem lösen.

'Unter Verweis auf "Microsoft Scripting Runtime"
Sub Dateien_auflisten(PicPath As String)
Dim fso As New FileSystemObject
Dim BasisVerz As Folder
Dim SubVerz As Folder
Dim Datei As File
On Error Resume Next
'Verzeichnis holen, wenn nicht vorhanden, rausspringen
Set BasisVerz = fso.GetFolder(PicPath)
If BasisVerz Is Nothing Then Exit Sub
'Unterverzeichnis durchgehen (Rekursiv)
For Each SubVerz In BasisVerz.SubFolders
If Left(fol.Name, 7) = snr Then
Dateien_auflisten SubVerz.Path
End If
'Dateien durchgehen
For Each Datei In BasisVerz.Files
Debug.Print PicPath & "\" & Datei.Name
Next fil
End Sub
VG
Yal
Anzeige
AW: VBA überspringt For Each Schleife
27.09.2021 17:36:33
Elias
Bringt leider auch nichts.. die zweite for each schleife wird immernoch übersprungen
AW: VBA überspringt For Each Schleife
27.09.2021 17:44:38
Elias
Ich habe keine undefinierte Anzahl an Ebenen. Es ist nur dieser eine Zwischenordner. Also ein Ordner für alle Bilder der wiederum Unterordner für bestimmte Bauteile enthält, die wiederum die Bilder der Bauteile enthalten.
AW: VBA überspringt For Each Schleife
27.09.2021 17:53:47
Elias
Ich habe schon einige Beispiele gesehen, wo es so gelöst war, wie in meinem Beispiel, daher habe ich es übernommen. Allerdings gab es immer nur einen Ordner. Denkst du allein diese eine Zwischenebene ist das Problem?
Mir erschließt sich nicht ganz wieso das ein Problem sein sollte. Im Endeffekt gehe ich doch mit meiner Schleife nur eine Ebene tiefer..
Anzeige
AW: VBA überspringt For Each Schleife
27.09.2021 20:32:02
Piet
Hallo Elias
werde zum Essden gerufen, auf die Schnelle fielen mir zwei Fehler auf. Die erste For Next Schleife endete NICHT mit Next! Bei der zweiten stimmte die Next Variaslbe NICHT. Prüf das mal bitte nach. So, muss an den Tisch ...
mfg Piet
  • 'Unterverzeichnis durchgehen (Rekursiv)
    For Each SubVerz In BasisVerz.SubFolders
    If Left(fol.Name, 7) = snr Then
    Dateien_auflisten SubVerz.Path
    End If
    Next SubVerz
    'Dateien durchgehen
    For Each Datei In BasisVerz.Files
    Debug.Print PicPath & "\" & Datei.Name
    Next Datei

  • AW: VBA überspringt For Each Schleife
    28.09.2021 09:10:30
    Elias
    Hab es mal so umgesetzt. Problem ist aber quasi unverändert.. Läuft soweit durch aber wenn ich bei "Dateien durchgehen" in die For Each Schleife gehe springt er dirkt zum Ende ohne sie auszuführen..
    Kann es vielleicht sein, dass irgendein Verweis aktiviert sein muss, von dem ich nichts weiß?
    Vielen Dank für eure Hilfe!
    
    Sub Bilder_kopieren()
    PicPath = "\\C:\Testpfad"
    Dateien_auflisten PicPath
    End Sub
    Sub Dateien_auflisten(Path As String)
    Dim fso As New FileSystemObject
    Dim BasisVerz As Folder
    Dim SubVerz As Folder
    Dim Datei As File
    On Error Resume Next
    'Verzeichnis holen, wenn nicht vorhanden, rausspringen
    Set BasisVerz = fso.GetFolder(Path)
    If BasisVerz Is Nothing Then Exit Sub
    'Unterverzeichnis durchgehen (Rekursiv)
    For Each SubVerz In BasisVerz.SubFolders
    If Left(SubVerz.Name, 7) = "6882323" Then
    Dateien_auflisten SubVerz.Path
    End If
    Next SubVerz
    'Dateien durchgehen
    For Each Datei In BasisVerz.Files
    Debug.Print PicPath & "\" & Datei.Name
    Next Datei
    End Sub
    
    
    
    Anzeige
    AW: VBA überspringt For Each Schleife
    28.09.2021 09:40:01
    peterk
    Hallo
    Die Zeile "On Error Resume Next" hat in der Testphase nichts verloren!! Da bereits Dein Pfad zu einem Fehler führt aber Durch diese Zeile übersprungen wird, glaubst Du das die For Each Schlefe nicht funktioniert!.
    Richtig wäre:
    
    Sub Bilder_kopieren()
    Dim PicPath As String
    PicPath = "C:\Testpfad"
    Dateien_auflisten PicPath
    End Sub
    
    Ein weiterer Fehler: Im Procedurkopf verwendest Du Path As String in der Debug.Print anweisung aber PickPath. Richtig wäre:
    
    Debug.Print Path & "\" & Datei.Name
    
    Peter
    Anzeige
    AW: VBA überspringt For Each Schleife
    28.09.2021 10:33:41
    Elias
    Okay, vielen Dank. Macht auf definitiv Sinn, mein Problem löst es aber leider nicht. Auch wenn ich die Änderungen wie du vorgeschlagen hast einarbeite, wird die Schleife weiterhin einfach übergangen..
    AW: VBA überspringt For Each Schleife
    28.09.2021 10:51:48
    Yal
    Hallo Elias,
    ich glaube, wir drehen uns im Kreis, weil wir nicht ganz genau wissen, was Du brauchst.
    Es wäre hier sinnvoll, dass Du nochmal ganz klar definierst, welche Die Ausgangslage ist, und was erwartet wird.
    Bevor Du postest, lese bitte selber dein Beitrag unter der Annahme "was würde ich verstehen, wenn ich absolut keine Ahnung habe, worum es geht?": was ist unvollständig, doppeldeutig oder potentiel missverständlich.
    Danke für deine Hilfe, Dir zu helfen.
    VG
    Yal
    Anzeige
    AW: VBA überspringt For Each Schleife
    28.09.2021 10:57:34
    peterk
    Hallo
    Folgender Code listet alle Dateien des temporären Verzeichnis.
    
    Sub Bilder_kopieren()
    Dim PicPath As String
    PicPath = Environ("temp")
    Dateien_auflisten PicPath
    End Sub
    Sub Dateien_auflisten(Path As String)
    Dim fso As New FileSystemObject
    Dim BasisVerz As Folder
    Dim SubVerz As Folder
    Dim Datei As File
    'Verzeichnis holen, wenn nicht vorhanden, rausspringen
    Set BasisVerz = fso.GetFolder(Path)
    If BasisVerz Is Nothing Then Exit Sub
    'Unterverzeichnis durchgehen (Rekursiv)
    For Each SubVerz In BasisVerz.SubFolders
    Dateien_auflisten SubVerz.Path
    Next SubVerz
    'Dateien durchgehen
    For Each Datei In BasisVerz.Files
    Debug.Print Path & "\" & Datei.Name
    Next Datei
    End Sub
    

    Anzeige
    AW: VBA überspringt For Each Schleife
    28.09.2021 11:39:31
    Elias
    Das ist leider genau der Code, den ich habe (ein "end if" fehlt in deinem Beitrag, das habe ich drin..)
    Hast du den schonmal so verwendet? Läuft er bei dir?
    AW: VBA überspringt For Each Schleife
    28.09.2021 11:43:36
    peterk
    Hallo
    Der Code läuft genau so wie ich ihn eingestellt habe (es fehlt KEIN end if !)
    Peter
    AW: VBA überspringt For Each Schleife
    28.09.2021 12:20:31
    Elias
    Wenn ich es so ausführe funktioniert der Code tatsächlich. Das Problem war scheinbar die ganze Zeit, dass der Pfad in dem Verzeichnis, das ich genutzt habe zu lange war..
    Wusste nicht, dass Files nur bis zu einer bestimmen Pfadlänge erkannt werden. Kann man das irgendwie umgehen? Andere Variablen setzen?!
    So ist es für einen neutralen Anwender nur schwer nachzuvollziehen, wenn das Programm nicht läuft ohne einen Fehler zu melden..
    Unabhängig davon schonmal tausend Dank für die Hilfe!!
    Anzeige
    AW: VBA überspringt For Each Schleife
    28.09.2021 12:50:35
    peterk
    Hallo
    Probier mal:
    
    Dateien_auflisten SubVerz.ShortPath
    
    Peter
    AW: VBA überspringt For Each Schleife
    28.09.2021 18:38:52
    Piet
    Hallo
    wenn man gezielt nur einen bestimmten Unterordner auslesen will habe ich im Internet ein nettes kleines Makro gefunden, das genau diesen Ordner auswählt. Mein PC streikte auch bei dem gesendeten Code. Fehlermeldung bei Dim von New File und Folder. Benutzerdefiniertes Format!! Vielleicht hilft dir dieser Code weiter.
    mfg Piet
  • Dim z As Long
    
    Sub Auflisten()
    Dim objShell As Object
    Dim objFolder As Variant
    Dim x As Object, y As Object
    Set objShell = CreateObject("Shell.Application")
    With objShell
    Set objFolder = .BrowseForFolder(0&, "Inhaltsverzeichnis erstellen für:", 0, "G:\")
    End With
    Set x = CreateObject("Scripting.FileSystemObject")
    Set y = x.GetFolder(objFolder.self.Path)
    Rows("2:" & Rows.Count).Delete Shift:=xlUp
    Range("B3") = y.Path
    Range("B3").Font.ColorIndex = 5
    z = 3
    Dateien y.Files     'Inhalt gewählter Ordner
    Ordner y            ' Inhalt aller Unterordner
    End Sub
    
    
    Sub Dateien(Objekt As Object)
    Dim Item As Object
    Dim Level As Object
    For Each Item In Objekt
    z = z + 1
    Cells(z, 2) = Item.Name
    Next
    End Sub
    
    
    Sub Ordner(Objekt As Object)
    Dim Ordnername$, Ordnername2$
    Dim Item As Object
    For Each Item In Objekt.SubFolders
    z = z + 2
    Cells(z, 2) = Item.Path
    Cells(z, 2).Font.ColorIndex = 5
    Dateien Item.Files
    Ordner Item
    Next
    End Sub
    

  • Anzeige

    353 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige