martes, 8 de octubre de 2013

VBA: el método .GetOpenFilename para seleccionar un fichero.

Hace ya algunos años aprendimos la manera de seleccionar una carpeta o directorio empleando en nuestras macros el Explorador de Windows (ver).
Hoy iremos un paso más lejos y no nos quedaremos en la carpeta, si no que seleccionaremos un fichero concreto, con su ruta completa (nombre incluido). Para ello emplearemos el método .GetOpenFilename, lo que no mostrará el cuadro de diálogo estándar Abrir, obteniendo el nombre de archivo que seleccionemos, pero lo más importante, sin que en realidad se abra ningún archivo!!!... lo que será cómodo para conseguir rutas completas.


En el ejemplo que propongo, conseguir dicha ruta mediante la selección directa en la ventana Abrir, y servirá precisamente para esto. En el código siguiente he modificado el Título de la ventana, además de aplicar un filtro de posibles tipos de ficheros a mostrar, dejando sólo visibles los ficheros .xlsx.

Insertamos un módulo en nuestro Proyecto de VB en el editor de VB, y en él la macro siguiente:

Sub SeleccionFichero()
'identificamos el fichero y su ruta para importarlo
Dim RutaArchivo As String

'controlamos algún posible error.
On Error Resume Next
'damos valor a la variable Filename
'además hemos cambiado el Título que aparecerá en la ventana diálogo
'y forzamos para que sólo abra ficheros de Excel (extensión .xlsx)
RutaArchivo = Application.GetOpenFilename(Title:="Prueba selección ficheros Excelforo", _
                            filefilter:="Excel files (*.xlsx), *.xlsx")

'si hemos seleccionado algún archivo muestra un cuadro mensaje
If Not RutaArchivo = "False" Then
    MsgBox RutaArchivo
End If

'con el método .Open abrimos el fichero seleccionado
'o cualquier otra acción que requiera la ruta de un fichero
Workbooks.Open FileName:=RutaArchivo
End Sub



Al ejecutar nuestra macro veremos la siguiente ventana:

VBA: el método .GetOpenFilename para seleccionar un fichero.


Tras seleccionar un fichero cualquiera, se mostrará un Cuadro de mensaje de texto con la ruta y nombre completo del archivo seleccionado, y en mi caso, posteriormente se abrirá dicho archivo (ya que lo he forzado con Workbooks.Open).

VBA: el método .GetOpenFilename para seleccionar un fichero.

