miércoles, 21 de abril de 2010

Explorador en VBA.

Sentí un día la necesidad de investigar si era posible obtener un objeto que mostrara el Navegador de windows para seleccionar una ruta de un fichero, para posteriormente incorporar esta ruta o 'path' en algún otro código de mis macros.
Encontré el objeto Shell.Application que referenciándolo a la instrucción de VBA CreateObject; y una vez generado este código, empleándo el método BrowseForFolder, abriría nuestra ventana de navegación.
El siguiente ejercicio de programación en VBA lo encontré tras varias horas de búsqueda por la red, pero por su utilidad me decidí a incorporarlo en el blog.

El código en cuestión que abre un cuadro diálogo para navegar y poder seleccionar una ruta es:

'generamos una macro con dos variables - Título y Directorio
Sub SeleccionarDirectorio()
'definimos las variables que emplearemos
Dim Titulo, Directorio As String
Titulo = "Selecciona la ruta de tu carpeta"
On Error Resume Next
'evitaría un error en caso de no seleccionar nada o pulsar ESC
With CreateObject("shell.application")
Directorio = .browseforfolder(0, Titulo, 0).Items.Item.Path
End With: On Error GoTo 0
'la siguiente instruccíon IF ejecuta una acción a modo de ejemplo
If Directorio = "" Then
MsgBox "No has marcado ningún directorio.", , "Operación no válida"
Else
MsgBox "Ha seleccionado la siguiente ruta " & Directorio
End If
End Sub



Al ejecutar la macro 'SeleccionarDirectorio' nos aparecerá:



En el ejemplo he optado por un sencillo mensaje donde se muestra el resultado de la selección de la carpeta, pero obviamente podremos emplear esta dirección para cualquier otra cosa.

