es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encontrar un nombre de archivo a partir de un texto parcial seleccionado.

Agarré el código de otra persona y probé varias funciones diferentes para adaptarlo a mis necesidades.

Utilizo un documento de Word para informes de PLC. Estoy tratando de tomar el texto seleccionado (como un número de estación, por ejemplo BM150) y encontrar un archivo a partir del texto parcial dentro de cualquier subcarpeta desde la ruta designada, y luego crear un hipervínculo hacia él.

Sub HLinkSelectedText()
Dim strPath As String
Dim StrSelection As Range
Dim sName As String
Dim fs As String

strPath = "ruta_del_archivo" 'la ruta para buscar

Set StrSelection = Selection.Range
sName = Dir$(strPath & Trim(StrSelection.Text) & ".*") 'cambiar la extensión a ".*" para cualquier archivo
fs = strPath & sName
If Not sName = "" Then
    StrSelection.Hyperlinks.Add Anchor:=StrSelection, Address:=fs, TextToDisplay:=Trim(StrSelection.Text)
Else
    MsgBox "No se encontró el documento correspondiente"
End If
End Sub

Esto funciona si escribo el nombre exacto del archivo y la ruta exacta del archivo, pero solo ingreso parte del nombre del archivo en el informe, y quiero que busque en varias subcarpetas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para buscar un archivo a partir de un texto parcial en cualquier subcarpeta de la ruta designada y luego vincularlo, puedes modificar el código de la siguiente manera:

    Sub HLink_Selected_Text()
    Dim strPath As String
    Dim StrSelection As Range
    Dim sName As String
    Dim fs As String
    
    strPath = "ruta_del_archivo" 'la ruta a buscar
    
    Set StrSelection = Selection.Range
    
    'iterar a través de todos los archivos en las subcarpetas de strPath
    sName = SearchForFile(strPath, Trim(StrSelection.Text) & ".*")
    fs = strPath & sName
    
    If Not sName = "" Then
        StrSelection.Hyperlinks.Add Anchor:=StrSelection, Address:=fs, TextToDisplay:=Trim(StrSelection.Text)
    Else
        MsgBox "Documento coincidente no encontrado"
    End If
    End Sub
    
    
    Function SearchForFile(ByVal strPath As String, ByVal strMask As String) As String
    Dim fso As Object 'FileSystemObject
    Dim fld As Object 'Folder
    Dim fil As Object 'File
    Dim subFld As Object 'SubFolder
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fld = fso.GetFolder(strPath)
    
    'iterar a través de todos los archivos en la carpeta y sus subcarpetas
    For Each fil In fld.Files
        If fil.Name Like strMask Then
            SearchForFile = fil.Name
            Exit Function
        End If
    Next
    
    'iterar a través de todas las subcarpetas
    For Each subFld In fld.SubFolders
        SearchForFile = SearchForFile(subFld.Path, strMask)
        If Not SearchForFile = "" Then
            Exit Function
        End If
    Next
    
    End Function
    

    Este código utiliza una función recursiva llamada SearchForFile para iterar a través de todos los archivos en una carpeta y sus subcarpetas hasta que encuentra un archivo con un nombre que coincida con el texto parcial. Esto te permite ingresar solo parte del nombre del archivo en el informe y buscar en múltiples subcarpetas.

Comments are closed.