57 comentarios:

  1. Como hago para cerrar el archivo seleccionado

    ResponderEliminar
    Respuestas
    1. hola Bayron, que tal estás?
      un gusto saludarte igualmente.

      para cerrar el fichero puedes emplear el método .Close del Workbooks

      Saludos cordiales

      Eliminar
  2. Buenos días,

    hay alguna forma de meterle la ruta de la carpeta para buscar por defecto ?

    Gracias

    ResponderEliminar
    Respuestas
    1. Hola Josém
      sí, podrías añadir en la fila 04 del código más arriba:
      MyPath = "E:\excelforo"
      ChDrive MyPath
      ChDir MyPath

      Saludos

      Eliminar
  3. Hola señor Excelforo, puedes ayudarme con lo siguiente tengo este código que cierra el libro activo
    ActiveWorkbook.Close False
    pero como hago para que tambien me cierre el directorio del libro activo,

    gracias por su ayuda.

    ResponderEliminar
    Respuestas
    1. Hola!
      no entiendo a qué te refieres con cerrar el 'directorio del libro activo'??.. te refieres a cerrar el explorador de Windows?
      Saludos

      Eliminar
  4. hola Ismael seria cerrar la carpeta que se encuentra abierta del libro activo.

    ResponderEliminar
    Respuestas
    1. ???
      cómo se cierra una carpeta en el explorador de Windows??

      Eliminar
  5. Que tal, tengo una duda espero me puedas ayudar. Para seleccionar mas de un archivo es con MultiSelect:=True, como le hago para que al momento de seleccionar dos o mas archivos asi mismo me los muestre en el MsgBox. Gracias

    ResponderEliminar
    Respuestas
    1. Hola José Carlos,
      intentaré subir una explicación al blog en cuanto pueda...
      Saludos

      Eliminar
  6. hola excelforo:
    yo necesito encontrar ficheros en un directorio del explorador del tipo XML, pero que empiecen empiezan por un texto.
    Por ejemplo todos los pp*.xml que haya en una ruta determinada
    No se si esto es posible
    Gracias de antemano

    ResponderEliminar
    Respuestas
    1. Hola,
      parece bastante complejo a priori, ya que sólo es configurable la extensión o tipo de fichero a buscar...
      Buscaré alguna posible solución alternativa.
      Un saludo

      Eliminar
  7. Hola Ismael
    Puedo obtener el nombre del solo archivo sin la ruta para pegarlo en un TextBox

    ResponderEliminar
    Respuestas
    1. Hola Jhon,
      con este método podrías empleando la función Split con el separador \.. quedándote con el último elemento de la Array resultante.

      Espero te oriente.
      Slds

      Eliminar
    2. Hola Ismael no no creo que sirva ya estube indagando y no. Es que lo que quiero es con la funcion get.openfilemane he sacado la ruta de unas fotografias que quiero agregar. pero como quiero cambiar de carpeta osea de una memoria a el disco duro, necesito estraer el nombre del archivo para realizar esa accion. jejeje Tienes algun metodo Mejor? Gracias

      Eliminar
    3. Igual no has buscado en la dirección correcta ;-)
      Mira:
      Sub SeleccionFichero()
      Dim RutaArchivo As String

      On Error Resume Next
      RutaArchivo = Application.GetOpenFilename(Title:="Prueba selección ficheros Excelforo", _
      filefilter:="Excel files (*.xlsx), *.xlsx")

      MatrizNombre = Split(RutaArchivo, "\")

      If Not RutaArchivo = "False" Then
      MsgBox MatrizNombre(UBound(MatrizNombre))
      End If

      End Sub

      No parece demasiado complejo....
      Saludos

      Eliminar
    4. Jjejeje Si Señor. Gracias Ismael
      Saludos

      Eliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Hola Ismael
    Como puedo recoger el nombre de un pdf que esta abierto (se ha abierto antes para comprobar que este pdf esta o no firmado) y llevarlo a una variable, para luego insertarlo en una fila del libro activo.
    Muchas Gracias
    Francis

    ResponderEliminar
    Respuestas
    1. Hola, a priori es bastante complejo.. ya que abría que emplear API's para recorrer las ventanas abiertas en Windows para detectar si existe un pdf, para luego intentar extraer su ruta...

      Diría que lo más sencillo es abrir con el código del ejemplo el pdf, así consigues guardar como variable su ruta, para luego hacer con ella lo que quieras...

      Intentaré subir, en cuanto me sea posible, una explicación de este tema.
      Saludos

      Eliminar
    2. Gracias por la respuesta tan rápida
      Intentare seguir tu consejo y esperare la explicación a este tema ya que tengo algún problema con la apertura de los .pdf que creo se debe a no referenciarlos bien o a que falte alguna librería en excel 2007.
      Gracias de nuevo
      Un saludo
      Francis

      Eliminar
  11. Hola Ismael,
    Y se puede rastrear el archivo excel? es decir que la ruta sea dinámica, sin importar a dónde se mueva el archivo lo ubique y logre abrirlo únicamente con el código?

    ResponderEliminar
    Respuestas
    1. Hola Yuri,
      piensa que esto es un Explorador, eres tu manualmente quien realiza la búsqueda.
      Sí es posible conocer la ruta de cualquier fichero ya abierto, pero primero se debe localizar de alguna manera...

      Slds

      Eliminar
  12. Hola, muy buenas tarde, yo no soy programador pero tu macro me esta ayudando mucho en un poryecto que estoy haciendo.

    Tengo una duda, ya que seleccionas el archivo, como puedes hacer para que ese archivo de texto quede importando dentro de la hoja de excel.

    Lo que hice yo fue hacer un macro para importar archivos, cambie el nombre y la ruta del archivo de dicho macro por RutaArchivo (que se supone es el que se selecciono antes).

    Con esto si logro que lo importe pero lo hace abriendo otro Arcchivo de excel. Y necesitaria que fuera en la misma hoja donde corro el macro.

    Espero que me puedas ayudar, por lo mientras colocare aqui el codigo completo como me quedo usando el tuyo y el del macro grabado

    Sub getopen()
    '
    ' getopen Macro
    '
    '
    'identificamos el fichero y su ruta para importarlo
    Dim RutaArchivo As String

    'controlamos algún posible error.
    On Error Resume Next
    'damos valor a la variable Filename
    'además hemos cambiado el Título que aparecerá en la ventana diálogo
    'y forzamos para que sólo abra ficheros de Excel (extensión .xlsx)
    RutaArchivo = Application.GetOpenFilename(Title:="Prueba selección ficheros Excelforo")

    'si hemos seleccionado algún archivo muestra un cuadro mensaje
    If Not RutaArchivo = "False" Then
    MsgBox RutaArchivo
    End If
    'con el método .Open abrimos el fichero seleccionado
    'o cualquier otra acción que requiera la ruta de un fichero
    Workbooks.Open Filename:=RutaArchivo
    With ActiveSheet.QueryTables.Add(Connection:=RutaArchivo _
    , Destination:=Range("$H$7"))
    .CommandType = 0
    .Name = _
    "RutaArchivo"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 932
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = True
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
    End With
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola,
      para importar un txt (de texto) a una hoja existente de Excel, podrías realizar la importación y luego en el mismo proceso copiar y pegar de ese libro abierto al destino final...

      Subiré una explicación del asunto en cuanto pueda.
      Saludos

      Eliminar
    2. Se pudo avanzar sobre este pedido de ayuda?

      Slds

      Eliminar
    3. Hola, que tal...
      está en mi lista :(

      De todas formas la idea es la que se comentó
      Realizar la importación, tratarla como temporal (esto es, luego borrarlo), para copiar y pegar el que se abra en el destino final

      Saludos

      Eliminar
  13. Hola Ismael una pregunta ¿Y si quiero cargar una fotografia como hipervinculo? y despues de que se carge al textbox quisiera visualizarla con un boton.. Espero puedas ayudarme, saludos.

    ResponderEliminar
  14. Hola Ismael, Gracias por tu trabajo, me esta ayudando con un proyecto para correr una macros. Solo tengo dos detalles y quisiera que me apoyaras

    1) Que de cancelar la selección del archivo en vez de false diga Cancelado o el texto que le quiera colocar.
    2) Y que si cancelo la selección del archivo no siga corriendo la macros.

    Sub SeleccionarArchivo()
    Dim RutaArchivo As String
    On Error Resume Next
    RutaArchivo = Application.GetOpenFilename(Title:="Seleccionar Archivo")
    If Not RutaArchivo = "False" Then
    MsgBox RutaArchivo
    End If
    Workbooks.Open FileName:=RutaArchivo
    End Sub

    ResponderEliminar
    Respuestas
    1. Hola Jore
      prueba con:
      Sub SeleccionarArchivo()
      Dim RutaArchivo As String
      On Error Resume Next
      RutaArchivo = Application.GetOpenFilename(Title:="Seleccionar Archivo")
      If Not RutaArchivo = "Falso" Then
      MsgBox RutaArchivo
      Else
      MsgBox "cancelado"
      Exit Sub

      End If
      Workbooks.Open Filename:=RutaArchivo
      End Sub

      Saludos

      Eliminar
  15. se puede usar este método para seleccionar un archivo *.* para moverlo a una ruta especifica.

    espero que me puedas comentar

    ResponderEliminar
    Respuestas
    1. Hola,
      echa un vistazo a este post
      http://excelforo.blogspot.com.es/2015/09/vba-el-metodo-movefolder-o-como-cambiar.html

      Quizá te de una pista.

      Lee también espeficicamente este otro post:
      http://stackoverflow.com/questions/14504372/moving-files-from-one-folder-to-another

      Saludos

      Eliminar
  16. Hola cuando se abre el display para elegir el archivo, lo que hago es cancelar porque me equivoque al abrir... inmediatamente se cierra el todo el libro. Por qué pasa eso?

    ResponderEliminar
    Respuestas
    1. Hola Frank,
      he replicado tu caso sobre el código del post y, en mi caso, no ocurre tal cosa...
      ¿has añadido alguna línea más?
      Saludos

      Eliminar
  17. Buenos dias Ismael, excelente informacion. quisiera me pudieras colaborar con algo, deseo mediante un boton seleccionar un archivo y mediante otro boton seleccionar una ruta especifica para guardar el archivo antes seleccionado.

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      bueno la idea sería seguir los pasos siguientes para asignar la macro descrita en este post (arriba) a un botón:
      http://excelforo.blogspot.com.es/2009/09/boton-con-macro-en-excel-2007.html

      Para guardar en libro en la ruta bastaría una macro tipo:
      Thisworkbook.saveas filename:="ruta completa"

      en ese caso "ruta completa" sería una variable.
      Esto es, podría ser la misma macro que la de arriba en el post, pero cambiando la última linea:
      Workbooks.Open FileName:=RutaArchivo

      por
      Thisworkbook.saveas filename:=RutaArchivo

      Lo que no tengo claro es que te aportarán estos 'botones' distintos a los estándar de 'Abrir' y 'Guardar Como' ya existentes en el estándar de la aplicación Excel.

      Slds

      Eliminar
  18. hola Ismael, una consulta yo necesito poder seleccionar una carpeta para luego copiar en ella un archivo. Es decir que yo pueda decidir donde deseo copiar el archivo.

    ResponderEliminar
  19. Muy interesante...gracias por la información.

    Elvis Ramos

    ResponderEliminar
  20. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  21. Hola Ismael, muchas gracias por compartir tu conocimiento.
    Yo tengo una duda que tal vez sea muy básica o tal vez no sea posible.

    Tengo la curiosidad de hacer que el cuadro de dialogo que aparece con getopenfilename, aparezca en la pantalla centrado o en algún posición que yo indique.
    Es posible ?
    Saludos y gracias de antemno

    ResponderEliminar
    Respuestas
    1. Hola,
      en realidad esta es una ventana de Windows, asi que en teoría sí es posible trabajar sobre ella...
      Supongo existirá alguna API para Windows con la que trabajar desde Excel; yo nunca lo he intentado y desconozco cuál sería...

      Un saludo y suerte

      Eliminar
    2. Muchas gracias por tu pronta respuesta, sinceramente pensé que iban a pasar algunos días antes de recibir alguna respuesta(algunas veces nunca llega). Te agradezco mucho tu respuesta, aunque con las instrucciones que ofrece el propio Excel no es posible, esto me deja por el momento tranquilo y puedo seguir avanzando en el aprendizaje.
      Una cosa más, tengo una duda mas que me salió y tal vez la respuesta sea algo por el estilo. de cualquier manera te comento la inquietud que tengo, es con la función dir y con la manera de buscar un archivo y determinar si existe o no. la sintaxis de la instrucción dir es: dir pathname, atributos. Es posible hacer el dir aplicado a toda la unidad c?
      Es decir, tal vez tenga la necesidad de buscar x archivo pero no se en que carpeta se encuentre, asi que pensé que algo así funcionaria: dir("c:nombrearchivo") probe con un archivo que de antemano se que existe y no funciona, me devuelve una cadena vacia.
      Muchas gracias nuevamente.

      Eliminar
    3. ;-)
      la función de VBA Dir 'busca' fichero o carpeta en una ruta concreta, esto es, no actúa como el buscador de Windows
      Slds

      Eliminar
    4. Gracias Ismael, soy a veces necio y con esta opinión viniendo de alguien que me lleva muchísimo camino me deja tranquilo para no seguir perdiendo tiempo y seguir avanzando.
      Saludos desde México y seguire viendo tus videos y blog.

      Eliminar
    5. Gracias a tí...
      de todas formas, por desgracia yo no lo sé todo (ojalá estuviera a un 10% del potencial del VBA para Excel)... quizá algú otro lector te pueda dar más claves
      ;-)
      Un saludo

      Eliminar
  22. Disculpe Ismael!!
    Desde Excel puedo lanzar, arrancar, correr un archivo de lotes???? que este en una ruta especifica?

    ResponderEliminar
    Respuestas
    1. Hola Olegario,
      en principio sí es posible abrir o lanzar cualquier tipo de archivo (nunca probé un archivo de lote).
      Esto te puede servir:
      http://excelforo.blogspot.com.es/2014/01/vba-shellexecute-o-como-abrir-desde.html

      Un saludo

      Eliminar
  23. Hola Ismael:
    Quisiera abrir un archivo XML con tu macros, que se abra el archivo XML en una nueva hoja de cálculo, que seleccione una celda de esa hoja de cálculo y copie esa celda a otra celda de otra hoja de cálculo. Podrías ayudarme con el pedido, por favor?

    ResponderEliminar
  24. Una consulta adicional: hay manera de insertar/cargar una página web en una hoja de cálculo? si es factible, cómo lo inserto. Gracias nuevamente.

    ResponderEliminar