Macro para diferencia entre tablas

Necesito una Macro que evalúe líneas modificadas, nuevas y eliminadas en comparación con una tabla igual pero de un "mes anterior".

Es algo como lo siguiente. Tengo dos tablas. Tabla A y Tabla B. En estas hay datos que pueden coincidir o no, y que pueden coincidir con un ID pero con cambios (Igual ID en ambas tablas pero en alguna columna diferente).

Necesitaría que, en una hoja de resultado (dentro del mismo archivo) muestre muestre cuadros de resultado como:

1. Los ID que están en tabla A, que no están en tabla B

2. Los ID que estan en tabla B, que no estan en Tabla A

3. Los ID que estan en ambas tablas, pero que uno de sus campos es distinto.

1 respuesta

Respuesta
1

Supongo que te refieres a Tablas que contienen un rango de celdas, si es así, entonces debes tener algo como esto:


El resultado quedará en otra hoja, de la siguiente manera:


Cambia en la macro "Hoja3" por el nombre de tu hoja que va a tener el resultado.

También cambia "TABLA_A" y "TABLA_B" por los nombres de tus tablas.

Pon todo el siguiente código en un módulo. La macro que debes ejecutar es la que se llama: Comparar_Tablas


Sub Comparar_Tablas()
'Por Dante Amor
    Set h3 = Sheets("Hoja3")
    Set ta = Range("TABLA_A")
    Set tb = Range("TABLA_B")
    '
    h3.Rows("2:" & Rows.Count).ClearContents
    For Each dato In ta.Cells(1, 1).Resize(ta.Rows.Count)
        Set b = tb.Find(dato.Value, lookat:=xlWhole)
        If Not b Is Nothing Then
            Call Poner_Registro(h3, dato, 1, "")
            'Buscar diferencias
            If dato.Offset(0, 1).Value <> b.Offset(0, 1).Value Or _
               dato.Offset(0, 2).Value <> b.Offset(0, 2).Value Then
                Call Poner_Registro(h3, dato, 17, ta.ListObject.Name)
                Call Poner_Registro(h3, b, 17, tb.ListObject.Name)
            End If
        Else
            Call Poner_Registro(h3, dato, 5, "")
        End If
    Next
    '
    For Each dato In tb.Cells(1, 1).Resize(tb.Rows.Count)
        Set b = ta.Find(dato.Value, lookat:=xlWhole)
        If Not b Is Nothing Then
            Call Poner_Registro(h3, dato, 9, "")
        Else
            Call Poner_Registro(h3, dato, 13, "")
        End If
    Next
    '
    MsgBox "Fin"
End Sub
'
Sub Poner_Registro(h3, dato, col, tabla)
'Por Dante Amor
    fila = h3.Cells(Rows.Count, col).End(xlUp).Row + 1
    h3.Cells(fila, col).Value = dato.Value
    h3.Cells(fila, col + 1).Value = dato.Offset(0, 1)
    h3.Cells(fila, col + 2).Value = dato.Offset(0, 2)
    h3.Cells(fila, col + 3).Value = tabla
End Sub

Nota: El resultado quedará en celdas, no quedará en Tablas.


'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 
'.[Avísame cualquier duda

No me funciona con los cambios (nombre de tablas y hojas). Te la puedo hacer llegar por correo para que la veas?

Slds.

Puedes poner imágenes donde se vean los nombres de tus hojas, los nombres de tus tablas.

¿Seguro tienes Tablas?

Pon las imágenes procurando que se vean también las filas y las columnas de excel

Gracias... No son tablas, son rangos de celdas (le puse tabla pero no lo son, sorry). Seria como lo siguiente:

La base del mes anterior:

La base del mes actual

La hoja de resultados:

El ideal es que los cuadros en resultado partan según el de arriba, es decir, que no sean estáticos ya que, por ejemplo, en un caso puedo tener solo un NUEVO pero al mes siguiente puedo tener 20, por lo que, si el cuadro ELIMINADOS parte siempre donde mismo, borrara los datos de arriba (mismo caso para los MODIFICADOS).

Muchas gracias!!

Por eso no funciona, debes tener tablas!

Esto es lo que pusiste:

Tengo dos tablas. Tabla A y Tabla B. 

Y luego yo te puse esto:

Supongo que te refieres a Tablas que contienen un rango de celdas

Si, efectivamente es un tema de concepto... sorry

En base a ello, ¿se puede hacer que funcione como en la explicación de la pregunta? Creo que ahí esta más claro...

Gracias!

Pues no es solamente de concepto, tus ejemplos iniciales son totalmente diferentes a tus siguientes ejemplos.

En tus primeros ejemplos hablabas de 2 tablas, ahora tienes 2 hojas, luego el tema de las columnas, tenías 3, ahora tienes más columnas. Y por último el resultado, querías 5 resultados y ahora quieres 3.

Prácticamente es una nueva macro.


Con gusto te ayudo, valora esta respuesta y crea una nueva explicando con detalle y ejemplos reales lo que tienes y lo que esperas de resultado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas