Hola amigo: Tengo 200 facturas y cada una de ellas esta en en libro diferente, quiero sacar de cada libro los datos correspondientes a la celda b:17 y f:52 Y que los copie en el libro nuevo que estoy haciendo, también me gustaría que cuando pegase en el nuevo libro saltaría una fila para pegar los datos del siguiente libro, he probado de hacer una macro, pero solo consigo abrir un libro, no se como asignarle que me coja el siguiente libro, los archivos que quiero abrir están renombrados valor numérico, un saludo
1 Respuesta
Respuesta de fejoal
1
1
fejoal, Por falta de tiempo para responder como me gusta hacerlo suspendo...
Tres veces redacté este mail. Dos veces mi ~~~@#$%__!?¿##@@ PC se colgó y lo perdí, espero que esta sí logre completarla. Tal como lo pediste, aquí tienes una macro que desarrollé para que ejecute una determinada acción sobre varios libros. Para su funcionamiento solo necesitas crear un archivo nuevo que será un auxiliar para juntar todos los archivos en un único archivo. Este archivo debe tener una hoja llamada INICIO. En ella, coloca en la celda C7 la dirección de la carpeta donde debe buscar todos los archivos. En la celda C8, ingresa qué tipo de archivos debe considerar. Esto te permite, seleccionar algunos de los archivos del directorio indicado en C7. Así, por ejemplo, si quieres que sólo considere los archivos que empiezan con "Fact", coloca en esa celda: Fact*.xls Si quieres que traiga todos los archivos, simplemente deja en tal celda: *.xls La celda C9 permite que coloques una clave, en caso de que los archivos a abrir tuvieran la misma clave de protección para apertura. Si no tuviesen clave, deja esa celda en blanco. Como no dijiste, específicamente de qué hoja debe tomar el rango B17:F52, la celda C10 recibirá tal dato. Finalmente, la celda C11 tendrá el rango a traer (en tu caso:B17:F52) Otra hoja, que llamaré "DATOS", recibirá desde la celda B4 los rangos de tus archivos Graba este archivo. Ahora falta colocar la macro que hace el trabajo. Activa el editor de Visual Basic (presiona Alt+F11), inserta un nuevo módulo ("Insertar", "´Modulo") y pega el siguiente código: Sub Pegarango() '==== Variables del sistema Dim MiCarpeta As String, MisArchivos As String, MiClave As String 'manuales: Hoja_dest = "DATOS" Celda_ini = "B4" 'tomadas de Hoja Inicio: MiCarpeta = Trim(Sheets("INICIO").Range("C7").Value) & IIf(Right(Trim(Sheets("INICIO").Range("C7").Value), 1) = "\", "", "\") MisArchivos = Trim(Sheets("INICIO").Range("C8").Value) MiClave = Trim(Sheets("INICIO").Range("C9").Value) DeHoja = Trim(Sheets("INICIO").Range("C10").Value) ElRango = Trim(Sheets("INICIO").Range("C11").Value) With Application.FileSearch .LookIn = MiCarpeta .SearchSubFolders = True .FileName = MisArchivos If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 Then Sheets(Hoja_dest).Select Range(Celda_ini).Select For i = 1 To .FoundFiles.Count DirFile = .FoundFiles(i) Workbooks.Open FileName:=DirFile, Updatelinks:=False, PASSWORD:="" Application.Calculation = xlManual ActiveWorkbook.Unprotect PASSWORD:=MiClave '*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*' '* TAREA A EFECTUAR en archivo: PEGAR SECUENCIALMENTE RANGO DE CADA ARCHIVO '*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*' 'Application.ScreenUpdating = False Application.CutCopyMode = False Sheets(DeHoja).Select Range(ElRango).Copy ActiveWindow.ActivatePrevious Sheets(Hoja_dest).Select With Selection .PasteSpecial Paste:=xlValues .PasteSpecial Paste:=xlFormats End With 'ActiveSheet.Paste '<- Activa este si quieres que 'pegue los datos copiados tal como están en archivo 'de origen (y desactiva las cuatro lineas anteriores) ActiveCell.Offset(Selection.Rows.Count + 1).Select Application.CutCopyMode = False ActiveWindow.ActivateNext ActiveWorkbook.Close False Sheets("INICIO").Select Application.ScreenUpdating = True '============================================================= ' FIN tarea en archivo '============================================================= Next i MsgBox i - 1 & " ARCHIVOS AGREGADOS" Else MsgBox "No se encontró ningún archivo " & MisArchivos & " en " & Chr(10) & MiCarpeta End If End With End Sub Notarás que la mayoría de los datos están parametrizados, es decir que podrás cambiar la información en las variables sin tener que modificar el procedimiento. Un par se cargan dentro del código y el reto las toma de la hoja INICIO Cierra el editor de visual basic y graba el archivo. Hacia la mitad de la macro notarás que está indicada cuál es la tarea que debe realizar en cada archivo. De esta manera, si otro día quieres hacer otra cosa con varios archivos en un directorio, bastará que coloques el código a ejecutar en este lugar. El toque final sería colocar un botón en la hoja INICIO para activar la macro. Para esto, una vez copiada la macro en el archivo, muestra la barra de herramientas de "Formularios" ("Ver" | "Barras de herramientas" | "Formularios". De ella, toma el icono de "botón" y dibújalo en tu hoja. Al haber presionado el icono, el cursor del mouse se transformará en una cruz fina. Mantén presionado el botón derecho y arrástralo hasta donde desees dibujando el botón. Cuando sueltes la tecla, automáticamente aparecerá la lista de macros disponibles de dónde podrás seleccionar el que quieres asociar. Simplemente, dale doble click. También, puedes cambiar la vinculación de un botón con una macro, dando click derecho sobre él y eligiendo "Asignar macro". Otra vez, la lista de macros disponibles te permitirá realizar tal asignación. Listo. Tienes un archivo que abrirá uno de los que te mandaron. Copiará el rango indicado, uno a continuación de otro con una línea de separación y luego cerrará ese archivo. Posteriormente, hará lo propio con el siguiente y así, hasta terminar con todos los indicados. Finalmente bastará conque grabes este archivo combinado, dándole otro nombre por supuesto, y luego puedes eliminar la hoja INICIO y el módulo de la macro si no las necesitas. Esto debería resolver tu pregunta. Si así fuera, agradeceré un comentario y que la finalices. (Recuerda que mantener cierto número de respuestas pendientes impide que otros usuarios puedan consultarme) aclarando qué entendí mal o qué faltó.