Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1676to1680
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Prüfen, ob Unterordner existieren

Prüfen, ob Unterordner existieren
23.02.2019 12:25:55
Roman
Hallo miteinander,
habe einen netten Code, der Unterordner abfragt. Nun habe ich gemerkt, wenn keine Unterordner existieren, bekomme ich einen Laufzeitfehler. Ist es möglich zu prüfen, ob die Unterordner existieren und wenn nicht, dass nur der Hauptordner abgefragt wird? Hoffe jemand kann mir weiterhelfen. Ich kann natürlich auch alles mit Nein beantworten, damit es funktioniert, aber vielleicht weiß jemand von euch eine Lösung.
Hier der Code bzw. ein der Teil, der die Abfrage macht:
    Dim oWkb1 As Workbook, oWks1 As Worksheet, oWks0 As Worksheet
Dim aCells As Variant, iNextLine As Long, i As Long
Dim StatusCalc As XlCalculation
Dim avntFolders() As Variant, avntTempFolder() As Variant
Dim strFile As String, sXlsPath As String, strSelectedFolder() As String
Dim ialngFolders As Long, ialngIndex As Long, lngCount As Long
sXlsPath = ThisWorkbook.Path & "\" 'Datei im gleichen Ordner wie Auswertungsdateien
'Abfrage aller Unterordner (Die Abfragetabelle befindet sich dabei im Hauptordner)
If MsgBox("Alle Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") = vbYes Then
avntFolders = GetFolders(sXlsPath) 'Hauptordner und alle Unterordner
ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1) 'Mit + 1 die  _
Unterordner der Unterordner auch mitabfragen
'Folgende Zeile mit ' ausklammern, wenn Dateien des Hauptordners nicht berücksichtigt  _
werden sollen
'avntFolders(UBound(avntFolders)) = sXlsPath
Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
Else
'Abfrage ausgewählter Unterordner (Die Abfragetabelle befindet sich dabei im  _
Hauptordner)
If MsgBox("Nur bestimmte Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") =  _
vbYes Then
With UserForm1
.Path = sXlsPath
Call .Show
If .Cancel Then
Call Unload(Object:=UserForm1)
Exit Sub
Else
strSelectedFolder = .Folders
Call Unload(Object:=UserForm1)
End If
End With
For ialngIndex = LBound(strSelectedFolder) To UBound(strSelectedFolder)
avntTempFolder = GetFolders(strSelectedFolder(ialngIndex))
If SafeArrayGetDim(avntTempFolder)  0 Then
ReDim Preserve avntTempFolder(LBound(avntTempFolder) To UBound( _
avntTempFolder) + 1) 'Mit + 1 die Unterordner der Unterordner auch mitabfragen
Else
ReDim avntTempFolder(0)
End If
avntTempFolder(UBound(avntTempFolder)) = strSelectedFolder(ialngIndex)
ReDim Preserve avntFolders(LBound(avntTempFolder) To UBound(avntTempFolder) +  _
lngCount)
For ialngFolders = LBound(avntTempFolder) To UBound(avntTempFolder)
avntFolders(ialngFolders + lngCount) = avntTempFolder(ialngFolders)
Next
lngCount = lngCount + ialngFolders
Next
ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1) 'Mit + 1  _
die Unterordner der Unterordner auch mitabfragen
'Folgende Zeile mit ' ausklammern, wenn Dateien des Hauptordners nicht berü _
cksichtigt werden sollen
'avntFolders(UBound(avntFolders)) = sXlsPath
Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
Else
'Wenn alles mit Nein beantwortet wurde, werden nur die Dateien im Hauptordner  _
abgefragt
avntFolders = Array(sXlsPath) 'Nur Hauptordner ohne Unterordner
End If
End If
Und hier der Code für GetFolders und QuickSort:
Private Function GetFolders(ByVal pvstrPath As String) As Variant()
Dim avntFolders() As Variant
Dim strFolder As String, strPath As String
Dim ialngIndex1 As Long, ialngIndex2 As Long
strPath = pvstrPath
Do
strFolder = Dir$(strPath & "*", vbDirectory)
Do Until strFolder = vbNullString
If strFolder  "." And strFolder  ".." Then
If GetAttr(strPath & strFolder) And vbDirectory Then
ReDim Preserve avntFolders(0 To ialngIndex1)
avntFolders(ialngIndex1) = strPath & strFolder & "\"
ialngIndex1 = ialngIndex1 + 1
End If
End If
strFolder = Dir$
Loop
If ialngIndex1 = ialngIndex2 Then Exit Do
strPath = avntFolders(ialngIndex2)
ialngIndex2 = ialngIndex2 + 1
Loop
GetFolders = avntFolders
End Function
Private Sub QuickSort(ByVal pvlngLBound As Long, ByVal pvlngUbound As Long, ByRef prvntArray As  _
Variant)
Dim lngIndex1 As Long, lngIndex2 As Long
Dim vntTemp As Variant, vntBuffer As Variant
lngIndex1 = pvlngLBound
lngIndex2 = pvlngUbound
vntBuffer = prvntArray(Fix(pvlngLBound + pvlngUbound) / 2)
Do
Do While prvntArray(lngIndex1)  lngIndex2
If pvlngLBound 

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prüfen, ob Unterordner existieren
23.02.2019 14:31:16
Nepumuk
Hallo Roman,
teste mal:
Public Sub Daten_aus_Protokollen_kopieren()
    
    Const WITH_MAINFOLDER As Boolean = False 'Mit oder ohne Hauptordner *** Hier True oder False eintragen ***
    
    Const iStartZeile As Long = 4 'Angeben, ab welcher Zeile eingefügt werden soll
    Const iStartSpalte As Long = 1 'Angeben, ab welcher Spalte eingefügt werden soll
    Const Zellen As String = "D3,K3,K7,H34,R3,D5,K5,R5,A29" 'Angeben, welche Zellen kopiert werden sollen
    
    Dim oWkb1 As Workbook, oWks1 As Worksheet, oWks0 As Worksheet
    Dim aCells As Variant, iNextLine As Long, i As Long
    Dim StatusCalc As XlCalculation
    Dim avntFolders() As Variant, avntTempFolder() As Variant
    Dim strFile As String, sXlsPath As String, strSelectedFolder() As String
    Dim ialngFolders As Long, ialngIndex As Long, lngCount As Long
    
    sXlsPath = ThisWorkbook.Path & "\" 'Datei im gleichen Ordner wie Auswertungsdateien
    
    If MsgBox("Alle Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") = vbYes Then
        
        avntFolders = GetFolders(sXlsPath) 'Hauptordner und alle Unterordner
        
        If WITH_MAINFOLDER Then
            Redim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
            avntFolders(UBound(avntFolders)) = sXlsPath
        End If
        
        If SafeArrayGetDim(avntFolders) = 0 Then
            Call MsgBox("Keine ordner gefunden.", vbExclamation, "Hinweis")
            Exit Sub
        End If
        
        Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
        
    Else
        
        If MsgBox("Nur bestimmten Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") = vbYes Then
            
            With UserForm1
                
                .Path = sXlsPath
                
                Call .Show
                
                If .Cancel Then
                    Call Unload(Object:=UserForm1)
                    Exit Sub
                Else
                    strSelectedFolder = .Folders
                    Call Unload(Object:=UserForm1)
                End If
            End With
            
            For ialngIndex = LBound(strSelectedFolder) To UBound(strSelectedFolder)
                
                avntTempFolder = GetFolders(strSelectedFolder(ialngIndex))
                
                If SafeArrayGetDim(avntTempFolder) = 0 Then
                    Redim avntTempFolder(0)
                Else
                    Redim Preserve avntTempFolder(LBound(avntTempFolder) To UBound(avntTempFolder) + 1)
                End If
                
                avntTempFolder(UBound(avntTempFolder)) = strSelectedFolder(ialngIndex)
                
                Redim Preserve avntFolders(LBound(avntTempFolder) To UBound(avntTempFolder) + lngCount)
                
                For ialngFolders = LBound(avntTempFolder) To UBound(avntTempFolder)
                    
                    avntFolders(ialngFolders + lngCount) = avntTempFolder(ialngFolders)
                    
                Next
                
                lngCount = lngCount + ialngFolders
                
            Next
            
            If WITH_MAINFOLDER Then
                Redim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
                avntFolders(UBound(avntFolders)) = sXlsPath
            End If
            
            If SafeArrayGetDim(avntFolders) = 0 Then
                Call MsgBox("Keine ordner gefunden.", vbExclamation, "Hinweis")
                Exit Sub
            End If
            
            Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
            
        Else
            
            avntFolders = Array(sXlsPath) 'Nur Hauptordner ohne Unterordner
            
        End If
    End If
    
    'Makrobremsen lösen - Am Beginn eines Makros
    With Application
        .EnableEvents = False
        StatusCalc = .Application.Calculation 'Aktuellen Berechnungsmodus merken
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With
    
    'Vorgegebenen Tabelleninhalt vor dem Kopieren der Daten löschen
    Range("A4:I1000").ClearContents
    
    Set oWks0 = ActiveSheet
    
    aCells = Split(Zellen, ",")
    
    iNextLine = iStartZeile
    
    For ialngFolders = LBound(avntFolders) To UBound(avntFolders)
        
        strFile = Dir$(avntFolders(ialngFolders) & "*.xlsx")
        
        Do Until strFile = vbNullString
            
            Set oWkb1 = Workbooks.Open(avntFolders(ialngFolders) & strFile)
            Set oWks1 = oWkb1.Sheets(1)
            
            For i = 0 To UBound(aCells)
                oWks0.Cells(iNextLine, iStartSpalte).Offset(0, i).Value = _
                    oWks1.Range(aCells(i)).Value
            Next
            
            Call oWkb1.Close(SaveChanges:=False)
            
            iNextLine = iNextLine + 1
            
            strFile = Dir$
            
        Loop
    Next
    
    Set oWks0 = Nothing
    Set oWks1 = Nothing
    Set oWkb1 = Nothing
    
    'Makrobremsen zurücksetzen - vor dem Beenden eines Makros
    With Application
        .EnableEvents = True
        .Calculation = StatusCalc
        .ScreenUpdating = True
    End With
