varias unir una solo sola libros libro hojas hoja diferentes contenido concatenar como calculo archivos excel vba excel-vba

una - unir hojas de excel en un solo libro



Combinar hojas de Excel usando VBA (3)

Tengo una Hoja de Excel (Diga OG.xls) que ya tiene algunos datos con unas 5000 filas con títulos en la primera fila y Hasta "AN" Columnas. Este número de filas (5000) no cambia durante un año entero. Ahora tengo 5 archivos XL (Diga A, B, C, D, E) y los datos de estos archivos deben adjuntarse a este archivo OG comenzando desde la fila 5001 cada vez. Todos estos 5 archivos tienen diferentes no de columnas pero idénticos a los de OG File. Tengo que extraer datos de estos archivos y colocarlos en el archivo OG. Del archivo A: las columnas A, B, C, D, E, F, G y H van a la columna F, G, T, U, V, W, X e Y del archivo OG.xls. Del mismo modo, los otros datos de los archivos se deben extraer de acuerdo con la columna correspondiente con OG.xls

El segundo archivo de datos debe adjuntarse justo debajo de la siguiente fila donde termina el Archivo A. (Digamos después de completar los datos del Archivo A, ahora el OG.xls tiene 5110 filas, los datos del Archivo B deben llenarse desde la 5111ª fila de OG .xls. Lo mismo sucede con los otros archivos también. Los datos de estos 5 archivos deben llenarse fila tras fila, pero deben coincidir con las columnas de OG.xls

Cada vez que se repite la misma operación, se llenan los datos de la fila 5001 de OG.xls. Para mayor comodidad, podemos tener todos estos archivos en la misma carpeta.

Cómo podemos hacer esto.

¡¡¡Por favor, ayúdame en esto!!! También avíseme para cualquier aclaración.


Si necesita una respuesta más urgente, primero deberá probar algo y luego pedir ayuda en el área que se ha quedado atascada. Mi sugerencia es que comiences por; 1. Comience a escribir un script VBA en OG.XLS, como primer paso intente acceder al archivo A.xls y lea las columnas y peguelas (inicialmente pueden estar en cualquier ubicación y en cualquier orden). 2. Una vez que sea capaz de hacer esto, el siguiente paso es ver si coloca los datos en la columna de la derecha (digamos 5000 en su ejemplo) configurando el tipo correcto de variables y usándolos e incrementándolos. 3. El siguiente paso debería ser leer los encabezados de columna en A.XLS y encontrarlos OG.XLS e identificarlos. Inicialmente puede comenzar haciendo una simple comparación de cadenas, luego puede refinar esto para hacer una VLOOKUP. 4. Durante este proceso, si encuentra un problema específico, levántelo para que obtenga una mejor respuesta.

Pocos de la comunidad llegarían al extremo de escribir el código completo para usted.


Me encontré con este problema cuando uno de mis clientes se acercó a mí en busca de una solución para fusionar sus listas de stock que se guardan en más de 200 archivos separados. Si te encuentras en la misma posición que mi cliente; no te preocupes, escribí un programa simple que hace el trabajo. :) Mira el siguiente enlace:

JMC Excel - Join, Merge, Combine varias hojas de Excel o libros de Excel

Saludos, JeeShen Lee www.jeeshenlee.wordpress.com


¿Por qué la Columna A termina en la Columna F y por qué C termina en T? ¿Hay una regla alrededor de esto, como la primera fila es un encabezado con el mismo texto?

Tal vez una imagen podría ayudar.

En función de lo que pueda adivinar, lanzaría cada hoja en un RecordSet con nombres de campo significativos (deberá hacer referencia a la Microsoft ActiveX Data Objects 2.8 Library ). Una vez hecho esto, será muy fácil agregar cada RecordSet y colocarlos en una sola hoja.

Tendrá que ser capaz de encontrar la última columna y la última fila en cada hoja para hacerlo limpiamente, así que eche un vistazo a ¿Cómo puedo encontrar la última fila ...?

