Created
February 3, 2022 10:38
-
-
Save Susensio/0c5745479c0c6b65b35dc060bb6002bf to your computer and use it in GitHub Desktop.
Find paths in VBA with wilcard pattern in subdirectories, using DIR funcion
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Public Function FindPathRecursive(StartFolder As String, Pattern As String, Optional SearchMode As VbFileAttribute = vbNormal) As String | |
' Función recursiva que permite buscar rutas con coincidencia de patrones, usando el widlcard comodín * | |
' Por ejemplo, permite buscar el archivo | |
' \\srvfs1\etiquetas\Bartender\Plantillas envase\UA_*\124755_*\L_Delantera.* | |
' con los parámetros | |
' StartFolder = "\\srvfs1\etiquetas\Bartender\Plantillas envase\" | |
' Pattern = "UA_*\124755_*\L_Delantera.*" | |
' devolviendo como resultado | |
' \\srvfs1\etiquetas\Bartender\Plantillas envase\UA_UCRANIA\124755_SPECTR-AGRO LLC\L_Delantera.btw | |
' en caso de no encontrar el archivo, devuelve un string vacío "" | |
Dim lastTokenIndex As Integer | |
Dim lastTokenPattern As String | |
Dim subFolderPattern As String | |
Dim subFolder As String | |
Dim found As String | |
' La carpeta de inicio siempre tiene que acabar con una contrabarra | |
If Right(StartFolder, 1) <> "\" Then | |
StartFolder = StartFolder & "\" | |
End If | |
' Si dentro del Pattern hay subcarpetas (más de un token), busco la posición del último token para hacer la busqueda recursiva | |
' Esto hay que hacerlo "a mano" porque la función Dir no admite wildcards (*) en subcarpetas, solo admite en el último token | |
' Es decir, se puede hacer Dir("carpeta\subcarpeta\*.btw") | |
' pero NO se puede hacer Dir("carpeta\*\*.btw") | |
' | |
' ejemplo: | |
' Pattern = "UA_*\124755_*\L_Delantera.*" | |
' _____^ | |
' lastTokenIndex = 14 | |
lastTokenIndex = InStrRev(Pattern, "\") | |
' Si existen subcarpetas en el pattern | |
If lastTokenIndex > 0 Then | |
lastTokenPattern = Right(Pattern, Len(Pattern) - lastTokenIndex) | |
subFolderPattern = Left(Pattern, lastTokenIndex - 1) | |
' Siguiendo el ejemplo, serían: | |
' lastTokenPattern = "L_Delantera.*" | |
' subFolderPattern = "UA_*\124755_*" | |
' Vuelvo a llamar a la función, ahora con los parámetros "reducidos" | |
' es decir, le quito el último token y busco la carpeta | |
' \\srvfs1\etiquetas\Bartender\Plantillas envase\UA_*\124755_*\ | |
subFolder = FindPathRecursive(StartFolder, subFolderPattern, vbDirectory) | |
If subFolder <> "" Then | |
' Si encuentro la subcarpeta, ahora si, gestiono el último token y busco | |
' \\srvfs1\etiquetas\Bartender\Plantillas envase\UA_UCRANIA\124755_SPECTR-AGRO LLC\L_Delantera.* | |
found = FindPathRecursive(subFolder, lastTokenPattern, SearchMode) | |
End If | |
Else | |
' Caso base, solo hay un token, se llama directamente a la función Dir | |
' Ejemplo: si entro a la función buscando el archivo | |
' \\srvfs1\etiquetas\Bartender\Plantillas envase\UA_UCRANIA\124755_SPECTR-AGRO LLC\L_Delantera.* | |
' la función dir me devuelve: | |
' L_Delantera.btw | |
' y devuelvo la ruta completa | |
found = Dir(StartFolder & Pattern, SearchMode) | |
If found <> "" Then | |
found = StartFolder & found | |
End If | |
End If | |
FindPathRecursive = found | |
End Function |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment