jueves, 17 de mayo de 2012

VBA: Macro para listar ficheros de una carpeta.

Continuando con una serie de artículos hoy contaré cómo poder listar en una Hoja de cálculo de Excel los diferentes ficheros o archivos contenidos en una carpeta concreta de nuestro equipo.
La siguiente macro, bastante sencilla, emplea el objeto FileSystemObject, que habilita el acceso al sistema de todos los archivos de nuestros PC.

Insertaremos en un módulo del Explorador de proyectos del Editor de VBA el siguiente código, formando nuestra macro de Excel:

Sub ListarFicherosCarpeta()
'www.excelforo.com
Dim Ruta As String
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Creamos el objeto FileSystemObject que
'proporciona acceso al sistema de archivos de un equipo
Set fso = CreateObject("Scripting.FileSystemObject")
'Indicamos la ruta de donde vamos a obtener
'los ficheros, en este caso D:\BancoFotos
Ruta = "D:\BancoFotos\"
'definimos dos variables que necesitaremos,
'para recuperar el nombre de la carpeta, y los ficheros que haya dentro
Set Carpeta = fso.GetFolder(Ruta)
Set ficheros = Carpeta.Files
'damos un título en negrita para la celda A1
With Range("A1")
    .Value = "Ficheros de la carpeta " & Ruta
    .Font.Bold = True
End With
'escribimos los ficheros, a partir de A2
Range("A2").Select
For Each archivo In ficheros
    'escribimos el nombre del fichero
    ActiveCell = archivo.Name
    'bajamos una fila
    ActiveCell.Offset(1, 0).Select
Next archivo
ActiveCell.EntireColumn.AutoFit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Limpiamos los objetos y variables definidas
Set fso = Nothing
Set Carpeta = Nothing
Set ficheros = Nothing

Application.ScreenUpdating = True
End Sub


En este caso, por simplificar, he decidido añadir la Ruta de la carpeta de manera manual, en mi caso, una carpeta donde guardo imágenes que utilizaré en una entrada posterior.
El funcionamiento de la macro comienza permitiendo el acceso al sistema de directorios y carpetas de nuestro equipo de trabajo, luego, tras definir la Ruta exacta que terminaremos abriendo, empleando el método GetFolder, que devuelve un objeto Folder que corresponde a la carpeta de la ruta especificada.El resto es simple, ya que forzamos un texto en la celda A1, y con un proceso FOR EACH...IN...NEXT pasamos por todos los ficheros contenidos en la carpeta definida en 'Ruta' y nos lo traemos a la Hoja de cálculo a partir de la celda A2.
Finalmente auyoajustamos el ancho de la columna y limpiamos las variables definidas con la instrucción SET.

Podemos ver el resultado en la imagen, para mi caso, un listado de cuatro ficheros:

VBA: Macro para listar ficheros de una carpeta.

