web analytics

Convertir una ruta a formato UNC con VBA

A veces, sobretodo en entornos corporativos con varios equipos, necesitaremos referirnos a archivos que están en alguna unidad de red, y puede ser que para varios de dichos equipos la unidad de red asignada a ese recurso no sea la misma (M:, N:, J: …) por ello es inviable que, por ejemplo, desde una base de datos que guarda rutas intentemos encontrar algunos archivos que para cada uno de los equipos está en una ubicación diferente, aunque físicamente estén en el mismo lugar.

Mientras una ruta absoluta se indica con la letra de la unidad (C:/Carpeta/Subcarpeta) en una ruta UNC indicamos el equipo y el recurso compartido de la siguiente manera: \\equipo\recurso_compartido Esta ruta al archivo sabemos que será idéntica y accesible (permisos aparte) para todos los equipos de la misma red, la otra ruta puede ser que si, puede que no.

Para más información, como no, wikipedia (UNC)

La función

Con la siguiente función de VBA convertiremos (si es necesario) una ruta de un recurso de red al formato UNC para asegurarnos que será accesible.

'**************************************************************************************************
 ' www.manteniendo.com
 '**************************************************************************************************
 ' FUNCIÓN: fConvertirUNC(vRuta)
 ' DESCRIPCIÓN: Convertir una ruta dada a formato UNC
 ' ARGUMENTOS:
 ' vRuta: la ruta (con letra de unidad) que queremos convertir
 ' DEVUELVE: (String) La ruta convertida a formato UNC, si se puede, si no devuelve la misma cadena
 ' REQUISITOS:
 '*****************************************************************************************************
 ' Realizado y testeado con Access 2010 64bit sobre Windows 7
 '*****************************************************************************************************
 ' Poner lo siguiente al principio de todo del módulo o donde toque, siempre fuera de la función:
 Private Declare PtrSafe Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" ( _
 ByVal lpszLocalName As String, _
 ByVal lpszRemoteName As String, _
 cbRemoteName As Long _
 ) As Long

Function fConvertirUNC(vRuta As String) As String
 Dim vRutaUNC As String, vRespuesta As Variant, lenRutaUNC As Integer
 Const NO_ERROR As Long = 0, ERROR_NOT_CONNECTED As Long = 2250, ERROR_CONNECTION_UNAVAIL = 1201&

If Mid(vRuta, 2, 1) = ":" Then
 vRutaUNC = String(520, 0)
 vRespuesta = WNetGetConnection(Left(vRuta, 2), vRutaUNC, 520)
 lenRutaUNC = InStr(vRutaUNC, vbNullChar) - 1
 If lenRutaUNC > 0 And (vRespuesta = NO_ERROR Or vRespuesta = ERROR_CONNECTION_UNAVAIL Or vRespuesta = ERROR_NOT_CONNECTED) Then
 fConvertirUNC = Trim(Left(vRutaUNC, lenRutaUNC)) & Mid(vRuta, 3)
 Else
 fConvertirUNC = vRuta
 End If
 Else
 fConvertirUNC = vRuta
 End If
 End Function

Comparte con


Si tienes alguna duda, crítica o sugerencia lo leeré encantado

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.