End Sub

Beachte die erste Programmzeile. Über die steuerst du ob mit oder ohne Hauptordner.
Gruß
Nepumuk
Anzeige
AW: Prüfen, ob Unterordner existieren
23.02.2019 16:16:50
Roman
Hallo Nepumuk,
ich danke für die Rückmeldung. Werde es heute Abend oder morgen testen. Auf den ersten Blick sieht es mit meinem Laienverständnis genial aus, sogar die Hauptordnerabfrage zum Steuern hast du integriert :) Ich bin froh, dass du dich dem angenommen hast, da der Hauptcode ja von dir ist (nochmals danke).
Ich gebe hier nach dem Testen Bescheid.
Gruß
Roman
AW: Prüfen, ob Unterordner existieren
24.02.2019 07:43:58
Hajo_Zi
Hallo Roman,
ein Beitrag ist offen, da noch eine Antwort gegeben werden soll.
Ist der Beitrag offen, weil jemand vorbei kommen soll? Das habe ich im Beitrag nicht gelesen.

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Die Beiträge werden auch ignoriert, es erfolgt keine Antwort.
Anzeige
AW: Prüfen, ob Unterordner existieren
24.02.2019 11:51:30
Roman
Hallo Nepumuk,
habe es gerade getestet, die Abfrage bleibt bei
        If WITH_MAINFOLDER Then
ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
avntFolders(UBound(avntFolders)) = sXlsPath
End If

