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