Carpeta de código VBA contenida en la biblioteca

fragmentos que aparecen como parte del menú de carpetas de VBA

La biblioteca de código VBA contiene código relacionado con las carpetas: dos fragmentos para hacer un bucle en una carpeta, una función FolderExists y un procedimiento para crear carpetas con subcarpetas.

La imagen de la derecha muestra el menú Código VBA " VBA " Carpeta donde los elementos de la biblioteca VBA están en la parte inferior. Los otros elementos son procedimientos estándar de carpetas VBA y una herramienta especial para crear fácilmente una cadena de carpetas.

Rellenar array con subcarpetas utilizando Dir


Dim strItemInFolder As String
Dim FolderList() As String 'The array with found folders
Dim intFoundFolders As Integer
strItemInFolder = Dir(vbDirectory)
Do Mientras strItemInFolder <> ""
    If ((GetAttr(strFolder & strItemInFolder) And vbDirectory) = vbDirectory) And _
        Not (strItemInFolder = "." Or strItemInFolder = "..") Then
            ReDim Preserve FolderList(intFoundFolders)
            FolderList(intCarpetasEncontradas) = strItemInFolder
            intCarpetasEncontradas = intCarpetasEncontradas + 1
    Fin If
    strItemInFolder = Dir
Bucle

Carpetas en bucle mediante Dir


Dim strItemInFolder As String
strItemInFolder = Dir(vbDirectory)
Do Mientras strItemInFolder <> ""
    If ((GetAttr( & strItemInFolder) And vbDirectory) = vbDirectory) And _
        Not (strItemInFolder = "." Or strItemInFolder = "") Then
        TODO: reemplace Debug.Print por el proceso que desee realizar en la subcarpeta
        Dim strFilePath As String: strFilePath = strFolder & strItemInFolder
        Debug.Print strItemInFolder
    Fin If
    strItemInFolder = Dir
Bucle

Comprobar si existe una carpeta

La función FolderExists en acción dentro de una sentencia If
La función FolderExists en acción dentro de una sentencia If

Public Function FolderExists(Directory As String) As Boolean
    If Len(Dir(Directory, vbDirectory)) > 0 Then
        If GetAttr(Directory) = vbDirectory Then
            FolderExists = True
        End If
    End If
End Function

Crear varios directorios anidados


Public Function MakeDirMulti(DirSpec As String) As Boolean
'Creates multiple nested directories. (Author C Pearson)
'This is a replacement function for the VBA MkDir function. MkDir
' will create only the last (right-most) directory of a
' path specification, and all directories to the left of the
' last director must already exist. For example, the following will fail
'       MkDir "C:\Folder\Subfolder1\Subfolder2\Subfolder3"
' will fail unless "C:\Folder\Subfolder1\Subfolder2\" already
' exists. MakeDirMulti will create all the folders in
' "C:\Folder\Subfolder1\Subfolder2\Subfolder3" as required.
' If a "\\" string is found, it is converted to "\".
' At present, MakeDirMulti supports local and mapped drives,
' but not UNC paths.
' The function will return True even if no directories were
' created (all directories in DirSpec already existed).
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim Ndx As Long
    Dim Arr As Variant
    Dim DirString As String
    Dim TempSpec As String
    Dim DirTestNeeded As Boolean
    
    ''''''''''''''''''''''''''''''''
    ' Ensure DirSpec is valid.
    ''''''''''''''''''''''''''''''''
    If Trim(DirSpec) = vbNullString Then
        MakeDirMulti = False
        Exit Function
    End If
    If Len(DirSpec) > MAX_PATH Then
        MakeDirMulti = False
        Exit Function
    End If
    If Not ((Mid(DirSpec, 2, 1) = ":") Or (Mid(DirSpec, 3, 1) = ":")) Then
        MakeDirMulti = False
        Exit Function
    End If
    
    '''''''''''''''''''''''''''''''''''''
    ' Set DirTestNeeded to True. This
    ' indicates that we need to test to
    ' see if a folder exists. Once we
    ' create the first directory, there
    ' will no longer be a need to call
    ' Dir to see if a folder exists, since
    ' the newly created directory will, of
    ' course, have no existing subfolders.
    ''''''''''''''''''''''''''''''''''''''
    DirTestNeeded = True
    TempSpec = DirSpec
    '''''''''''''''''''''''''''''''''''''
    ' If there is a trailing \ character,
    ' delete it.
    '''''''''''''''''''''''''''''''''''''
    If Right(TempSpec, 1) = "\" Then
        TempSpec = Left(TempSpec, Len(TempSpec) - 1)
    End If
    
    '''''''''''''''''''''''''''''''''
    ' Split DirSpec into an array,
    ' delimited by "\".
    '''''''''''''''''''''''''''''''''
    Arr = Split(expression:=TempSpec, delimiter:="\")
    ''''''''''''''''''''''''''''''''''''
    ' Loop through the array, building
    ' up DirString one folder at a time.
    ' Each iteration will create
    ' one directory, moving left to
    ' right if the folder does not already
    ' exist.
    ''''''''''''''''''''''''''''''''''''
    For Ndx = LBound(Arr) To UBound(Arr)
        '''''''''''''''''''''''''''''''''
        ' If this is the first iteration
        ' of the loop, just take Arr(Ndx)
        ' without prefixing it with the
        ' existing DirString and path
        ' separator.
        '''''''''''''''''''''''''''''''''
        If Ndx = LBound(Arr) Then
            DirString = Arr(Ndx)
        Else
            DirString = DirString & Application.PathSeparator & Arr(Ndx)
        End If
        On Error GoTo ErrH:
        ''''''''''''''''''''''''''''''''''
        ' Only call the Dir function
        ' if we have yet to create a
        ' new directory. Once we create
        ' a new directory, we no longer
        ' need to call Dir, since the
        ' newly created folder will, of
        ' course, have no subfolders.
        '''''''''''''''''''''''''''''''''
        If DirTestNeeded = True Then
            If Dir(DirString, vbDirectory + vbSystem + vbHidden) = vbNullString Then
                DirTestNeeded = False
                MkDir DirString
            End If
        Else
            MkDir DirString
        End If
        On Error GoTo 0
    Next Ndx
    
    MakeDirMulti = True
    Exit Function
    
    ErrH:
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' If an error occured, typically because an invalid
    ' character was encountered in a directory name, return
    ' False.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    MakeDirMulti = False
End Function