20 comentarios:

  1. Este ejemplo me encanta, pero yo necesitaria poder navegar hasta una carpeta determinada de una intranet desde internet, es posible?

    ResponderEliminar
  2. En principio esta herramienta habilita un explorador normal y corriente, por tanto, si los ficheros o carpetas de la intranet son accesibles desde un navegador estándar, no debería haber problemas.
    ¿Pero desde Internet???, no soy experto en esta materia, pero desde internet deberías conocer la IP del servidor donde se encuentra subida esa intranet, no???

    ResponderEliminar
  3. Lo he probado y funciona a la perfección si seleccionas una carpeta pero no me funciona si selecciono el Escritorio. Tienes alguna sugerencia para que pueda yo elegir el escritorio?? Muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola Alberto,
      el Escritorio suele tener una ruta completa tipo:
      C:\Users\Excelforo\Desktop
      Slds

      Eliminar
    2. Sí, funciona seleccionando la ruta completa, pero si seleccionas la carpeta Escritorio que aparece en la ventana del explorador, entonces no devuelve nada... Utilizo Windows 7 y Office 2010

      Eliminar
    3. Complicada cuestión.. investigaré si existe una alternativa para seleccionar el escritorio.
      Saludos

      Eliminar
  4. Saludos, tengo dias devanandome los sesos porque necesito abrir el explorador para buscar entre diferentes imagenes una en especifica logro abrir el objeto que la va a contener pero no llego a la parte de abrir el explorador y elegir la imagen siempre logro una cosa o la otra pero no las dos juntas... hay alguna forma de lograrlo?????

    ResponderEliminar
  5. Hola.
    He asignado la macro a un botón en un formulario y funciona de maravilla. Tengo la siguiente duda: ¿Cómo hago para que, luego de mostrar el cuadro de dialogo (MsgBox "Ha seleccionado la siguiente ruta " & Directorio) se guarde, imprima o pegue la ruta seleccionada en la celda A1?
    Muchísimas gracias por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola Víctor,
      donde pone
      If Directorio = "" Then
      MsgBox "No has marcado ningún directorio.", , "Operación no válida"
      Else
      MsgBox "Ha seleccionado la siguiente ruta " & Directorio
      End If

      pondríamos
      If Directorio = "" Then
      MsgBox "No has marcado ningún directorio.", , "Operación no válida"
      Else
      range("A1").value= "Ha seleccionado la siguiente ruta " & Directorio


      Saludos
      End If

      Eliminar
    2. Ismaél muchas gracias. Lo dejé de la siguiente forma y funciona excelente.

      Sub SeleccionarDirectorio()
      'definimos las variables que emplearemos
      Dim Titulo, Directorio As String
      Titulo = "Selecciona la ruta de tu carpeta"
      On Error Resume Next
      'evitaría un error en caso de no seleccionar nada o pulsar ESC
      With CreateObject("shell.application")
      Directorio = .browseforfolder(0, Titulo, 0).Items.Item.Path
      End With: On Error GoTo 0
      'la siguiente instruccíon IF ejecuta una acción a modo de ejemplo
      If Directorio = "" Then
      MsgBox "No has marcado ningún directorio.", , "Operación no válida"
      Else
      'mensaje e inserta la ruta en la celda A1
      MsgBox "Ha seleccionado la siguiente ruta " & Directorio
      Range("A1").Value = Directorio
      End If
      End Sub

      Eliminar
  6. Amigos.

    El path del escritorio se soluciona pinchando sobre el icono "Este equipo" y luego sobre la carpeta del escritorio. Les dejo una imagen:

    - https://iswwnw-sn3302.files.1drv.com/y3p90ci66S4WYMkpkz-XhTk17LnW9dnhxbrkJnMOslSlCTX8myMl9_wRagYTp5HH8wUUWdD6rzMvfZKVk-ms7LIPthGBRLlGuWjPOJXGsZOQvvD_z9G6o09sRTMmAMcGRtqZjxh-J2gm2xCxf_y0vIYVg/Sin%20t%C3%ADtulo.png?psid=1

    ResponderEliminar
  7. Hola una pregunta estoy tratando de hacer eso en Acces, pero como hago para que la direccion de la carpeta se coloque en un cuadro de texto en el que yo pueda guardar en mi base de datos como hipervinculo. gracias

    ResponderEliminar
    Respuestas
    1. Hola,
      lo siento pero los códigos en VBA Access son algo distintos...
      mejor consulta en un blog específico de Access.
      Slds

      Eliminar
  8. Estimado Ismael: primero que nada felicitar por tan grande aporte.
    Ahora bien, mi consulta es qué código debiera agregar para que el explorador parta desde un path predeterminado por ejeplo C:\User\Desktop\Trabajo\ donde hay una serie de carpetas y sub carpetas. Agradecido desde ya.

    ResponderEliminar
    Respuestas
    1. Estimado Ismael y todos los que teneis esta inquietud, encontré respuesta a qué realizar, para que el Explorador parta desde una carpeta o subcarpeta sin que tengamos que recorrer todos los directorios uno a uno si es que esa aplicación la ocupamos siempre para marcar siempre una x carpeta dentro de otro directorio por llamarlo raiz:
      Pues bien, es tan fácil como declarar una variable del tipo Variant, y donde ésta contenga el path desde donde queremos que el directorio parta (ej.: "C:\User\Desktop\Pruebas\2017\") y luego esa variable incorporarla al Objeto BrowserdorFolder, como verán en este ejemplo:


      Sub SeleccionarDirectorio()
      'definimos las variables que emplearemos
      Dim Titulo, Directorio As String
      ' Acá declaro una variante del tipo Variant que despues almacena
      ' el directorio raíz de donde deseo que parta.
      Dim subfolder As Variant
      Titulo = "Selecciona la ruta de tu carpeta"
      ' acá preparo la variable con el directorio desde donde deseo que aparezca
      subfolder = "C:\Users\Desktop\Prueba\"
      On Error Resume Next
      'evitaría un error en caso de no seleccionar nada o pulsar ESC
      With CreateObject("shell.application")
      ' En el objeto BrowserforFolder declaro la variable subfolder
      Directorio = .BrowseForFolder(0, Titulo, 0, subfolder).Items.Item.path
      End With: On Error GoTo 0
      'la siguiente instruccíon IF ejecuta una acción a modo de ejemplo
      If Directorio = "" Then
      MsgBox "No has marcado ningún directorio.", , "Operación no válida"
      Else
      MsgBox "Ha seleccionado la siguiente ruta " & Directorio
      End If
      End Sub

      Espero les sea también muy útil.

      Saludos cordiales para ti Ismael por tan enorme trabajo.

      Eliminar
    2. Muchas a gracias a ti por el aporte Milton,
      todos los buenos consejos son bienvenidos

      un cordial saludo

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.