El uso de matrices es de las mejores prácticas para realizar los procesos en memoria con una gran cantidad de datos.
En este ejemplo, la macro copia los datos de las columnas del libro 1 y las pega en el libro 2, pero en el libro 2 las columnas están en diferente orden.
En el vídeo también explico la manera de utilizar el diccionario (Dictionary) para indexar los títulos de las columnas.
Código para copiar Datos:
Sub Comparar_Datos()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim dic As Object
Dim a As Variant, b As Variant
Dim i As Long, j As Long, lr As Long, lc As Long
Set dic = CreateObject("Scripting.Dictionary")
Set sh1 = Workbooks("Libro1").Sheets("Matriz")
Set sh2 = Workbooks("Libro2").Sheets("Datos")
lr = sh1.Range("A:D").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row
lc = sh1.Cells(4, Columns.Count).End(1).Column
a = sh1.Range("A4", sh1.Cells(lr, lc)).Value
b = sh2.Range("A4").Resize(UBound(a, 1), UBound(a, 2)).Value
'recorre las columnas del libro2 para armar el diccionario
For j = 1 To UBound(b, 2)
dic(b(1, j)) = j 'almacena el título en el diccionario y como item la columna
Next
'recorre la matriz 'a' por columna, busca la columna en el diccionario
'y en esa columna almacena los datos
For j = 1 To UBound(a, 2)
If dic.exists(a(1, j)) Then
'pasa los datos de la matriz 'a' a la matriz 'b'
For i = 2 To UBound(a, 1)
b(i, dic(a(1, j))) = a(i, j)
'sh2.Range("A4").Resize(UBound(b, 1), UBound(b, 2)).Value = b
Next
End If
Next
sh2.Range("A4").Resize(UBound(b, 1), UBound(b, 2)).Value = b
End Sub
Dim sh1 As Worksheet, sh2 As Worksheet
Dim dic As Object
Dim a As Variant, b As Variant
Dim i As Long, j As Long, lr As Long, lc As Long
Set dic = CreateObject("Scripting.Dictionary")
Set sh1 = Workbooks("Libro1").Sheets("Matriz")
Set sh2 = Workbooks("Libro2").Sheets("Datos")
lr = sh1.Range("A:D").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row
lc = sh1.Cells(4, Columns.Count).End(1).Column
a = sh1.Range("A4", sh1.Cells(lr, lc)).Value
b = sh2.Range("A4").Resize(UBound(a, 1), UBound(a, 2)).Value
'recorre las columnas del libro2 para armar el diccionario
For j = 1 To UBound(b, 2)
dic(b(1, j)) = j 'almacena el título en el diccionario y como item la columna
Next
'recorre la matriz 'a' por columna, busca la columna en el diccionario
'y en esa columna almacena los datos
For j = 1 To UBound(a, 2)
If dic.exists(a(1, j)) Then
'pasa los datos de la matriz 'a' a la matriz 'b'
For i = 2 To UBound(a, 1)
b(i, dic(a(1, j))) = a(i, j)
'sh2.Range("A4").Resize(UBound(b, 1), UBound(b, 2)).Value = b
Next
End If
Next
sh2.Range("A4").Resize(UBound(b, 1), UBound(b, 2)).Value = b
End Sub
Macro para copiar en 2 columnas diferentes en el destino:
Sub Comparar_Datos_2()
'copiar en dos columnas diferentes
Dim sh1 As Worksheet, sh2 As Worksheet
Dim dic As Object
Dim a As Variant, b As Variant
Dim i As Long, j As Long, lr As Long, lc As Long
Dim js As String, col As Variant
Set dic = CreateObject("Scripting.Dictionary")
Set sh1 = Workbooks("Libro1").Sheets("Matriz")
Set sh2 = Workbooks("Libro2").Sheets("Datos")
lr = sh1.Range("A:D").Find("*", , xlValues, xlPart, xlByRows, xlPrevious).Row
lc = sh1.Cells(4, Columns.Count).End(1).Column
a = sh1.Range("A4", sh1.Cells(lr, lc)).Value
lc = sh2.Cells(4, Columns.Count).End(1).Column 'columnas en libro2
b = sh2.Range("A4").Resize(UBound(a, 1), lc).Value
'recorre las columnas del libro2 para armar el diccionario
For j = 1 To UBound(b, 2)
If Not dic.exists(b(1, j)) Then
dic(b(1, j)) = j 'almacena el título en el diccionario y como item la columna
Else
js = dic(b(1, j)) & "|" & j
dic(b(1, j)) = js 'almacena otra columna en caso de repetirse el mismo título
End If
Next
'recorre la matriz 'a' por columna, busca la columna en el diccionario
'y en esa columna almacena los datos
For j = 1 To UBound(a, 2)
If dic.exists(a(1, j)) Then
'pasa los datos de la matriz 'a' a la matriz 'b'
For Each col In Split(dic(a(1, j)), "|") 'para cada columna, incluso si hay repetidas
For i = 2 To UBound(a, 1)
b(i, col) = a(i, j)
Next
Next
End If
Next
sh2.Range("A4").Resize(UBound(b, 1), UBound(b, 2)).Value = b
End Sub
Archivo:
No hay comentarios.:
Publicar un comentario