Está en la página 1de 5

1Macro de Excel para eliminar duplicados y

resumir detalle
Francisco 08-05-07
Programacin : Ofimtica : Curso de macros de MS-Excel 2007

Hay que normalizar una tabla en Excel mediante


macros. La tarea a realizar se divide en los siguientes
pasos:
1. Ordenar las filas
2. Eliminar las filas consecutivas que estn duplicadas
3. Resumir las filas agrupando el detalle

Ejemplo
Tabla ordenada
Seccin
Primera
Primera
Primera
Primera
Primera
Primera
Segunda
Segunda
Segunda
Segunda
Tercera
Tercera
Tercera
Tercera
Cuarta
Quinta
Quinta

Categora
Alfa
Alfa
Alfa
Alfa
Alfa
Alfa
Beta
Beta
Beta
Beta
Gamma
Gamma
Gamma
Gamma
Delta
Epsilon
Epsilon

Cdigo
A
A
A
B
B
C
A
B
B
B
A
B
C
C
A
A
B

Sin duplicados
Seccin
Primera
Primera

Categora
Alfa
Alfa

Cdigo
A
B

Primera
Segunda
Segunda
Tercera
Tercera
Tercera
Cuarta
Quinta
Quinta

Alfa
Beta
Beta
Gamma
Gamma
Gamma
Delta
Epsilon
Epsilon

C
A
B
A
B
C
A
A
B

Detalle resumido
Seccin
Primera
Segunda
Tercera
Cuarta
Quinta

Categora
Alfa
Beta
Gamma
Delta
Epsilon

Cdigo
A, B, C
A, B
A, B, C
A
A, B

Cdigo fuente de las macros Visual Basic


Sub ResumirDetalle()
'Agrupa filas iguales y resume el detalle
Dim
Dim
Dim
Dim
Dim

rango As Range
filaAnterior As Range, fila As Range
compararAnterior As Range, comparar As Range
detalleAnterior As Range, detalle As Range
indice As Integer, numColumnas As Integer

Set rango = ActiveCell.CurrentRegion


numColumnas = rango.Columns.Count
Set filaAnterior = rango.Rows(1)
indice = 2
Do While indice <= rango.Rows.Count
Set fila = rango.Rows(indice)
'Obtener todas las celdas de la fila menos la ltima
Set comparar = fila.Resize(1, numColumnas - 1)
Set compararAnterior = filaAnterior.Resize(1, numColumnas - 1)
If RangosIguales(comparar, compararAnterior) Then
'Consideramos que el detalle es la ltima celda de la fila
Set detalle = fila.Cells(numColumnas) 'Set detalle =
fila.Offset(0, numColumnas - 1).Resize(1, 1)
Set detalleAnterior = filaAnterior.Cells(numColumnas) 'Set
detalleAnterior = filaAnterior.Offset(0, numColumnas - 1).Resize(1, 1)

'Agrupar el detalle y borrar la fila


detalleAnterior.Value = detalleAnterior.Value & ", " &
detalle.Value
fila.Delete
Else
Set filaAnterior = fila
indice = indice + 1
End If
Loop
End Sub

Sub EliminarDuplicados()
'Elimina filas duplicadas slo si son consecutivas,
Dim rango As Range
Dim filaAnterior As Range, fila As Range
Dim indice As Integer
Set rango = ActiveCell.CurrentRegion
Set filaAnterior = rango.Rows(1)
indice = 2
Do While indice <= rango.Rows.Count
Set fila = rango.Rows(indice)
If RangosIguales(fila, filaAnterior) Then
fila.Delete
Else
Set filaAnterior = fila
indice = indice + 1
End If
Loop
End Sub
Function RangosIguales(rango1 As Range, rango2 As Range) As Boolean
'Retorna "true" si los valores de ambos rangos son iguales
Dim indice As Integer
Dim celda1 As Range
Dim celda2 As Range
If rango1.Cells.Count <> rango2.Cells.Count Then
RangosIguales = False
Exit Function
End If
For indice = 1 To rango1.Cells.Count
Set celda1 = rango1.Cells(indice)
Set celda2 = rango2.Cells(indice)
If celda1.Value <> celda2.Value Then
RangosIguales = False
Exit Function
End If

Next
RangosIguales = True
End Function

Descargar la hoja de clculo agrupar_detalle.xls

2 comentarios:
1 Brenda (no registrado) dice hace 7 aos:

Hola ! Estoy tratando de usar esta macro para otro archivo pero estoy teniendo
complicaciones.
Mi archivo original tiene en vez de dos campos iguales, tres campos iguales y
necesito agruparlos. En que parte de la secuencia hay que modificar dicho dato.
Mucahs Gracias,
Brenda
2 Eduardo (no registrado) dice hace 4 aos:

Buenas noches Yo tengo esta macro para introducir faltantes en una columna
Sub Macro_Consecutivo()
Dim Nro_Fila As Double
Dim Valor_Celda As Double
Dim Comienzo_Fila As Double
Nro_Fila = InputBox("Ingrese el Nro de Fila desde donde se Comenzar a
Chequear el Consecutivo", "No de Fila Inicial")
Comienzo_Fila = Nro_Fila
Valor_Celda = Range("F" & Nro_Fila).Value 'si no es la columna A cambiar letra
Do While Val(Range("F" & Nro_Fila).Value) > 0 'si no es la columna A cambiar
letra
If Nro_Fila > Comienzo_Fila Then
If Val(Range("F" & Nro_Fila).Value) > Valor_Celda Then 'si no es la columna A
cambiar letra
Rows(Nro_Fila & ":" & Nro_Fila).Select
Selection.Insert shift:=xlDown

Range("F" & Nro_Fila).Value = Valor_Celda 'si no es la columna A cambiar letra


End If
End If
Nro_Fila = Nro_Fila + 1
Valor_Celda = Valor_Celda + 1
Loop
End Sub
pero cuando encuentra valores duplicados NO PONE LOS FALTANTES
me pueden apoyar para que SI lo haga?

También podría gustarte