Editar...

A continuación se muestra un ejemplo limpio de cómo puede hacer lo que necesita en VBA. El diablo está en los detalles, como hojas vacías, y cómo manejar las fórmulas (esto las ignora por completo), y cómo fusionar las columnas de una manera apropiada (nuevamente ignorado).

Esto ha sido probado en Excel 2007.

Option Explicit Const MAX_CHARS = 1200 Sub MergeAllSheets() Dim rs As Recordset Dim mergedRS As Recordset Dim sh As Worksheet Dim wb As Workbook Dim fieldList As New Collection Dim rsetList As New Collection Dim f As Variant Dim cols As Long Dim rows As Long Dim c As Long Dim r As Long Dim ref As String Dim fldName As String Dim sourceColumn As String Set wb = ActiveWorkbook For Each sh In wb.Worksheets Set rs = New Recordset ref = FindEndCell(sh) cols = sh.Range(ref).Column rows = sh.Range(ref).Row If ref <> "$A$1" Or sh.Range(ref).Value <> "" Then '''' This is to catch empty sheet c = 1 r = 1 Do While c <= cols fldName = sh.Cells(r, c).Value rs.Fields.Append fldName, adVarChar, MAX_CHARS If Not InCollection(fieldList, fldName) Then fieldList.Add fldName, fldName End If c = c + 1 Loop rs.Open r = 2 Do While r <= rows rs.AddNew c = 1 Do While c <= cols rs.Fields(c - 1) = CStr(sh.Cells(r, c).Value) c = c + 1 Loop r = r + 1 Debug.Print sh.Name & ": " & r & " of " & rows & ", " & c & " of " & cols Loop rsetList.Add rs, sh.Name End If Next Set mergedRS = New Recordset c = 1 sourceColumn = "SourceSheet" Do While InCollection(fieldList, sourceColumn) '''' Just in case you merge a merged sheet sourceColumn = "SourceSheet" & c c = c + 1 Loop mergedRS.Fields.Append sourceColumn, adVarChar, MAX_CHARS For Each f In fieldList mergedRS.Fields.Append CStr(f), adVarChar, MAX_CHARS Next mergedRS.Open c = 1 For Each rs In rsetList If rs.RecordCount >= 1 Then rs.MoveFirst Do Until rs.EOF mergedRS.AddNew mergedRS.Fields(sourceColumn) = "Sheet No. " & c For Each f In rs.Fields mergedRS.Fields(f.Name) = f.Value Next rs.MoveNext Loop End If c = c + 1 Next Set sh = wb.Worksheets.Add mergedRS.MoveFirst r = 1 c = 1 For Each f In mergedRS.Fields sh.Cells(r, c).Formula = f.Name c = c + 1 Next r = 2 Do Until mergedRS.EOF c = 1 For Each f In mergedRS.Fields sh.Cells(r, c).Value = f.Value c = c + 1 Next r = r + 1 mergedRS.MoveNext Loop End Sub Public Function InCollection(col As Collection, key As String) As Boolean Dim var As Variant Dim errNumber As Long InCollection = False Set var = Nothing Err.Clear On Error Resume Next var = col.Item(key) errNumber = CLng(Err.Number) On Error GoTo 0 ''5 is not in, 0 and 438 represent incollection If errNumber = 5 Then '' it is 5 if not in collection InCollection = False Else InCollection = True End If End Function Public Function FindEndCell(sh As Worksheet) As String Dim cols As Long Dim rows As Long Dim maxCols As Long Dim maxRows As Long Dim c As Long Dim r As Long maxRows = sh.rows.Count maxCols = sh.Columns.Count cols = sh.Range("A1").End(xlToRight).Column If cols >= maxCols Then cols = 1 End If c = 1 Do While c <= cols r = sh.Cells(1, c).End(xlDown).Row If r >= maxRows Then r = 1 End If If r > rows Then rows = r End If c = c + 1 Loop FindEndCell = sh.Cells(rows, cols).Address End Function