Sei sulla pagina 1di 3

Macro 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 Cdigo Alfa A Alfa A Alfa A Alfa B Alfa B Alfa C Beta A Beta B Beta B Beta B Gamma A Gamma B Gamma C Gamma C Delta A Epsilon A Epsilon B

Sin duplicados
Seccin Primera Primera Primera Segunda Segunda Tercera Tercera Tercera Cuarta Quinta Quinta Categora Cdigo Alfa A Alfa B Alfa C Beta A Beta B Gamma A Gamma B Gamma C Delta A Epsilon A Epsilon B

Detalle resumido
Seccin Primera Segunda Tercera Cuarta Quinta Categora Cdigo Alfa A, B, C Beta A, B Gamma A, B, C Delta A Epsilon 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