Modificar macro que busca archivos y cambia de color el texto dependiendo si esta o no, para que la búsqueda abarque subcarpetas

Ya tengo dos macros una ya realiza la búsqueda en subcarpetas y la otra macro que solo buscaba en una carpeta y hace el cambio de color dependiendo si encontró o no el archivo intente modificarla para que en la macro que realiza la revisión de si están o no los archivos también accediera la búsqueda en las subcarpetas pero no me queda espero me pueda ayudar a estructurarla a continuación le dejo las macros por separado gracias :3

Búsqueda en carpeta y subcarpetas

Dim rutas As New Collection
'
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Por.Dante Amor
    If Target.Column <> 2 Then Exit Sub 'sólo se ejecutará en col B'
    If Target.Row < 9 Then Exit Sub 'sólo se ejecuta a partir de la fila 9'
    If Target.Value = " " Or Target.Value = "" Then Exit Sub 'no se ejecutara en celdas vacias
    'ChDir "C:\Users\cari\Documents\libros\" 'ruta de carpeta donde estan los documentos
    ChDir ThisWorkbook.Path & "\"
    'ChDir "C:\trabajo\"
    Set rutas = Nothing
    nombre = Target.Value
    If UCase(Right(nombre, 4)) = ".PDF" Then
        nuevo = Left(nombre, Len(nombre) - 4)
    Else
        nuevo = nombre
    End If
    arch = encuentraarch(nuevo)
    If arch <> "" Then
        If MsgBox("el archivo existe. Desea abrirlo??", vbYesNo, "ATENCION") = vbNo Then Exit Sub
        'ActiveWorkbook.FollowHyperlink arch
        Shell "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe " & arch
    Else
        If MsgBox("no fue localizado desea buscarlo manualmente", vbYesNo, "ATENCION") = vbNo Then Exit Sub
        On Error GoTo salida
        ChDir "C:\Users\cari\Documents\libros\"
        archivo = Application.GetOpenFilename
        If archivo = False Then Exit Sub
        Shell "C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32.exe " & archivo
        Exit Sub
    End If
salida:     MsgBox "Listo"
End Sub
'
Function encuentraarch(nuevo)
'Por.Dante Amor
    On Error Resume Next
    pPath = CurDir()
    rutas.Add pPath
    pPath = pPath & "\"
    Call agregadir(pPath)
    For Each sd In rutas
        dato = sd & "\*" & nuevo & "*.pdf"
        arch = Dir(sd & "\*" & nuevo & "*.pdf")
        Do While arch <> ""
            encuentraarch = sd & "\" & arch
            Exit Function
        Loop
    Next
    Set rutas = Nothing
End Function
'
Sub agregadir(lpath)
'Por.Dante Amor
    'Agrega directorios
    Dim SubDir As New Collection
    If Right(lpath, 1) <> "\" Then lpath = lpath & "\"
    DirFile = Dir(lpath & "*", vbDirectory)
    Do While DirFile <> ""
        'Agrega subdirectorios a collection
        If DirFile <> "." And DirFile <> ".." Then _
            If ((GetAttr(lpath & DirFile) And vbDirectory) = 16) Then _
                SubDir.Add lpath & DirFile
        DirFile = Dir
    Loop
    '
    For Each sd In SubDir
        rutas.Add sd
        Call agregadir(sd)
    Next
End Sub

lo que necesito es que la macro revisar archivos también realice la busqueda en las subcarpetas copie las no encontradas en la hoja 5 a partir de la celda A1 y que se limpie la hoja5 cada que se ejecute la macro revisar archivo,  que se complemente o integre la macro de arriba con la de abajo a la hora de hacer la revisión en los comentarios le dejo la macro revisiónArchivo 

De antemano gracias :3 espero tenga lindo día y muy buen Fin de semana

Respuesta
1

H o l a:

Cambia la macro RevisarArchivo por lo siguiente, deberás poner todo en un módulo, observa como al principio de todas las macros va la declaración de la variable rutas

Dim rutas As New Collection
'
Function encuentraarch(nuevo)
'Por.Dante Amor
    On Error Resume Next
    pPath = CurDir()
    rutas.Add pPath
    pPath = pPath & "\"
    Call agregadir(pPath)
    For Each sd In rutas
        dato = sd & "\*" & nuevo & "*.pdf"
        arch = Dir(sd & "\*" & nuevo & "*.pdf")
        Do While arch <> ""
            encuentraarch = sd & "\" & arch
            Exit Function
        Loop
    Next
    Set rutas = Nothing
End Function
'
Sub agregadir(lpath)
'Por.Dante Amor
    'Agrega directorios
    Dim SubDir As New Collection
    If Right(lpath, 1) <> "\" Then lpath = lpath & "\"
    DirFile = Dir(lpath & "*", vbDirectory)
    Do While DirFile <> ""
        'Agrega subdirectorios a collection
        If DirFile <> "." And DirFile <> ".." Then _
            If ((GetAttr(lpath & DirFile) And vbDirectory) = 16) Then _
                SubDir.Add lpath & DirFile
        DirFile = Dir
    Loop
    '
    For Each sd In SubDir
        rutas.Add sd
        Call agregadir(sd)
    Next
End Sub
'
Sub RevisarArchivos()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h5 = Sheets("Hoja5")
    h5.Cells.Clear
    j = 1
    For i = 9 To Range("B" & Rows.Count).End(xlUp).Row
        'ChDir "C:\Users\cari\Documents\libros\"
        'ChDir ThisWorkbook.Path & "\"
        ChDir "C:\trabajo\"
        nombre = Cells(i, "B")
        If UCase(Right(nombre, 4)) = ".PDF" Then
            nuevo = Left(nombre, Len(nombre) - 4)
        Else
            nuevo = nombre
        End If
        '
        arch = encuentraarch(nuevo)
        If arch <> "" Then
            Cells(i, "B").Font.ColorIndex = 4
        Else
            Cells(i, "B").Font.ColorIndex = vbBlack
            Rows(i).Copy
            h5.Cells(j, "A").PasteSpecial xlValues
            j = j + 1
        End If
    Next
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

‘
Saludos. D a n t e A m o r. Recuerda valorar la respuesta. G r a c i a s
:) 

1 respuesta más de otro experto

Respuesta
1

Esta es la macro que revisa archivos

Sub RevisarArchivos()
'Por.Dante Amor
Application.ScreenUpdating = False
Set h5 = Sheets("Hoja5")
j = h5.Range("B" &amp; Rows.Count).End(xlUp).Row + 1
For i = 9 To Range("B" &amp; Rows.Count).End(xlUp).Row
'ChDir "C:\Users\cari\Documents\libros\"
ChDir ThisWorkbook.Path &amp; "\"
nombre = Cells(i, "B")
Set fso = CreateObject("scripting.filesystemobject")
If fso.fileexists(CurDir() &amp; "\" &amp; nombre) Then
Cells(i, "B").Font.ColorIndex = 4
Else
Cells(i, "B").Font.ColorIndex = xlNone
Rows(i).Copy
h5.Cells(j, "A").PasteSpecial xlValues
j = j + 1
End If
Next
Application.CutCopyMode = False
Application.ScreenUpdating = True
MsgBox "Fin"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas