Hoy aprenderemos a cruzar datos de dos tablas relacionadas entre sí mediante un campo en Excel, pero al más puro estilo Access.
He usado como ejemplo dos tablas, una de Clientes y otra de Transacciones. En la primera, se encuentran registrados los datos de cada uno de nuestros clientes, mientras que en la segunda, aparecen cada una de las compras que han hecho dichos clientes en nuestro comercio.
En este caso, el campo clave (campo que une la información de ambas tablas) es el nombre del cliente.
Imagina que, en un momento determinado, quisiésemos hacer balance y analizar dichas transacciones para realizar una campaña publicitaria. Seguramente, sería muy interesante saber en qué provincias estamos realizando un mayor número de ventas para focalizar allí nuestros esfuerzos.
Para ello, nos haría falta rellenar el campo “Provincias” de la tabla “Transacciones”. Pero, si tuviésemos del orden de miles de transacciones registradas la cosa se complicaría. Sin embargo, por suerte, tenemos VBA.
De esta forma, vamos a crear un botón que, al pulsarlo, rescate esta información de la tabla “Clientes” y la deposite en cada uno de los registros de la tabla “Transacciones”.
Así mismo, crearemos un botón para limpiar el campo “Provincias” de la tabla “Transacciones” y poder repetir el ejercicio cuantas veces queramos a la vez que modificamos o añadimos registros a las tablas a nuestro antojo.
A continuación, te dejo un enlace donde explico cómo asignar una macro a un botón.
Espero que al final de este ejemplo, te quede claro cómo cruzar datos de distintas tablas en Microsoft Excel.
Macro 1. Limpiar datos de la columna “Provincias” de la tabla “Transacciones”.
'Macro que recupera la provincia del cliente de la tabla Clientes para cada registro de la tabla 'Transacciones
'Buscamos el último registro en la tabla Transacciones
h = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
'Borramos los datos de la columna Provincias en la tabla Transacciones
Range(Cells(5, "F"), Cells(h, "F")).ClearContents
End Sub
'Borramos los valores de la tabla de gastos
Range("K9:K18").ClearContents
final:
Application.ScreenUpdating = True
End Sub
Macro 2. Recuperar información “Provincias” de la tabla “Clientes” y copiar en “Transacciones”.
'Macro que recupera la provincia del cliente de la tabla Clientes para cada registro de la tabla 'Transacciones
'Desactivamos el refresco de pantalla
Application.ScreenUpdating = False
'Buscamos el último registro en la tabla Clientes
g = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
'Buscamos el último registro en la tabla Transacciones
Sheets("Transacciones").Activate
h = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
'Borramos los datos de la columna Provincias en la tabla Transacciones
Range(Cells(5, "F"), Cells(h, "F")).ClearContents
'Comenzamos la iteracion para buscar la provincia de cada cliente de la tabla Transacciones
For i = 5 To h
Sheets("Transacciones").Activate
nombre = Cells(i, "C")
Sheets("Clientes").Activate
For k = 5 To g
'Si encontramos una coincidencia, copiamos la provincia y pasamos a otra transaccion
If Cells(k, "B") = nombre Then
provincia = Cells(k, "E")
Sheets("Transacciones").Activate
Cells(i, "F") = provincia
GoTo otratransaccion
End If
Next
otratransaccion:
Next
Application.ScreenUpdating = True
End Sub
En primer lugar, vamos a analizar la segunda de las macros paso a paso. (La primera es muy sencilla, pero si tuvieras cualquier pregunta, no dudes en consultármela).
El primer paso, es desactivar el refresco de pantalla. En este caso es algo obligado, ya que el programa va a estar consultando dos tablas, en hojas distintas, y va a estar yendo de una a otra. En caso contrario, además de estar viendo pestañeos, puede ralentizarse la ejecución del programa.
'Macro que recupera la provincia del cliente de la tabla Clientes para cada registro de la tabla 'Transacciones
'Desactivamos el refresco de pantalla
Application.ScreenUpdating = False
Para optimizar el número de iteraciones, buscamos la última fila con registros en ambas tablas y borramos los datos del campo “Provincias” de la tabla “Transacciones” por si no hemos pulsado antes el botón “1. Borrar Provincias”.
g = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
'Buscamos el último registro en la tabla Transacciones
Sheets("Transacciones").Activate
h = Cells(Rows.Count, 2).End(xlUp).Offset(0, 0).Row
'Borramos los datos de la columna Provincias en la tabla Transacciones
Range(Cells(5, "F"), Cells(h, "F")).ClearContents
Vamos a usar dos iteraciones, una anidada dentro de otra.
En primer lugar, barremos las transacciones de la tabla “Transacciones” (iteración i), y en cada uno de los registros, nos iremos a la tabla “Clientes” a buscar la provincia que le corresponde al cliente de la transacción (iteración k).
Primera iteración (i=5).
Así que, comenzamos en la fila i=5 que es la que contiene la primera iteración.
For i = 5 To h
A continuación, en la hoja “Transacciones”, guardamos el nombre del cliente (celda C5) en la variable “nombre”, que en este caso es “Joaquin Fernandez”.
nombre = Cells(i, "C")
Seguidamente, nos vamos a la hoja “Clientes” y buscamos este nombre desde la fila k=5 hasta la última fila que contiene datos (k=g).
For k = 5 To g
Si encontramos alguna coincidencia durante la búsqueda, guardamos el valor de la celda del campo provincia en la variable “provincia”.
En este caso, el cliente se encuentra en k=5, y guardamos el valor de la celda E5 (Alicante) en la variable “provincia”.
If Cells(k, "B") = nombre Then
provincia = Cells(k, "E")
Por último, volvemos a la hoja “Transacciones”, pegamos el valor de la variable “provincia” en el registro correspondiente. A continuación, salimos de la iteración secundaria (k), volviendo a la principal (i) donde pasaríamos a la siguiente transacción i=6.
Segunda iteración (i=6).
En este caso, pegamos el valor de la variable “provincia” (Alicante) en la celda F5 de la tabla “Transacciones”, volveríamos a la iteración principal con i=6.
Cells(i, "F") = provincia
GoTo otratransaccion
End If
Next
otratransaccion:
Next
Application.ScreenUpdating = True
End Sub
Finalmente, este sería el resultado.
Además, como complemento al ejemplo, he programado un código para que cuando rellenemos el campo “Artículo”, automáticamente se complete el importe. Éste se aloja directamente en la hoja “Transacciones” y vigila cualquier cambio que haya en la misma.
Aunque no tenga nada que ver con cómo cruzar tablas en Excel, no está de más.
'Macro que al rellenar el campo Articulo, rellena automaticamente el importe
Si este cambio sucede en la columna D, guardamos el valor de la fila donde se ha producido el cambio en la variable “ThisRow”.
If Target.Column = 4 Then
'Guarda en la variable ThisRow el valor de la fila
ThisRow = Target.Row
Si el cliente compra el artículo A, cargaremos un importe de 80€, si es B de 100€ y si es C de 120€. Así, dejamos abierta la posibilidad de que posteriormente podamos modificar dicha cantidad.
'La tabla de precios es la siguiente:
'A = 80€
'B = 100€
'C = 120€
On Error GoTo final
If Target.Value = "A" Or Target.Value = "a" Then
Range("E" & ThisRow) = 80
ElseIf Target.Value = "B" Or Target.Value = "B" Then
Range("E" & ThisRow) = 100
ElseIf Target.Value = "C" Or Target.Value = "c" Then
Range("E" & ThisRow) = 120
Else
En caso de introducir algo distinto a A, B o C, nos aparece un mensaje de advertencia y se borrarán los datos introducidos de artículo e importe.
MsgBox "Artículo no válido"
Range(Cells(ThisRow, "D"), Cells(ThisRow, "E")).ClearContents
Exit Sub
End If
End If
final:
End Sub
Prueba a añadir registros a la tabla de “Transacciones” y verás cómo al rellenar el campo “Artículo”, se autocompleta el campo “Importe” según hemos programado.
Con esto llegamos al final de la vigesimoséptima lección, en la que has aprendido a cruzar datos de tablas relacionales en Microsoft Excel.
Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.
Nos vemos en el próximo capítulo.
Si te ha servido y quieres donar
Descarga el archivo del ejemplo
« EP3. Cómo clasificar automáticamente con macros.
EP5. Cómo filtrar registros de una tabla con macros. »
0 comentarios