Saltar al contenido

Ampliación sobre macro para comparar dos archivos excel y generar otro con las diferencias


Alfdorf

Recommended Posts

publicado

Estimados

Buscando encontré una macro para comparar dos Hojas de un archivo excel y generar otra hoja con las diferencias, la cual me ayuda en algo para lo que necesito.

Sin embargo quisiera ver la posibilidad de que me puedan ayudar ampliando un poco más la misma.

Las hojas de trabajo siempre tendrán las mismas columnas.

Mi parametro de comparación serán los datos de la primera columna, pero entre hojas de trabajo no necesariamente estarán en la misma fila.

Una vez que se encuentra la información de una celda de la primera columna de una hoja en cualquier fila de la primera columna de la otra, inicie una comparación columna a columna de la fila de esa hoja, con la fila de la otra hoja en la que se encontó la coincidencia y resalte la coincidencia (puede ser en el mismo rojo) en una hoja de resultados.

Si una fila no existe en una de ellas, lo deberá tomar como una diferencia entre hojas y pasarlo a la tercera hoja.

En la Hoja de resultados, la idea es que no solo muestre la diferencia entre hojas, sino de forma adicional muestre de forma intercalada la información de la una hoja y la otra. Así luego se podría hacer cualquier procesamiento adicional, si en la Hoja de resultados visualmente se verifica la diferencia.

Es decir:

Hoja 1

Fila 1: Columna A - Columna B - Columna C

Fila 2: Columna A - Columna B - Columna C

Fila 3: Columna A - Columna B - Columna C

Hoja 2

Fila 1: Columna A - Columna B - Columna C

Fila 2: Columna A - Columna B - Columna C

Fila 3: Columna A - Columna B - Columna C

Fila 4: Columna A - Columna B - Columna C

Hoja 3 (Resultados)

Fila 1: Hoja 1 Columna A - Hoja 2 Columna A - Hoja 1 Columna B - Hoja 2 Columna B - Hoja 1 Columna C - Hoja 2 Columna C

Fila 2: Hoja 1 Columna A- Hoja 2 Columna A - Hoja 1 Columna B - Hoja 2 Columna B - Hoja 1 Columna C - Hoja 2 Columna C

Fila 4: Hoja 1 Columna A - Hoja 2 Columna A - Hoja 1 Columna B - Hoja 2 Columna B - Hoja 1 Columna C - Hoja 2 Columna C

Lo correspondiente a la Fila 4 de la Hoja 2, al no existir en la Hoja 3, Se lo toma como una diferencia.

Las hojas de trabajo tienen la misma cantidad de columnas, pero no la misma cantidad de filas.

Desde ya un agradecimiento

Slds

Alfdorf

publicado

De ser posible el campo diferente debería estar en negritas y rojo.

En la comparación, primero se ubica la celda de la primera columna de la primera hoja, con la primera columna de la segunda hoja. Cuando se tenga ubicada la fila, la comparación será de columna a columna.

Es necesario que la comparación sea en ambos sentidos y el resultado de la diferencia de ambos archivo se presente en una tercera hoja con el mismo orden de columnas que las otras 2.

Gracias,

Slds,

Alfdorf

Prueba comparar bases.xls

publicado

' === en un modulo de codigo normal ==

Const Primera As String = "hoja1", Segunda As String = "hoja2", _

Iguales As String = "iguales", Diferentes As String = "diferentes"

Sub Filtra_Des_Iguales()

Dim Formula1 As String, Formula2 As String, Ultima As Integer

Formula1 = _

"and(countif(" & Segunda & "!a:a,a2),countif(" & Segunda & "!b:b,b2)," & _

"countif(" & Segunda & "!c:c,c2),countif(" & Segunda & "!d:d,d2))"

Formula2 = Application.Substitute(Formula1, Segunda, Primera)

With Worksheets(Primera)

.Range("g2").Formula = "=" & Formula1

.Range("a1").CurrentRegion.AdvancedFilter _

Action:=xlFilterCopy, CriteriaRange:=.Range("g1:g2"), _

CopyToRange:=Worksheets(Iguales).Range("a1:d1")

With .Range("g2"): .Formula = "=not(" & Formula1 & ")": End With

.Range("a1").CurrentRegion.AdvancedFilter _

Action:=xlFilterCopy, CriteriaRange:=.Range("g1:g2"), _

CopyToRange:=Worksheets(Diferentes).Range("a1:d1")

.Range("g2").ClearContents

With Worksheets(Diferentes).Range("a2")

.EntireRow.Insert

.Offset(-1) = "De la " & Primera & " que NO estan en la " & Segunda

.Offset(-1).HorizontalAlignment = xlHAlignGeneral

End With

End With

Worksheets(Iguales).UsedRange.Columns.AutoFit

With Worksheets(Diferentes)

.UsedRange.Columns.AutoFit

Ultima = .Cells.Find("*", .Cells(1), xlValues, xlWhole, xlByRows, xlPrevious).Row

End With

With Worksheets(Segunda)

.Range("g2").Formula = "=not(" & Formula2 & ")"

.Range("a1").CurrentRegion.AdvancedFilter _

Action:=xlFilterCopy, CriteriaRange:=.Range("g1:g2"), _

CopyToRange:=Worksheets(Diferentes).Range("a1:d1").Offset(Ultima)

.Range("g2").ClearContents

End With

With Worksheets(Diferentes).Range("a" & Ultima + 1)

.EntireRow.ClearContents

.Value = "De la " & Segunda & " que NO estan en la " & Primera

.HorizontalAlignment = xlHAlignGeneral

End With

End Sub

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.