101 comentarios:

  1. Excelente!, una pregunta, y si quiero traer la fecha de creacion, la fecha de modificacion y el tamaño de cada archivo?, que debo adicionar?

    ResponderEliminar
    Respuestas
    1. Hola Fabio,
      mañana subiré un post al blog dando el detalle del código necesario...
      Slds

      Eliminar
  2. y si quiesiera que de una lista escrita en excel me busque los archivos de una capeta definida y luego los copie los archivos a una carpeta distinta...

    gracias Anticipadas

    ResponderEliminar
    Respuestas
    1. Hola,
      en unos días subiré un post explicando cómo trabajar con los ficheros de una carpeta definida en particular; así a bote pronto, se me ocurriría abrir esos archivos:
      workbook.open Filename:=Ruta
      para luego inmediatamente guardarlos en otra carpeta destino
      activeworkbook.close savechanges:=false, filename:=nuevo nombre
      Espero haberte orientado.
      Slds

      Eliminar
  3. No hay forma que la lista salga ordenada alfabéticamente?

    ResponderEliminar
    Respuestas
    1. Hola Jonathan, ¿cómo estás?
      Espero vayas bien.
      Lo más sencillo para verlos ordenados alfabéticamente sería, una vez devueltos los nombres de los ficheros a la hoja, ordenarlos mediante el objeto Sort. POr ejempl:
      With ActiveWorkbook.Worksheets("Hoja1").Sort
      .SortFields.Clear
      .SortFields.Add Key:=Range("A1:A5"), _
      SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
      .SetRange Range("A1:A5")
      .Apply
      End With

      para ordenar las celda A1:A5 de la Hoja1.

      Espero te sirva,
      saludos cordiales

      Eliminar
  4. Una consulta, ¿que debo modificar si quiero obtener los nombres de las carpetas en vez de nombres de archivos en el directorio seleccionado?

    ResponderEliminar
    Respuestas
    1. Hola Cristian, que tal?
      para conseguir las subcarpetas existe una propiedad Subfolders para el método Getfolder.
      Un ejemplo de la ayuda de Excel
      Sub ShowFolderList(folderspec)
      Dim fs, f, f1, fc, s
      Set fs = CreateObject("Scripting.FileSystemObject")
      Set f = fs.GetFolder(folderspec)
      Set fc = f.SubFolders
      For Each f1 in fc
      s = s & f1.name
      s = s & vbCrLf
      Next
      MsgBox s
      End Sub

      El código siguiente demuestra cómo conseguir una colección Folders y cómo recorrer la colección utilizando la instrucción For Each...Next.

      Un saludo

      Eliminar
  5. Muchas gracias, ha sido rápido e indiloro.

    ResponderEliminar
  6. Hola buenas

    Ya pude generar la lista de ficheros Excel en una hoja con la macros. Ahora quiero que tome el nombre del primer archivo y lo abra, trabajar con el y posteriormente me abra el segundo archivo de la lista y así sucesivamente. Gracias de Antemano :)

    ResponderEliminar
  7. Como complemento del comentario anterior te cuento que tengo varios archivos Excel en una carpeta. Tengo otro archivo de Excel que extrae información de cada uno de esos archivos. Asi es que quiero que abra un archivo extraiga la información y lo cierre y luego que abra el siguiente de la lista y lo cierre y asi en adelante. La lista de archivos que tengo en la carpeta cambia. Yo primero use este macros para obtener una lista de los archivos de mi carpeta:

    Sub auto_open()

    'Actualización de Video

    Application.ScreenUpdating = False
    Application.DisplayStatusBar = True
    Application.StatusBar = "Importando Información..."


    'Hoja
    Sheets("CALCULOS").Select

    'Sección 1: Variables a utilizar en la macro
    Dim carpeta, archivos As String
    Dim contador As Integer

    'Sección 2: Lectura de carpeta y ajustes necesarios
    carpeta = InputBox("Ingresa la ruta de la carpeta a importar:")

    If carpeta = "" Then
    Exit Sub
    ElseIf Right(carpeta, 1) <> "\" Then
    carpeta = carpeta & "\"
    End If

    'Sección 3: Preparación de variables
    contador = 1
    archivos = Dir(carpeta)

    'Sección 4: Recorrido de la carpeta
    Do While Len(archivos) > 0
    ActiveSheet.Cells(contador, 1).Value = archivos
    archivos = Dir()
    contador = contador + 1
    Loop

    'Actualización de Video

    Application.ScreenUpdating = True
    Application.StatusBar = "Importación Completa"

    'Hoja
    Sheets("CALCULAR").Select

    End Sub

    Lo programé para que el cuadro de dialogo me pida la dirección de la carpeta al abrir el libro, la especifico y me genera la lista de archivos, ahora quiero que me tome esa lista para ir abriendo cada uno de los archivos e importando la información. Otra cosa relacionada con éste código: (No me genera la lista esta macros hasta que corra otra macros de este mismo libro, y ya intento de nuevo y me crea la lista) Espero haberme explicado. Saludos!

    ResponderEliminar
    Respuestas
    1. Hola!!
      buena macro tienes montada ;-)
      Yo probaría, una vez tengas la ruta de cada archivo de la carpeta, con un procedimiento Workbooks.Open "ruta cada archivo"
      actuar sobre el Workbook abierto, y acabar cerrándonlo (Workbooks.Close)antes de pasar al siguiente archivo de la carpeta.

      La última parte de tu comentario no la entendí, lo siento.
      Espero te pueda servir.
      Slds

      Eliminar
  8. Muchas gracias por tu respuesta,tienes bien atendido el blog. Lo que pasa que esos archivos que quiero abrir cambian de nombre. Por lo cual no puedo especificar rutas fijas.

    Lo que estaba haciendo con el paso anterior es generar una lista de los archivos que se encuentran en el directorio.
    Ahora lo que quiero hacer es usar esa información para dar la orden de abrir cada uno en base a la lista.
    Quizás sea muy avanzado ese paso, no sé si sepas como se puede hacer. Saludos! Gracias por tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola Nikx,
      si te había entendido; y daría igual que cambiaran de nombre.
      Lo que quería explicarte, es que aplicando el recorrido por la carpeta, y así sabes la ruta y nombre da cada fichero que se encuentra en el directorio; puedes emplear dicha ruta y nombre para ir abriéndolo, trabajando sobre él, y cerrándolo posteriormente; para que el recorrido o bucle pasa a continuación al siguiente archivo o fichero del directorio.

      Slds

      Eliminar
  9. Voy avanzando en el trabajo va por buen camino, Gracias por tu apoyo. Te comento en cuanto quede listo.

    ResponderEliminar
    Respuestas
    1. Niks, estoy buscando lo mismo que vos, pero no logre escribir la parte del codigo que vaya abriendo los archivos del listado. Pudiste hacerlo?

      Eliminar
  10. como poner una cuadro donde yo le este dando la ruta del archivo en la hoja y no estar cambiandolo en el codigo y solo darle clic al boton que ya le asine ala macro y me enliste la ruta que quiero antes en nose un cuadro de texto y no directamente en el codigo

    ResponderEliminar
    Respuestas
    1. Hola, que tal estás... espero te encuentres bien tu también.
      Un código podría ser:
      Sub ParaAbrir()
      www.excelforo.com
      Dim strnName As String, strRuta As String

      strRuta = Range("A1").Value
      strname = "nombre del fichero que queramos"

      direccion = strRuta & "\" & strname & ".xlsx"

      'abrimos el fichero
      Workbooks.Open (direccion)
      End Sub

      según la ruta que aparezca en la celda A1

      Un cordial saludo igualmente

      Eliminar
  11. Hola, te llevo siguiendo hace poco para introducirme en esto del VBA para Excel. Ya tengo hechas algunas plantillas y ahora pretendo tomar algo de esta macro.
    Quiero listar los archivos de una carpeta que se encuentra en nuestro servidor y compararlo con el listado de archivos que debería contener y así visualizar rápido el trabajo que queda por hacer.
    El único problema que tengo es con la ruta de la carpeta del servidor pues el excel deja de responder, ¿es qué no es posible dar permisos para acceder ahí?
    Saludos

    Javier D.

    ResponderEliminar
    Respuestas
    1. Hola Javier,
      gracias por seguirme ;-)

      Respecto al tema de la ruta, inicialmente no debería haber ninguna restricción, no al menos planteada desde VBA.
      Otra cosa diferente es que si exista (entiendo que no es tu caso) mediante permisos de usuario.

      Qué error te genera? o simplemente se queda colgado??.. quizá el problema no sea del servidor??.. has probado a ejecutar tu macro accediendo a una carpeta de tu PC??
      Lo más sencillo es que nuestros códigos tengan algún pequeño (o gran) fallo...

      Es lo único que te puedo decir... prueba a ejecutarla entrando en una carpeta local de tu equipo, y si funciona bien, entonces pregunta al administrador de red, por si hubiera alguna limitación para lo que tratas de hacer.

      Un cordial saludo

      Eliminar
    2. Gracias por tu pronta respuesta,

      Es que hice una variante a tu código. Creé un botón de manera que me apareciera una ventana donde ir introduciéndome en las carpetas hasta dar con la ruta pero es ahí donde se me queda colgado si intento acceder al servidor en cambio para carpetas de mi PC no da problemas.

      Tras estar trasteando con la hoja la única solución que veo por ahora es introducir la ruta a mano.

      Saludos.

      Javier D.

      Eliminar
    3. Pues siento no poder ayudarte más.. no puedo replicar tu situación, pero si en local te funciona, claramente hay algo en la ruta del servidor que hace fallar la macro.
      Es extraño de todas formas, por lo que he entendido, que metiendo la ruta a mano sí la reconozca...
      ???

      suerte!!!
      Un saludo

      Eliminar
  12. Buenas tardes,

    Si quisiera que me devolviera HIPERVINCULOS a esos archivos, que debería hacer?

    ResponderEliminar
    Respuestas
    1. Hola Gabriel,
      para construir Hipervinculos con macros debes emplear el método Hiperlinks.Add
      Puedes ver un ejemplo en
      http://excelforo.blogspot.com.es/2012/08/vba-un-hipervinculo-con-macros-de-excel.html

      Como tienes la ruta completa, dentro de tus variables, darle el Address o dirección del vínculo será sencillo.

      Saludos

      Eliminar
  13. Hola Ismael, muy buena la macro, estoy haciendo una lista de varios archivos que se incrementan cada día, pero tarda bastante en actualizarse. cómo hago para que solo incluya en la lista los nuevos archivos que se generan???

    ResponderEliminar
    Respuestas
    1. Hola!
      vaya cuestión complicada.. diría que localizando las fechas de modificación de los ficheros en la carpeta, ya que hay una propiedad que indica tal cosa. Puedes ver algo al respecto:
      http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-listar-las.html

      Saludos cordiales

      Eliminar
  14. Hola Ismael, no tengo tanta experiencia en esto de excel y de las macros, pero me gustaria saber como uso tu macro, te comento, estoy descargando una cantidad considerable de archivos de excel desde una aplicativo web, y los tengo que organizar por carpetas, a estos tengo que hacerle algunas modifcicaciones como eliminar unas filas, quitar una imagen de logo, quitar un combinar centrar (para empezar) y una vez que tenga todo esto voy a necesitar agregar una o varias columnas basandome en un archivo que trae estas cols nuevas para que todos queden iguales, como uso tu macro para listar los archivos y hacer las primeras modifcaciones que necesito sin necesidad de abrir archivo por archivo?

    te agradezco la ayuda,

    CESAR W GRIMALDOS M
    enithma@hotmail.com

    ResponderEliminar
    Respuestas
    1. Hola Cesar,
      para realizar modificaciones en los términos que expones, tienes que abrir los ficheros inexcusablemente...
      otra cosa es que los abras mediante macros, y si esas modificaciones responden a una regla, esto es, son siempre las mismas, sobre los mismo elementos de los libros, se pueda automatizar...

      Saludos cordiales!!

      Eliminar
  15. Muy bueno.
    Muchísimas gracias

    ResponderEliminar
  16. Hola Ismael otra vez de nuevo por aquí.

    Un favor tengo este código para ocultar la ruta de un archivo:

    Private Sub Cmd_Oculta_Click()
    dim Fso As New Scripting.FileSystemObject
    Dim F As Folder
    Set F = Fso.GetFolder("c:\My Documents")
    F.Attributes = Hidden
    End Sub

    el problema es que funciona solo al agregar la refencia Microsoft Scripting Runtime pero veo que tu en este ejemplo creas el objeto con: Set fso = CreateObject("Scripting.FileSystemObject").

    la pregunta es como se podría adaptar la creación de este objeto al código que tengo, para no estar añadiendo la referencia en cada PC. Gracias pro tu ayuda.

    ResponderEliminar
    Respuestas
    1. Hola,
      sería reemplazar (en teoría)
      dim Fso As New Scripting.FileSystemObject
      por

      Set fso = CreateObject("Scripting.FileSystemObject")

      el resto es igual....

      Espero te funcione.
      Slds

      Eliminar
  17. Hola Ismael, y como haría para que no cargue todos los archivos, sino solamente los de extensión (.xls)

    ResponderEliminar
  18. Hola!

    Tengo una carpeta con varias carpetas y a su vez con varias sub sub carpetas, y todas contienen archivos, como puedo crear la lista de todos los archivos??

    Excelente Foro!
    Gracias!

    ResponderEliminar
    Respuestas
    1. Hola Omar,
      Un ejemplo de la ayuda de Excel
      Sub ShowFolderList(folderspec)
      Dim fs, f, f1, fc, s
      Set fs = CreateObject("Scripting.FileSystemObject")
      Set f = fs.GetFolder(folderspec)
      Set fc = f.SubFolders
      For Each f1 in fc
      s = s & f1.name
      s = s & vbCrLf
      Next
      MsgBox s
      End Sub

      Espero te ayude
      Saludos

      Eliminar
  19. Lo unico que no me queda claro es de que tipo es lo que llamaste "archivo" en el For Each,
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola Fátima,
      al estar en un for each mi variable 'archivo' es un elemento del conjunto de datos del in 'ficheros'.. sigue la pista hacia arriba, hasta llegar al origen del objeto ;-)
      Slds

      Eliminar
  20. Hola.
    Gracias por este foro me está resultando de gran ayuda.
    Quería plantear una cuestión. Ya tengo los archivos perfectamente listados en una hoja de excel. Están como juan_01_07.jpg, juan_02_07.jpg, juan_03_07.jpg, etc y lo que quisiera es eliminar en la lista la extensión y algunos caracteres, de forma que queden: juan_01, juan_02, Juan_03, etc. ¿Cómo se podría hacer esto en vb?
    Gracias, nuevamente, por su ayuda.

    ResponderEliminar
    Respuestas
    1. Hola Diego,
      sin complicarnos mucho la vida podríamos aplicar la función LEFT a la variable .Files, algo así en la línea 24 del código:
      ActiveCell = Left(archivo.Name,Len(archivo.Name)-4)

      Saludos

      Eliminar
    2. Muchas gracias Ismael. Me fué de gran ayuda, pero me sucede lo siguiente: en todos los nombres de archivos debo quitar el mismo nº de caracteres, la cuestión es que algunos tienen menos caracteres de los que debo quitar y el programa reacciona dejando de contar lo cual deja muchos nombres si recortar. ¿Cómo puedo hacer para saltarme estos nombres de archivos?

      Gracias de antemano y perdón por el abuso.
      Saludos.

      Eliminar
    3. Hola!,
      ¿como es posible tengan menos de 4 caracteres contando el punto y la extensión (xxxx.jpg)??.. eso significaría que el archivo no tiene nombre!!

      En todo caso, puedes aplicar un condicional sobre la función Len(..), para que cuando sea inferior a una cantidad salte al siguiente... o bien añade instrucciones de control de error:
      on error resume next
      ...resto código
      on error goto 0

      saludos

      Eliminar
    4. Hola,

      En realidad tenían más de cuatro caracteres, lo que puse era simplemente un ejemplo.
      Solo agradecerte nuevamente la pronta respuesta y la ayuda prestada. Gracias y un cordial saludo.

      Eliminar
    5. perfecto!
      es importante plantear los problemas de la manera más exacta posible, ya que las soluciones pueden ser diferentes en cada caso
      ;-)
      Saludos

      Eliminar
  21. Hola Isamel,
    En este desarrollo de macro, podria listar ficheros de una carpeta con la fecha y hora al lado .

    Slds

    ResponderEliminar
  22. Excelente Ismael.
    Muy importante tu aportacion. Me sirvio de mucho.

    Saludos

    ResponderEliminar
  23. Hola necesito copiar una carpeta y pegarla en otra ubicacion pero reemplazando el nombre original por la fecha y hora del sistema. Por ej si la carpeta se llama balance, se copia y se pega con el nombre 21-07-2015 16:15, y asi todas las veces que pegue una nueva carpeta sin sobreescribirla ya que sera distintas por la fecha del sistema. _Gracias

    ResponderEliminar
    Respuestas
    1. Hola martin,
      escribiré un post al respecto en cuanto me sea posible.
      Pero la idea será emplear el método .MoveFolder parar orientarte...

      Saludos

      Eliminar
    2. Hola Ismael, estuve analizando la opcion movefolder pero no la use porque vi comentarios de que si se mueve una carpeta y el sistema de conexion falla se puede perder la misma. Entonces antes de arriesgarme logre esto.

      Private Sub Command1_Click()
      Dim fso As New FileSystemObject
      fso.copyfolder "C:\archivo\legajos", "D:\carpeta1\libro\" & Format(Now, "dd-mm-yy # hh.mm.ss")
      End Sub

      Antes tuve que ir al menu seleccione herramientas - referencia y activar Microsoft Scripting Runtime, o sino no funciona .

      Y logre lo que queria realizar, que la carpeta "legajos" se guarde en otra ubicacion pero con la fecha y hora del sistema.

      Desde ya mucha gracias !!. Martin
      A continuacion te dejo otra inquitud.


      Eliminar
  24. Ismael, tengo una red con varias maquinas conectadas entre si, todas tienen excel donde ingresan datos en forma de bloque (esto seria ingresan 100 registro numericos y guardan), pero hay una maquina que guarda la informacion de las demas. Yo quiero realizar lo siguiente que cada maquina que guarda su informacion me mande un mensaje a la maquina donde esta la hoja principal .
    maquina1(hoja1)-------guarda---------mensaje--------maquina principal.
    maquina2(hoja2)-------guarda---------mensaje--------maquina principal

    la maquina principal seria la que recepcion los mensajes atravez de estas alerta.
    Lo que se me complica es enviar un mensaje de una planilla excel atravez de la red y aparezca como banner de alerta en la otra planilla .
    Espero haber sido claro.Desde ya muchas gracias. Martin

    ResponderEliminar
    Respuestas
    1. Hola,
      entiendo que es siempre el mismo Libro compartido, y que el fichero está abierto simultáneamente en la maquinaX y la máquina principal...
      Diría estas son las condiciones ideales para que funcionara la idea que se me ocurre:
      Emplear un condicional en el Libro único para que cuando el nombre de usuario:
      Application.UserName
      sea uno en particular (el de la máquina principal) lance un mensaje asociado al evento BeforeSave grabado en la hoja 'Thisworbook'

      Espero te oriente
      Saludos

      Eliminar
  25. Hola Martin.
    correcto, pero no es lo mismo Mover que Copiar... obviamente si el sistema falla cuando estás duplicando algo, la carpeta original siempre permanecerá... por contra, si todo va bien (el 99,9999% de las veces es así) tendrás una carpeta duplicada ;-)
    Saludos

    ResponderEliminar
  26. Consulta, estoy viendo este evento, mi gran dudas es saber si por ejemplo, la maquina1 termina de grabar el libro1, en la maquina principal le llegue algun aviso de esa modificacion.
    Sigo intentando, desde ya muchas gracias, por tus comenterios. Martin

    ResponderEliminar
    Respuestas
    1. He estado dándole una segunda vuelta al asunto... la complejidad, obviamente, es lanzar un mensaje a un equipo concreto.
      Existe una funcionalidad de Windows (a lanzar desde el CMD) que funciona como mensajería entre unidades de una misma RED.. y que puede ser llamado desde VBA empleando el comando Shell.
      Las instrucciones de MS-DOS son 'net send' o 'msg', un problema gordo es que dependerá de la versión/subversión de Windos te funcionará uno u otro (o no te funcionará...)

      Espero te oriente en tu búsqueda (OJO con las versiones de Windows!!)
      Saludos

      Eliminar
  27. Hola me gustaria que me ayudes a listar carpetas y subcarpetas y archivos xlsx que inician con un nombre especifico ejemplo WO 1558966 . gracias de antemano por la ayuda

    ResponderEliminar
    Respuestas
    1. perdon solo que comienzan co WO gracias

      Eliminar
    2. Hola,
      habría que añadir al bucle un condicional IF THEN, en las líneas del código 22 a 27:
      For Each archivo In ficheros
      IF left(archivo.name,2)="WO" THEN
      'escribimos el nombre del fichero
      ActiveCell = archivo.Name
      'bajamos una fila
      ActiveCell.Offset(1, 0).Select
      END IF
      Next archivo

      Saludos

      Eliminar
  28. Hola Ismael hay alguna macro que permita copiar cualquier archivo (.jpg, .doc, .pdf, etc) y copiarlo con una ubicación específica y con un nombre específico. desde un formulario Excel VBA y guardar el nombre

    ResponderEliminar
    Respuestas


    1. Estoy armando un módulo conectado mediante ADO a Excel Access y en cierta parte el proceso necesito adjuntar desde un formulario Excel VBA archivos de diferente tipo(.jpg, .doc, .pdf), había pensado en incrustarlos en Access como objeto OLE los diferentes archivos, para luego llamarlos y poder observarlos además de poder adjuntarlos como correo en outlook, pero lo veo un poco más dificil que guardar un archivo de una ubicación cualquiera a una ubicación en específico y cambiando el nombre al registro que estoy registrando (valga la redundancia)

      Eliminar
    2. Hola Luis Enrique,
      para mover archivos se suele emplear algo de este estilo:

      Sub MoverArchivo()
      RutaVieja = "E:\test1\"
      NuevaRuta = "E:\test2\"
      Fname = Dir(RutaVieja & "*.xls*")
      Do While Fname <> ""
      Name RutaVieja & Fname As NuevaRuta & Fname
      Fname = Dir
      Loop
      End Sub

      Otra forma que he encontrado en un foro de internet (en mrexcel.com) es:
      Sub MoveFiles()
      Dim d As String, ext, x
      Dim srcPath As String, destPath As String, srcFile As String
      srcPath = "C:\test\"
      destPath = "C:\test2\"
      ext = Array("*.csv", "*.xls")
      For Each x In ext
      d = Dir(srcPath & x)
      Do While d <> ""
      srcFile = srcPath & d
      FileCopy srcFile, destPath & d
      Kill srcFile
      d = Dir
      Loop
      Next
      End Sub

      Espero alguno te sirva
      Saludos

      Eliminar
  29. Bueno días Ismael,
    Estoy intentando realizar un formulario que al seleccionar un país en una lista desplegable modifica una imagen para mostrar la bandera del país. Para poder usarla desde cualquier PC he optado por en lugar de tener las imágenes de banderas en local, tomarlas directamente de la web.
    Sin embargo al cambiar la propiedad Picture (a mano desde la ventana de propiedades) e insertarle un vinculo web me dice siempre que la imagen no es válida (independientemente del formato).

    ¿Debe usarse otro elemento o definirse alguna funcion o variable previa para poder tomar imágenes de internet? O se trata de un problema de mi red que pueda estar capada de alguna manera?

    Muchas gracias y enhorabuena por tu blog.

    ResponderEliminar
    Respuestas
    1. Hoal Alberto,
      cargar la imagen directamente no creo sea posible (salvo mejor opinión), pero algo muy habitual en casos similares es cargar en temporal la imagen de la web/internet, para luego situarla en el UserForm.
      Echa un vistazo a este post de MSDN:
      https://social.msdn.microsoft.com/Forums/office/en-US/5fc7e8db-1bce-4b13-b049-00434757bed2/load-excel-form-image-control-from-web?forum=exceldev
      Saludos

      Eliminar
  30. Ismael:
    Estoy muy agradecido por compartir tus conocimientos.
    Quisiera que nos explicaras los cambios que se haría para que el usuario buscara la ruta y no sea una ruta predefinida como lo propones.

    Gracias y felicidades

    ResponderEliminar
    Respuestas
    1. Hola!
      echa un vistazo a este post
      http://excelforo.blogspot.com.es/2010/04/explorador-en-vba.html
      con el podrás buscar la ruta empleando el explorador de Windows...
      Saludos

      Eliminar
    2. Buenas noches Ismael:
      Excelente solución, gracias por tremendo aporte.
      Saludos

      Eliminar
  31. ¿Como listar únicamente aquellos archivos que comiencen,- (de izquierda a derecha) -, por ejemplo con algún caracter previamente especificado en una instrucción o código?. Desde ya, muchísimas gracias por vuestra entrega en lo que aportan a los consultantes.

    ResponderEliminar
    Respuestas
    1. Hola Hernán,
      en las líneas 22 a 27 añadirías una condición:
      ....
      For Each archivo In ficheros
      if left(archivo.name,2)="PI" then
      ActiveCell = archivo.Name
      ActiveCell.Offset(1, 0).Select
      end if
      Next archivo
      ....

      Saludos

      Eliminar
  32. Ismael, cordial saludo
    En mi caso, debo llevar un registro de todas las ventas de cada empleado en los almacenes a nivel nacional (50 tiendas). En cada tienda el gerente debe consolidar las ventas de cada vendedor. Hice el ejercicio para una tienda y me funciona bien, pues conozco los nombres de los vendedores y puedo consolidar sin problema, no he podido consolidar para las demás tiendas porque los nombres varían. ¿Como puedo hacer la macro para que me abra cada libro por vendedor, consolide las ventas y pueda hacer este ejercicio en cada tienda?

    ResponderEliminar
    Respuestas
    1. Hola,
      si ubicas todos los libros de los Vendedores en una sola carpeta, podrás indicar que se abra uno a uno cada libro y trabajar/recuperar los datos que necesites consolidar, y luego cerrarlo.. con el bucle te aseguras que se irán abriendo uno a uno y perderás datos de ningún vendedor
      Saludos

      Eliminar
  33. Hola que tal,
    Primero quiero agradecer mucho a excelforo y a Ismael Romero por su inmensa ayuda, y me gustaría saber si hay alguna forma de contar las hojas de otros documentos, pueden ser pdf, .doc etc. codigo vba. de antemano reitero mi agradecimiento. Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Enrique,
      gracias por tus palabras.

      Para conocer el número de páginas en otros tipos de documentos (pdf, word, etc), lo primero que necesitaríamos sería instalar las librerías con las que controlar con VBA dichos programas...
      En esas librerías tendríamos las propiedades para recuperar, en cada caso, ese conteo de páginas...

      Por ejemplo en Word sería algo así:
      .ActivePane.Pages.Count
      dentro de su contexto de objeto.

      No hay una solución única a priori.. aunque quizá todas sean parecidas

      Un saludo

      Eliminar
  34. hola amigo, tengo un problema, cuando ejecuto la macro hace su trabajo bien, lo único es que tambien carga los archivos o metadatos y los lista, con qué código podría evitar esto?
    gracias por tu atención.

    ResponderEliminar
    Respuestas
    1. Hola,
      perdona, a que te refieres con 'carga los archivos'??
      Como se indica en el post el objetivo es precisamente listar los archivos...
      Debo entender que lo que quieres listar las carpetas dentro de la ruta?
      Slds

      Eliminar
    2. perdon, no fui especifico, me explico:
      tengo una carpeta con algunas canciones en .mp3, al ejecutar la macro lista las canciones pero tambien los metadatos de estas (como las fotos del album y otros archivos que tambien se listan).
      estos archivos supongo que estan internos en el .mp3.
      alguna vez escuche que existe un código que evita que se listen estos "archivos". espero me puedas ayudar, gracias.

      Eliminar
    3. No había leído nada al respecto... si localizas la manera, por favor, sube el comentario de cómo lo conseguiste
      Mil gracias!

      Eliminar
    4. ismael, para mas detalle, los archivos del sistema son los que tienen extensión (.db), los archivos que se adjuntan al ejecutar la macro tienen esta extensión y además los (.jpg) de las fotos de los albumes del artista de cada canción.
      gracias.

      Eliminar
  35. Excelente Ismael. gracias.

    Para obtener el nombre de la carpeta donde esta almacenado el archivo, con esta misma macro como lo realizamos.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola Gerardo, puedes emplear:
      thisworbook.path
      para obtener la ruta del fichero de trabajo
      Slds

      Eliminar
  36. Hola
    sabes si se puede obtener información de un archivo outlook .msg sin tener que abrirlo y luego listarlo en excel?
    gracias buenísimo tu blog

    ResponderEliminar
    Respuestas
    1. Hola Ángela,
      si es posible.. qué información es la que necesitas?. Sabes en qué carpeta (si existe) está ese mail (en Entradas o similar?...

      El asunto es algo largo, según tu respuesta trataré de subir una explicación al blog.

      Saludos

      Eliminar
    2. por ejemplo tengo muchos correos en formato.msg en una carpeta en el escritorio, quisiera hacer un listado en excel con la fecha en la que recibi el correo, el asunto y alguna información que tenga el correo dentro en el texto, como quien lo envía y por ejemplo el tema
      gracias por tu respuesta!!

      Eliminar
    3. Ok,
      subiré un post al blog sobre el tema

      Slds

      Eliminar
  37. Hola, alguna alternativa para abrir el archivo excel, sacar o copiar los datos de una hoja hasta cierto nuevo de filas que tenga datos y luego copiarlo en un nuevo archivo maestro o consolidado.

    Ya que excelente el articulo que hiciste sobre listar los archivos.

    ResponderEliminar
    Respuestas
    1. Hola Edgar,
      si no quieres abrir el libro, las alternativas son vínculos externos o bien conexiones de datos...
      ;-)
      Saludos

      Eliminar
  38. Hola Ismael, y sería posible que solo se listen los archivos de excel que haya en la carpeta?

    gracias

    ResponderEliminar
    Respuestas
    1. Hola Javier,
      podrías probar (adaptando la macro anterior) con:
      strPath = "E:\ruta\"
      strFile = Dir(strPath & "*.xlsx")

      Do While strFile <> ""
      'aquí gestionar los nombres etc
      'y lo llevas a las celdas que necesites

      strFile = Dir
      Loop

      Saludos

      Eliminar
  39. Buenos dias disculpe como podria traer el nombre del archivo mas reciente de una carpeta,a una hoja de excel.sin traer todos los demas nombres de archivos que contemga la carpeta.

    ResponderEliminar
    Respuestas
    1. Hola Meny,
      podrías utilizar la propiedad del documento .DateLastModified por cada uno de los ficheros de una carpeta para identificar el último...
      Saludos

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

    ResponderEliminar
  41. Saludos Amigo

    En mi caso para cada archivo que me genera la lista debo leer el contenido de una celda en particular ( caso resuelto ), pero cuando hago el recorrido, cada archivo tiene una clave de acceso ( afortunadamente es igual para todos ) entonces me abre la ventana de solicitud de la clave y para poder acceder a esa información debo de darle la clave, cual es la función que me permite incluirla en la macro?

    _Gracias..!!!

    ResponderEliminar
    Respuestas
    1. Hola Walter,
      para abrir un libro de Excel con contraseña tendrías que utilizar algo así:
      Workbooks.Open(Filename:="C:\Tu Ruta\Tu libro.xlsx", Password:="tu contraseña")

      Saludos

      Eliminar
  42. Hola,Yo pongo una dirección que se conecta por network, entonces tengo el problema de que si la maquina no esta conectada mi macro se traba tratando de ingresar a la dirección y al no poder se detiene.

    ResponderEliminar
    Respuestas
    1. Hola Ricardo,
      claro está para conectarse a una carpeta se debe tener acceso y/o permisos...
      Saludos

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

    ResponderEliminar
  44. hola, si quisiera hacer un filtro? es decir si solo quiero listar los archivos de una extension determinada?

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set carpeta = fso.getfolder(pathoutput)
    Set ficheros = carpeta.Files

    For Each ficheros In ficheros
    'aqui desearia trabajar solo con los de un tipo de extension
    b = ficheros.Name
    ...
    ...
    Next

    Si necesitas algo mas dímelo.
    Muchas gracias de antemano.

    ResponderEliminar
    Respuestas
    1. encontre la solucion! la pongo por si le sirve de ayuda a alguien:
      Set fso = CreateObject("Scripting.FileSystemObject")
      Set carpeta = fso.getfolder(pathoutput)
      Set ficheros = carpeta.Files

      For Each ficheros In ficheros
      If ficheros.Type = "Archivo XML" Then
      b = ficheros.Name


      No se si dara problemas con SO en ingles...

      Eliminar
  45. Ismael, buen día, primero comentarte que ha sido de gran utilidad tu contenido. Ahora, estoy tratando de elaborar un listado de archivos (correos outlook) extrayendo la fecha de envio del correo, la macro publicada por tu persona funciona bien extrayendo el nombre del correo, pero me gustaria saber si hay alguna manera de extraer la fecha de envio del correo, la cual se encuentra en la parte incial del correo como encabezado, información que se encuentra dentro del correo. Estaría muy agradecido de compartirlo.

    ResponderEliminar

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