Hola yojoaco,
Prueba con el siguiente código. A mi me funciona.
Código:
Código vb:
Ver originalOption Explicit
Sub Macro1()
Dim uf1 As Long
Dim uf2 As Long
Dim Lista1() As Variant
Dim Lista2() As Variant
Dim i As Long
Dim j As Long
'Carga en 2 arrays las dos tablas (Es más rapido que consultar la hoja directamente)
Cargar Lista("Control.xlsm", "Hoja1", "A1:H", Lista1, uf1)
Cargar Lista("Notas de Pedido.xlsm", "Hoja1", "A1:H", Lista2, uf2)
'Si el dato de la columna 1 de la tabla "Control" es igual a otro dato de la tabla "Notas de pedido"
'copia la fila en la tabla "Control" en la posición correspondiente
For i = 1 To uf1
For j = 1 To uf2
If Lista1(1, i) = Lista2(1, j) Then
Lista1(2, i) = Lista2(2, j)
Lista1(3, i) = Lista2(3, j)
Lista1(4, i) = Lista2(4, j)
Lista1(5, i) = Lista2(5, j)
Lista1(6, i) = Lista2(6, j)
Lista1(7, i) = Lista2(7, j)
End If
Next j
Next i
'Copia el array (en memoria) a la tabla de excel "Control"
Call Volcar_Tabla("Control.xlsm", "Hoja1", Lista1)
End Sub
Public Function Calcular_UF(Libro As String, Hoja As String, Columna As Integer, Fila As Long) As Long
'Calcular la ultima fila de una columna de datos
While Not IsEmpty(Application.Workbooks(Libro).Sheets(Hoja).Cells(Fila, Columna))
Fila = Fila + 1
Wend
Calcular_UF = Fila - 1
End Function
Public Sub Cargar_Lista(Libro As String, Hoja As String, Ran As String, list As Variant, Optional uf As Long)
'Copia la tabla de excel a un array en memoria
Dim Rango As Range
Ran = Ran & Calcular_UF(Libro, Hoja, 1, 2)
Set Rango = Application.Workbooks(Libro).Sheets(Hoja).Range(Ran)
list = Application.Transpose(Rango)
uf = UBound(list, 2)
End Sub
Private Sub Volcar_Tabla(Libro As String, Hoja As String, Tabla() As Variant)
'Vuelca la tabla en memoria a el documento Excel
Dim m As Long
Dim n As Long
Dim Rango As Range
m = UBound(Tabla, 1)
n = UBound(Tabla, 2)
Set Rango = Range(Application.Workbooks(Libro).Sheets(Hoja).Cells(1, 1), Application.Workbooks(Libro).Sheets(Hoja).Cells(n, m))
Rango = Application.Transpose(Tabla)
End Sub
Solo tienes que cambiar los nombres de los archivos "Control.xlsm" y "Notas de pedido.xlsm" por los nombres de tus archivos (.xlsm es de Excel 2007), puedes hacerlo con la herramienta buscar del editor de VBA. Tambien tienes que indicar el nombre de las hojas donde están los datos.
Además me parece que para que funcione tienen que estar los dos archivos Excel abiertos, si no, no funciona. Puedes incluir al principio una sentencia que abra el archivo "Notas de pedido" al ejecutarse la macro. La sintaxis la puedes ver con el grabador de macros, así es como aprendí yo.
Si en lugar de tener 2 libros, prefieres tener las dos tablas en un mismo archivo, borra las referencias a los libros asi como las variables libro.:
De: Application.Workbooks(Libro).Sheets(Hoja).Cells(Fi la, Columna)
A: Sheets(Hoja).Cells(Fila, Columna)
Si en la tabla "Hojas de pedido hay datos que se repiten en la primera columna, solo se tendrá en cuenta el último.
Salu2