hängen, da keine Unterordner vorhanden sind. Du hast WITH_MAINFOLDER eingebaut (was ich wirklich gut finde, den Hauptordner über eine Zeile zu bestimmen). Aber es wird nicht geprüft, ob Unterordner im Hauptordner vorhanden sind oder nicht.
@Hajo - Weil ich nicht daheim war.
Gruß
Roman
AW: Prüfen, ob Unterordner existieren
24.02.2019 12:08:52
Roman
So müsste es richtig funktionieren oder?
        avntFolders = GetFolders(sXlsPath) 'Hauptordner und alle Unterordner
'If WITH_MAINFOLDER Then
'ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
'avntFolders(UBound(avntFolders)) = sXlsPath
'End If
If SafeArrayGetDim(avntFolders) = 0 Then
'Call MsgBox("Keine ordner gefunden.", vbExclamation, "Hinweis")
'Exit Sub
avntFolders = Array(sXlsPath) 'Nur Hauptordner ohne Unterordner
Else
ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
avntFolders(UBound(avntFolders)) = sXlsPath
End If
Kann man das bei der Abfrage bestimmter Unterordner auch machen?
        If MsgBox("Nur bestimmten Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") = _
vbYes Then
With UserForm1
.Path = sXlsPath
Call .Show
If .Cancel Then
Call Unload(Object:=UserForm1)
Exit Sub
Else
strSelectedFolder = .Folders
Call Unload(Object:=UserForm1)
End If
End With
For ialngIndex = LBound(strSelectedFolder) To UBound(strSelectedFolder)
avntTempFolder = GetFolders(strSelectedFolder(ialngIndex))
If SafeArrayGetDim(avntTempFolder) = 0 Then
ReDim avntTempFolder(0)
Else
ReDim Preserve avntTempFolder(LBound(avntTempFolder) To UBound( _
avntTempFolder) + 1)
End If
avntTempFolder(UBound(avntTempFolder)) = strSelectedFolder(ialngIndex)
ReDim Preserve avntFolders(LBound(avntTempFolder) To UBound(avntTempFolder) +  _
lngCount)
For ialngFolders = LBound(avntTempFolder) To UBound(avntTempFolder)
avntFolders(ialngFolders + lngCount) = avntTempFolder(ialngFolders)
Next
lngCount = lngCount + ialngFolders
Next
'If WITH_MAINFOLDER Then
'ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
'avntFolders(UBound(avntFolders)) = sXlsPath
'End If
If SafeArrayGetDim(avntFolders) = 0 Then
'Call MsgBox("Keine ordner gefunden.", vbExclamation, "Hinweis")
'Exit Sub
avntFolders = Array(sXlsPath) 'Nur Hauptordner ohne Unterordner
Else
ReDim Preserve avntFolders(LBound(avntFolders) To UBound(avntFolders) + 1)
avntFolders(UBound(avntFolders)) = sXlsPath
End If
Call QuickSort(LBound(avntFolders), UBound(avntFolders), avntFolders)
Wenn ich z. B. auf Ja bei "Nur bestimmte Unterordner abfragen" und keine Unterordner vorhanden sind, soll nur der Hauptordner abgefragt werden.
Anzeige
AW: Prüfen, ob Unterordner existieren
24.02.2019 12:18:16
Nepumuk
Hallo Roman,
testen musst du schon selber.
Gruß
Nepumuk
AW: Prüfen, ob Unterordner existieren
24.02.2019 12:32:18
Roman
Hallo Nepumuk,
habe es so probiert
If MsgBox("Nur bestimmten Unterordner durchsuchen?", vbQuestion Or vbYesNo, "Abfrage") = vbYes And SafeArrayGetDim(avntFolders)  0 Then
aber es wird trotzdem nur der Hauptordner abgefragt, obwohl Unterordner vorhanden sind.
Gruß
Roman
AW: Prüfen, ob Unterordner existieren
24.02.2019 12:52:15
Roman
Ok, habe es jetzt mit
    avntFolders = GetFolders(sXlsPath) 'Hauptordner und alle Unterordner
If SafeArrayGetDim(avntFolders) = 0 Then
avntFolders = Array(sXlsPath) 'Nur Hauptordner ohne Unterordner
Else
vor der eigentlichen Abfrage gelöst. Danke Nepumuk für deine Hilfe.
Gruß
Roman
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige