Yo escribí esta función, mira si te sirve. En versiones anteriores a Excel 2010 quizás sea necesario establecer una referencia a la librería "Microsoft Scripting Runtime" (desde Herramientas->Referencias).
La sintaxis es:
=BuscarFichero("Ruta";"Fichero.extensión")
Private sFicheroBuscado As String, sFicheroEncontrado As String
Public Function BuscarFichero(sRutaInicial As String, sFich As String) As String
Dim fso As Object, fCarpeta As Object, tmpCarpeta As Object
Dim Fichero As Object, tmpFichero As Object
Dim strRutaInicial As String
sFicheroBuscado = LCase(sFich)
sFicheroEncontrado = ""
strRutaInicial = "P:\Datos\Excel" 'Ruta que se procesará
Set fso = CreateObject("Scripting.FileSystemObject")
Set fCarpeta = fso.GetFolder(sRutaInicial)
For Each tmpFichero In fCarpeta.Files
If LCase(tmpFichero.Name) = sFicheroBuscado Then
BuscarFichero = tmpFichero.Path
Exit Function
End If
Next tmpFichero
BuscarEnSubcarpetas sRutaInicial
If sFicheroEncontrado <> "" Then
BuscarFichero = sFicheroEncontrado
Exit Function
End If
BuscarFichero = "Fichero no encontrado"
End Function
Private Sub BuscarEnSubcarpetas(RutaInicial As String)
Dim fso As Object, fCarpeta As Object, tmpCarpeta As Object
Dim Fichero As Object, tmpFichero As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set fCarpeta = fso.GetFolder(RutaInicial)
For Each tmpCarpeta In fCarpeta.SubFolders
For Each tmpFichero In tmpCarpeta.Files
If LCase(tmpFichero.Name) = sFicheroBuscado Then
sFicheroEncontrado = tmpFichero.Path
Exit Sub
End If
Next
BuscarEnSubcarpetas tmpCarpeta.Path
Next
End Sub
Si hay muchas carpetas y/o ficheros, me temo que el código puede tomarse su tiempo, pero no he encontrado otra forma más rápida de hacer esto.