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:
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:
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:
Hola Fabio,
ResponderEliminarmañana subiré un post al blog dando el detalle del código necesario...
Slds
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...
ResponderEliminargracias Anticipadas
Hola,
Eliminaren 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
No hay forma que la lista salga ordenada alfabéticamente?
ResponderEliminarHola Jonathan, ¿cómo estás?
EliminarEspero 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
Una consulta, ¿que debo modificar si quiero obtener los nombres de las carpetas en vez de nombres de archivos en el directorio seleccionado?
ResponderEliminarHola Cristian, que tal?
Eliminarpara 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
Muchas gracias, ha sido rápido e indiloro.
ResponderEliminarjaja...
Eliminargracias a ti.
Slds
Hola buenas
ResponderEliminarYa 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 :)
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:
ResponderEliminarSub 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!
Hola!!
Eliminarbuena 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
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.
ResponderEliminarLo 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.
Hola Nikx,
Eliminarsi 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
Voy avanzando en el trabajo va por buen camino, Gracias por tu apoyo. Te comento en cuanto quede listo.
ResponderEliminarNiks, estoy buscando lo mismo que vos, pero no logre escribir la parte del codigo que vaya abriendo los archivos del listado. Pudiste hacerlo?
Eliminarexcelente funcion al pelo
ResponderEliminar;-)
EliminarGracias y un saludo
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
ResponderEliminarHola, que tal estás... espero te encuentres bien tu también.
EliminarUn 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
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.
ResponderEliminarQuiero 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.
Hola Javier,
Eliminargracias 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
Gracias por tu pronta respuesta,
EliminarEs 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.
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.
EliminarEs extraño de todas formas, por lo que he entendido, que metiendo la ruta a mano sí la reconozca...
???
suerte!!!
Un saludo
Buenas tardes,
ResponderEliminarSi quisiera que me devolviera HIPERVINCULOS a esos archivos, que debería hacer?
Hola Gabriel,
Eliminarpara 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
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???
ResponderEliminarHola!
Eliminarvaya 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
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?
ResponderEliminarte agradezco la ayuda,
CESAR W GRIMALDOS M
enithma@hotmail.com
Hola Cesar,
Eliminarpara 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!!
Muy bueno.
ResponderEliminarMuchísimas gracias
Hola Ismael otra vez de nuevo por aquí.
ResponderEliminarUn 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.
Hola,
Eliminarserí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
Hola Ismael, y como haría para que no cargue todos los archivos, sino solamente los de extensión (.xls)
ResponderEliminarHola!
Eliminarsubiré una explicación en cuanto pueda.
Saludos
Hola!
ResponderEliminarTengo 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!
Hola Omar,
EliminarUn 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
Lo unico que no me queda claro es de que tipo es lo que llamaste "archivo" en el For Each,
ResponderEliminarSaludos
Hola Fátima,
Eliminaral 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
Hola.
ResponderEliminarGracias 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.
Hola Diego,
Eliminarsin 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
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?
EliminarGracias de antemano y perdón por el abuso.
Saludos.
Hola!,
Eliminar¿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
Hola,
EliminarEn 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.
perfecto!
Eliminares importante plantear los problemas de la manera más exacta posible, ya que las soluciones pueden ser diferentes en cada caso
;-)
Saludos
Hola Isamel,
ResponderEliminarEn este desarrollo de macro, podria listar ficheros de una carpeta con la fecha y hora al lado .
Slds
Hola Juan,
Eliminaresta entrada te servirá para lo que pareces necesitar:
http://excelforo.blogspot.com.es/2012/05/vba-una-macro-en-excel-para-listar-las.html
Saludos
Excelente Ismael.
ResponderEliminarMuy importante tu aportacion. Me sirvio de mucho.
Saludos
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
ResponderEliminarHola martin,
Eliminarescribiré un post al respecto en cuanto me sea posible.
Pero la idea será emplear el método .MoveFolder parar orientarte...
Saludos
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.
EliminarPrivate 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.
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 .
ResponderEliminarmaquina1(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
Hola,
Eliminarentiendo 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
Hola Martin.
ResponderEliminarcorrecto, 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
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.
ResponderEliminarSigo intentando, desde ya muchas gracias, por tus comenterios. Martin
He estado dándole una segunda vuelta al asunto... la complejidad, obviamente, es lanzar un mensaje a un equipo concreto.
EliminarExiste 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
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
ResponderEliminarperdon solo que comienzan co WO gracias
EliminarHola,
Eliminarhabrí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
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
EliminarEstoy 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)
Hola Luis Enrique,
Eliminarpara 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
Bueno días Ismael,
ResponderEliminarEstoy 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.
Hoal Alberto,
Eliminarcargar 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
Ismael:
ResponderEliminarEstoy 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
Hola!
Eliminarecha 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
Buenas noches Ismael:
EliminarExcelente solución, gracias por tremendo aporte.
Saludos
¿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.
ResponderEliminarHola Hernán,
Eliminaren 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
Ismael, cordial saludo
ResponderEliminarEn 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?
Hola,
Eliminarsi 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
Hola que tal,
ResponderEliminarPrimero 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.
Hola Enrique,
Eliminargracias 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
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?
ResponderEliminargracias por tu atención.
Hola,
Eliminarperdona, 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
perdon, no fui especifico, me explico:
Eliminartengo 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.
No había leído nada al respecto... si localizas la manera, por favor, sube el comentario de cómo lo conseguiste
EliminarMil gracias!
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.
Eliminargracias.
Excelente Ismael. gracias.
ResponderEliminarPara obtener el nombre de la carpeta donde esta almacenado el archivo, con esta misma macro como lo realizamos.
Gracias.
Hola Gerardo, puedes emplear:
Eliminarthisworbook.path
para obtener la ruta del fichero de trabajo
Slds
Hola
ResponderEliminarsabes 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
Hola Ángela,
Eliminarsi 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
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
Eliminargracias por tu respuesta!!
Ok,
Eliminarsubiré un post al blog sobre el tema
Slds
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.
ResponderEliminarYa que excelente el articulo que hiciste sobre listar los archivos.
Hola Edgar,
Eliminarsi no quieres abrir el libro, las alternativas son vínculos externos o bien conexiones de datos...
;-)
Saludos
Hola Ismael, y sería posible que solo se listen los archivos de excel que haya en la carpeta?
ResponderEliminargracias
Hola Javier,
Eliminarpodrí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
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.
ResponderEliminarHola Meny,
Eliminarpodrías utilizar la propiedad del documento .DateLastModified por cada uno de los ficheros de una carpeta para identificar el último...
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarSaludos Amigo
ResponderEliminarEn 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..!!!
Hola Walter,
Eliminarpara 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
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.
ResponderEliminarHola Ricardo,
Eliminarclaro está para conectarse a una carpeta se debe tener acceso y/o permisos...
Saludos
Este comentario ha sido eliminado por el autor.
ResponderEliminarhola, si quisiera hacer un filtro? es decir si solo quiero listar los archivos de una extension determinada?
ResponderEliminarSet 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.
encontre la solucion! la pongo por si le sirve de ayuda a alguien:
EliminarSet 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...
Gracias por compartirlo
Eliminar;-)
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