2009-07-24 16 views
5

Recibo mensualmente más de 100 hojas de cálculo Excel desde las cuales tomo un rango fijo y lo pego en otra hoja de cálculo para hacer un informe.Extracción de datos con Excel

Im tratando de escribir un script vba para iterar mis archivos de Excel y copiar el rango en una hoja de cálculo, pero no he podido hacerlo.

¿Hay una manera fácil de hacer esto?

+3

Qusetions: 1) ¿Qué tienes hasta ahora? 2) ¿cómo saber qué archivos abrir?y 3) ¿Cuál es el problema con el que te encuentras? – RBarryYoung

Respuesta

3

Escribí esto hace años, pero tal vez te ayude. Agregué la extensión para la última versión de Excel (xlsx). Parece funcionar.

Sub MergeExcelDocs() 
    Dim lastRow As Integer 
    Dim docPath As String 
    Dim baseCell As Excel.range 
    Dim sysObj As Variant, folderObj As Variant, fileObj As Variant 
    Application.ScreenUpdating = False 
    docPath = Application.GetOpenFilename(FileFilter:="Text Files (*.txt),*.txt,Excel Files (*.xls),*.xls,Excel 2007 Files (*.xlsx),*.xlsx", FilterIndex:=2, Title:="Choose any file") 
    Workbooks.Add 
    Set baseCell = range("A1") 
    Set sysObj = CreateObject("scripting.filesystemobject") 
    Set fileObj = sysObj.getFile(docPath) 
    Set folderObj = fileObj.ParentFolder 
    For Each fileObj In folderObj.Files 
     Workbooks.Open Filename:=fileObj.path 
     range(range("A1"), ActiveCell.SpecialCells(xlLastCell)).Copy 
     lastRow = baseCell.SpecialCells(xlLastCell).row 
     baseCell.Offset(lastRow, 0).PasteSpecial (xlPasteValues) 
     baseCell.Copy 
     ActiveWindow.Close SaveChanges:=False 
    Next 
End Sub 

EDIT:

Debo mencionar cómo funciona. Cuando inicia la macro, abre un cuadro de diálogo Abrir archivo. Haga doble clic en el primer archivo de la lista (o cualquier archivo). Creará un nuevo libro de trabajo y luego recorrerá todos los archivos de la carpeta. Para cada archivo, copia todo el contenido de la primera hoja de cálculo y lo pega al final del nuevo libro de trabajo. Eso es todo lo que hay que hacer.

+0

¡Funcionó como un encanto! Acabo de agregar: Alcance ("H14: N14"). Copia Para satisfacer mis necesidades; Sin embargo, en el futuro, intentaré seguir el camino de ADO para obtener más flexibilidad. Muchas gracias señor! soy un habitante de cubículo feliz! – Rodrigo

+0

¡Me alegro de que haya sido útil! – devuxer

1

¿Usted intentó

Tools->Macro->Record New Macro 

para crear maco a hacer lo mismo

+0

Lo hice para tener una idea de cómo vba hace las cosas, pero necesito iterar para hacer lo mismo con una cantidad de archivos. – Rodrigo

+0

Este es el punto de partida de todas mis macros. – Kieveli

+0

Puede tener una hoja de cálculo en blanco con la macro en ella. Haz que recorra los archivos, ábrelos de uno en uno y luego copia todo. Intenta grabar una macro mientras lo haces en un par de archivos. – Kieveli

2

Otra solución es tener su enrollable acceso a las hojas de cálculo otras hojas de cálculo por nombre de archivo y apoderarse de los datos en sí.

Para hacer eso, necesitará tener todas las hojas de cálculo abiertas al mismo tiempo para poder actualizar los enlaces, pero eso probablemente sea más rápido que abrir y copiar/pegar uno a la vez, incluso con una macro . Cada hoja de cálculo necesitará un nombre de archivo único.

Si los nombres de las hojas de cálculo no son conocidos hasta que los recibe, o cambian regularmente, cree una columna en su tabla acumulativa para almacenar el nombre de archivo de las hojas y luego construya la dirección que necesita utilizando la manipulación de cadenas y obtener los datos usando INDIRECT().

Ejemplo para agarrar una celda de datos de un archivo en particular:

=INDIRECT("'[C:\path\workbook.xls]MyWorksheet'!$A$2") 

