Ver Mensaje Individual
  #3 (permalink)  
Antiguo 18/07/2010, 10:17
winweb89
 
Fecha de Ingreso: mayo-2009
Mensajes: 23
Antigüedad: 15 años
Puntos: 0
Respuesta: Macro para Copiar Datos de un archivo a otro cuando yo lo activo

Hola yojoaco,

Prueba con el siguiente código. A mi me funciona.

Código:


Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Sub Macro1()
  4.     Dim uf1 As Long
  5.     Dim uf2 As Long
  6.     Dim Lista1() As Variant
  7.     Dim Lista2() As Variant
  8.     Dim i As Long
  9.     Dim j As Long
  10.    
  11.     'Carga en 2 arrays las dos tablas (Es más rapido que consultar la hoja directamente)
  12.    Cargar Lista("Control.xlsm", "Hoja1", "A1:H", Lista1, uf1)
  13.     Cargar Lista("Notas de Pedido.xlsm", "Hoja1", "A1:H", Lista2, uf2)
  14.    
  15.     'Si el dato de la columna 1 de la tabla "Control" es igual a otro dato de la tabla "Notas de pedido"
  16.    'copia la fila en la tabla "Control" en la posición correspondiente
  17.    For i = 1 To uf1
  18.         For j = 1 To uf2
  19.             If Lista1(1, i) = Lista2(1, j) Then
  20.                 Lista1(2, i) = Lista2(2, j)
  21.                 Lista1(3, i) = Lista2(3, j)
  22.                 Lista1(4, i) = Lista2(4, j)
  23.                 Lista1(5, i) = Lista2(5, j)
  24.                 Lista1(6, i) = Lista2(6, j)
  25.                 Lista1(7, i) = Lista2(7, j)
  26.             End If
  27.         Next j
  28.     Next i
  29.    
  30.     'Copia el array (en memoria) a la tabla de excel "Control"
  31.    Call Volcar_Tabla("Control.xlsm", "Hoja1", Lista1)
  32. End Sub
  33.  
  34. Public Function Calcular_UF(Libro As String, Hoja As String, Columna As Integer, Fila As Long) As Long
  35.     'Calcular la ultima fila de una columna de datos
  36.    While Not IsEmpty(Application.Workbooks(Libro).Sheets(Hoja).Cells(Fila, Columna))
  37.         Fila = Fila + 1
  38.     Wend
  39.     Calcular_UF = Fila - 1
  40. End Function
  41.  
  42. Public Sub Cargar_Lista(Libro As String, Hoja As String, Ran As String, list As Variant, Optional uf As Long)
  43.     'Copia la tabla de excel a un array en memoria
  44.    Dim Rango As Range
  45.     Ran = Ran & Calcular_UF(Libro, Hoja, 1, 2)
  46.     Set Rango = Application.Workbooks(Libro).Sheets(Hoja).Range(Ran)
  47.     list = Application.Transpose(Rango)
  48.     uf = UBound(list, 2)
  49. End Sub
  50.  
  51. Private Sub Volcar_Tabla(Libro As String, Hoja As String, Tabla() As Variant)
  52.     'Vuelca la tabla en memoria a el documento Excel
  53.    Dim m As Long
  54.     Dim n As Long
  55.     Dim Rango As Range
  56.     m = UBound(Tabla, 1)
  57.     n = UBound(Tabla, 2)
  58.     Set Rango = Range(Application.Workbooks(Libro).Sheets(Hoja).Cells(1, 1), Application.Workbooks(Libro).Sheets(Hoja).Cells(n, m))
  59.     Rango = Application.Transpose(Tabla)
  60. 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