Macro Listar dir() carpetas y dir() Subcarpetas error

Inicio VBA Macro Listar dir() carpetas y dir() Subcarpetas error

Este debate contiene 2 respuestas, tiene 2 mensajes y lo actualizó  AngelGil hace 5 años .

Viendo 3 publicaciones - del 1 al 3 (de un total de 3)
  • Autor
    Publicaciones

  • Agnes
    Participant

    Hola a todos, tengo hecha una macro que lista carpetas de 1 ruta y después con los datos de la 1 lista saco 2 lista de carpetas. Pero se ve al listar la 2 ruta se guarda en los datos de la 1, nose como hacer que cada una tenga su lista.

     Code: arbitrary (select
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    29.
    30.
    31.
    32.
    33.
    34.
    35.
    36.
    37.
    38.
    39.
    40.
    41.
    42.
    43.
    44.
    45.
    46.
    47.
    48.
    49.
    50.
    51.
    52.
    53.
    54.
    55.
    56.
    57.
    58.
    59.
    60.
    61.
    62.
    63.
    64.
    65.
    66.
    67.
    68.
    69.
    70.
    71.
    72.
    73.
    74.

    'mySourcePath es la ruta princpical de la 1 lista
        Sub ListMyFiles(mySourcePath)
        ' List the files and directories within "C:\".
        mySourcePath = mySourcePath & "\"
        Dim fList As String
        Dim fLists As String
        Dim fName As String
        Dim fNames As String
        Dim numero As String
        numero = 0
        iRow = 2
        For inicios = 0 To Total
        fName = Dir(mySourcePath, vbDirectory)
        ' The variable fName now contains the name of the first file or directory within "C:\".
        If InStr(fNames, ".") > 0 Then
                numero = Left(fNames, InStr(fNames, ".") - 1)
                ElseIf InStr(fNames, "..") > 0 Then
                numero = Left(fNames, InStr(fNames, "..") - 1)
        End If
        If numero = "" Then
        inicios = 0
        End If
        Do While fName <> ""
        ' Store the current file or directory name in the string fList.
        fList = fList & vbNewLine & fName
        datos = Range("A" & iRow).Value
        aux = 0
        MsgBox "Ruta 1.1: " & fList
        MsgBox "Datos: " & datos
        If datos <> fName Then
        fName = Dir()
        ElseIf datos = fName Then
               'la otra ruta modifica para que lista otras carpetas
                rutas = mySourcePath & fName & "\ASUNTOS\"
            fNames = Dir(rutas, vbDirectory)
            Do While fNames <> ""
            'fLists = fLists & vbNewLine & fNames
            ' Get the next file or directory within "C:\".
            If InStr(fNames, ".") > 0 Then
                numero = Left(fNames, InStr(fNames, ".") - 1)
                ElseIf InStr(fNames, "-") > 0 Then
                numero = Left(fNames, InStr(fNames, "-") - 1)
                ElseIf InStr(fNames, "_") > 0 Then
                numero = Left(fNames, InStr(fNames, "_") - 1)
            End If
            If numero = "" Then
            fNames = Dir()
            End If
            If numero <> "" Then
            iRows = 2
            For inicio = 0 To Total
            dato = Range("B" & iRows).Value
            If dato = numero Then
            Range("F" & iRows).Value = numero
            ruta = fNames + numero
            ActiveSheet.Hyperlinks.Add Anchor:=Cells(iRows, "E"), Address:=ruta, TextToDisplay:=numero
            End If
            If dato <> numero Then
            End If
            If dato = "" Then
            End If
            iRows = iRows + 1
            Next inicio
            fNames = Dir()
            End If
            Loop
        iRow = iRow + 1
        End If
        Loop
        fName = fName
        fName = Dir()
        iRow = iRow + 1
        Next inicios
        End Sub


    Agnes
    Participant

    Total es cuantos datos hay en las columna E, que lo recorro con un For para comprar los datos, si es igual al nombre de la carpeta.
    Busco en sub carpetas si existe un nombre de la columna H, que se llame igual y si es así hago el hipervínculo.
    Ejemplo:
    Columna E Columna H
    500 Alfredo
    752 Maria
    800 Ana
    450 Ethan
    1052 Alvaro

    Rutas:
    C:\Users\usuario\Documents\500
    C:\Users\usuario\Documents\800
    C:\Users\usuario\Documents\450
    C:\Users\usuario\Documents\500\ASUNTOS\Maria
    C:\Users\usuario\Documents\500\ASUNTOS\Alvaro
    C:\Users\usuario\Documents\800\ASUNTOS\Ana

    En fList me sale:
    .
    ..
    500
    500

    Tendría que salir:
    .
    ..
    500
    752


    AngelGil
    Moderator

    Hola
    Hay varias cosas…

    -Imagino que la variable Total la tendrás declarada como variable global y le asignarás valor en otro procedimiento.
    -No sé qué haces con la variable inicios. En principio es el contador del bucle for, pero no la utilizas para nada más. Sin embargo, hay una instrucción que le asigna valor 0. Imagino que será para que no cuente los resultados «.» y «..»
    -Tienes dos instrucciones Dir() anidadas. Esto no se puede hacer (que yo sepa) y da error.

    Hasta donde yo sé, puedes hacer un primer recorrido con Dir() repasando todos los archivos y carpetas del primer nivel, y almacenando cada valor en una lista, un array o un diccionario, como prefieras.
    Posteriormente, empieza a recorrer tu array y ahí es donde haces el Dir() de los subdirectorios (en tu caso lo que cuelga dentro de \ASUNTOS\)

    De todas maneras, obviando todo el trabajo dentro de los directorios, tu bucle es algo así:

     Code: arbitrary (select
    1.
    2.
    3.
    4.
    5.

    If datos<> fName then
      fName = Dir()
    Else
      Hace muchas cosas
    End If

    Una nota formal: no te hace falta escribir «ElseIf datos = fName» porque no hay más opciones. O es igual o no. Por lo tanto, con poner un if.. else.. end if sería suficiente.
    Y ahora a lo importante: cuando datos = fName, no actualizas fName. Es decir, no le asignas el siguiente valor. Por eso te sale repetido en fList.
    Prueba a escribir algo como:

     Code: arbitrary (select
    1.
    2.
    3.
    4.
    5.
    6.

    If datos<> fName then
      fName = Dir()
    Else
      Hace muchas cosas
      fName = Dir
    End If

    O mejor:

     Code: arbitrary (select
    1.
    2.
    3.
    4.

    If datos= fName then
      Hace muchas cosas
    End If
    fName = Dir

    Un saludo

Viendo 3 publicaciones - del 1 al 3 (de un total de 3)

Debes estar registrado para responder a este debate.