aclarar y repetir lo anterior para cada célula de cada hoja de cálculo que desea obtener.

Debe ser inteligente acerca de cómo hacer que la cuerda pase a INDIRECTO(). Constrúyalo como una fórmula para que pueda usar literalmente la misma fórmula para cada celda que necesite recuperar.

Ejemplo:

= INDIRECT("'[" & $A2 & "]MyWorksheet'!$" & ADDRESS(3, COL())) 

La fórmula anterior se destinarán a la hoja de cálculo cuyo nombre está en $ A2 (nota la falta de $ antes "2" para que pueda pegar la misma fórmula a otras filas para otros archivos), y obtenga el valor de la celda en la hoja MyWorksheet en la fila tres y en la columna actual (por lo tanto, si esto está en B2 en su roll-up, obtiene B3 del otro archivo).

Ajuste la función DIRECCIÓN para agregar desplazamientos a la fila y columna necesarias.

La ventaja de la solución anterior es que la misma fórmula se puede copiar y pegar en las filas y columnas que necesita rellenar, y Excel ajustará los $ A2 y COL() según sea necesario. Muy mantenible

Editar una vez tuve una situación similar, y no pude cargar todas las hojas de cálculo a la vez (más de 200). Creo que terminé escribiendo el VBA por lo que hizo que no en realidad abra y lea los archivos de Excel. En cambio, hice que recorriera los nombres de los archivos, abrí una conexión ODBC a cada uno y usé ADO para leer los valores que necesitaba de un rango con nombre prescrito (que aparece como una "tabla" en ODBC; las hojas de trabajo también aparecen como "tablas"). "pero hay reglas sobre nombres permitidos). Esto fue mucho más rápido que abrir y cerrar archivos de Excel, y tenía la ventaja adicional de no bloquear Excel.

+0

Im tipo de hacer eso ahora, usando una fórmula para llamar el valor de la hoja de cálculo; sin embargo, la solución preferida sería un script vba de excel. – Rodrigo

1

Rodrigo,

supongo que quiere decir más de 100 libros que es necesario abrir de forma individual y copiar y pegar en una sola? Suena divertido :)

Si puede ponerlos todos en un solo directorio, abrir cada archivo es bastante fácil, haga una búsqueda primero. (@Mark Biek ha publicado un buen ejemplo para usted)

Una vez que tenga un archivo abierto, copiaría los datos en un conjunto de registros ADO al que luego anexaría. Tengo posted some code para hacer algo muy similar con la fusión de varias hojas en un libro de trabajo.

No es exactamente lo que necesita, pero debería ayudar. De lo contrario, publique qué tan lejos llega y le daré otro vistazo durante la semana.

6

Aquí hay un código VBA que la iteración demuestra lo largo de un montón de archivos de Excel en un directorio y abrir cada uno:

Dim sourcePath As String 
Dim curFile As String 
Dim curWB As Excel.Workbook 
Dim destWB As Excel.Workbook 

Set destWB = ActiveWorkbook 
sourcePath = "C:\files" 

curFile = Dir(sourcePath & "\*.xls") 
While curFile <> "" 
    Set curWB = Workbooks.Open(sourcePath & "\" & curFile) 

    curWB.Close 
    curFile = Dir() 
Wend 

Esperemos que va a ser un buen punto de partida suficiente para que pueda trabajar su código de macro existente .

+0

Es, muchas gracias Mark. El verdadero problema para mí, fue obtener el select: copy: change workbook: pegar secuencia rigth. – Rodrigo

0

En el pasado, utilicé VBA para crear referencias externas (enlaces).

he publicado sobre ello aquí (véase el ejemplo 2):

Best short examples of the need for Excel VBA

Es similar al uso indirecto, pero sin necesidad de tener los libros de Excel abiertos.

La única desventaja es que una computadora vieja o una versión anterior de Excel, no estoy seguro de cuál, puede hacer que este proceso sea lento. Creo que es porque cada vez que se agrega una nueva referencia externa, todas las demás referencias externas se actualizan. Para que sea más rápido, establezco Cálculo en Manual, agregué las referencias externas y establecí el Cálculo en Automático para actualizarlas.

Después de eso, si solo quiere los valores, puede usar Romper enlaces o Copiar y pegar valores especiales.

Cuestiones relacionadas