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