Eliminar repetidos

26/01/2005 - 20:21 por jose | Informe spam
Hola a todos.
Me han pasado una hoja con 2000 y pico registros (=filas) que tiene un
montón de ellos repetidos que he de eliminar. Acabo de empezar con VB y he
hecho un modesto procedimiento con lo que sé (o sea nada).

La tabla es así:
Id | Nombre |
34 | JUAN
35 | PEDRO
35 | PEDRO
35 | PEDRO
36 | JOSE
36 | JOSE

Pretendo que me busque por NOMBRE (no por Id) desde el principio de la
columna B hasta el final y me elimine los coincidentes por filas. Es decir,
si JUAN (B1) es igual que B2, que elimine la fila 2, y si es diferente que
pase a la siguiente, y así sucesivamente hasta que no encuentre nada en la
última celda de la columna B.

Ya digo que soy novatísimo, pero con muchas ganas por aprender, y he
intentado hacer esto (no os riaís, plis):
Sub Eliminar_repetidos ()
Range("B2").Select
If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
ActiveCell.Offset(1, 0).EntireRow.Select
Selection.Delete
Else ActiveCell.Offset(1, 0).Select
End If
End Sub

Claro, de la segunda fila no pasa. Sé que hay algo de LOOP o de DO WHILE...
para hacer bucles o algo parecido. He leído cosas pero no me aclaro mucho.
Quizás tampoco esa sea la solución que busco.
¿Alguien sería tan amable de echarme una manita? Gracias por vuestro tiempo

Preguntas similare

Leer las respuestas

#1 Alfredo Espinosa
26/01/2005 - 23:47 | Informe spam
Trate de no modificar mucho tu codigo, para mi gusto no
es la mejor manera, pero creo que asi lo entenderas
mejor. Saludos

Alfredo Espinosa


Sub Eliminar_repetidos()
Range("B2").Select
For k = 1 To Application.CountA(Range("B:B"))
If ActiveCell.Value = ActiveCell.Offset(1, 0).Value
Then
ActiveCell.Offset(1, 0).EntireRow.Select
Selection.Delete
ActiveCell.Offset(-1, 1).Select
Else: ActiveCell.Offset(1, 0).Select
End If
Next k
End Sub



Hola a todos.
Me han pasado una hoja con 2000 y pico registros


(=filas) que tiene un
montón de ellos repetidos que he de eliminar. Acabo de


empezar con VB y he
hecho un modesto procedimiento con lo que sé (o sea


nada).

La tabla es así:
Id | Nombre |
34 | JUAN
35 | PEDRO
35 | PEDRO
35 | PEDRO
36 | JOSE
36 | JOSE

Pretendo que me busque por NOMBRE (no por Id) desde el


principio de la
columna B hasta el final y me elimine los coincidentes


por filas. Es decir,
si JUAN (B1) es igual que B2, que elimine la fila 2, y


si es diferente que
pase a la siguiente, y así sucesivamente hasta que no


encuentre nada en la
última celda de la columna B.

Ya digo que soy novatísimo, pero con muchas ganas por


aprender, y he
intentado hacer esto (no os riaís, plis):
Sub Eliminar_repetidos ()
Range("B2").Select
If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
ActiveCell.Offset(1, 0).EntireRow.Select
Selection.Delete
Else ActiveCell.Offset(1, 0).Select
End If
End Sub

Claro, de la segunda fila no pasa. Sé que hay algo de


LOOP o de DO WHILE...
para hacer bucles o algo parecido. He leído cosas pero


no me aclaro mucho.
Quizás tampoco esa sea la solución que busco.
¿Alguien sería tan amable de echarme una manita? Gracias


por vuestro tiempo



.

Respuesta Responder a este mensaje
#2 Alfredo Espinosa
26/01/2005 - 23:53 | Informe spam
P.D.
Te recomiendo que primero ordenes la tabla por la columna
B para funcione mejor.



Hola a todos.
Me han pasado una hoja con 2000 y pico registros


(=filas) que tiene un
montón de ellos repetidos que he de eliminar. Acabo de


empezar con VB y he
hecho un modesto procedimiento con lo que sé (o sea


nada).

La tabla es así:
Id | Nombre |
34 | JUAN
35 | PEDRO
35 | PEDRO
35 | PEDRO
36 | JOSE
36 | JOSE

Pretendo que me busque por NOMBRE (no por Id) desde el


principio de la
columna B hasta el final y me elimine los coincidentes


por filas. Es decir,
si JUAN (B1) es igual que B2, que elimine la fila 2, y


si es diferente que
pase a la siguiente, y así sucesivamente hasta que no


encuentre nada en la
última celda de la columna B.

Ya digo que soy novatísimo, pero con muchas ganas por


aprender, y he
intentado hacer esto (no os riaís, plis):
Sub Eliminar_repetidos ()
Range("B2").Select
If ActiveCell.Value = ActiveCell.Offset(1, 0).Value Then
ActiveCell.Offset(1, 0).EntireRow.Select
Selection.Delete
Else ActiveCell.Offset(1, 0).Select
End If
End Sub

Claro, de la segunda fila no pasa. Sé que hay algo de


LOOP o de DO WHILE...
para hacer bucles o algo parecido. He leído cosas pero


no me aclaro mucho.
Quizás tampoco esa sea la solución que busco.
¿Alguien sería tan amable de echarme una manita? Gracias


por vuestro tiempo



.

Respuesta Responder a este mensaje
#3 Héctor Miguel
27/01/2005 - 00:33 | Informe spam
hola, chicos !

jose escribio en el mensaje ...
... una hoja con 2000 y pico registros ... repetidos que he de eliminar [...]

Alfredo Espinosa escribio en el mensaje ...
Trate de no modificar mucho tu codigo, para mi gusto no es la mejor manera, pero creo que asi lo entenderas mejor [...]





[solo pequeños comentarios] ;)
1.- en el codigo de Alfredo hay un 'salto de columna' [despues de 'eliminada' la fila] por la 'siguiente' instruccion...
Selection.Delete
ActiveCell.Offset(-1, 1).Select




2.- 'la estructura' [del bucle for...next] 'avanza' por el rango ['pero'...]
-> la celda que 'seguia' de la que se elimina... 'retrocede' [se convierte en 'chivo brincado']
3.- para eliminar filas [generalmente] es preferible utilizar bucles 'en reversa' [p.e. for fila = 50 to 1 step -1]
o... convertir a un rango no-contiguo las celdas ['eliminables'] y eliminar sus filas en un solo 'paso'
['de pasadita'... se ahorra tiempo al no 'tener que' ir eliminando fila por fila]

la macro que expongo en seguida es [o 'debiera ser'] +/- rapidita, con alguna que otra 'ventaja' como:
-> no es 'relevante' si los datos estan ordenados o no [como bien comenta Alfredo en su PD]
-> modificar un solo 'dato' para la columna o fila 'de partida'
-> usar la funcion de hoja de calculo contar.si [no toma en cuenta si son mayusculas/minusculas]
si cualquier duda... ¿comentarios?
saludos,
hector.
en un modulo de codigo 'normal' ==Sub Eliminar_Repetidos()
Dim Repetidos As Range, Col As String, F1 As Long, Fx As Long, Fila As Long
Col = "b"
F1 = 2
Fx = Range(Range(Col & F1), Range(Col & "65536").End(xlUp)).Rows.Count
For Fila = F1 To Fx + F1 - 1
If Application.CountIf(Range(Col & F1 & ":" & Col & Fila), Range(Col & Fila)) > 1 Then
If Repetidos Is Nothing Then Set Repetidos = Range(Col & Fila)
Set Repetidos = Union(Repetidos, Range(Col & Fila))
End If
Next
If Repetidos Is Nothing Then Exit Sub
Repetidos.EntireRow.Delete
Set Repetidos = Nothing
End Sub
Respuesta Responder a este mensaje
#4 jose
27/01/2005 - 09:49 | Informe spam
Gracias a Héctor y Alfredo. La cosa funciona ya perfectamente. Yo seguiré
estudiando VB, que ya veis que me queda todavía una eternidad. Gracias de
nuevo


"Héctor Miguel" escribió en el mensaje
news:OBRBj9$
hola, chicos !

> jose escribio en el mensaje ...
> ... una hoja con 2000 y pico registros ... repetidos que he de eliminar


[...]

>> Alfredo Espinosa escribio en el mensaje ...
>> Trate de no modificar mucho tu codigo, para mi gusto no es la mejor


manera, pero creo que asi lo entenderas mejor [...]

[solo pequeños comentarios] ;)
1.- en el codigo de Alfredo hay un 'salto de columna' [despues de


'eliminada' la fila] por la 'siguiente' instruccion...
>> Selection.Delete
>> ActiveCell.Offset(-1, 1).Select
2.- 'la estructura' [del bucle for...next] 'avanza' por el rango


['pero'...]
-> la celda que 'seguia' de la que se elimina... 'retrocede' [se


convierte en 'chivo brincado']
3.- para eliminar filas [generalmente] es preferible utilizar bucles 'en


reversa' [p.e. for fila = 50 to 1 step -1]
o... convertir a un rango no-contiguo las celdas ['eliminables'] y


eliminar sus filas en un solo 'paso'
['de pasadita'... se ahorra tiempo al no 'tener que' ir eliminando


fila por fila]

la macro que expongo en seguida es [o 'debiera ser'] +/- rapidita, con


alguna que otra 'ventaja' como:
-> no es 'relevante' si los datos estan ordenados o no [como bien comenta


Alfredo en su PD]
-> modificar un solo 'dato' para la columna o fila 'de partida'
-> usar la funcion de hoja de calculo contar.si [no toma en cuenta si son


mayusculas/minusculas]
si cualquier duda... ¿comentarios?
saludos,
hector.
en un modulo de codigo 'normal' ==> Sub Eliminar_Repetidos()
Dim Repetidos As Range, Col As String, F1 As Long, Fx As Long, Fila As


Long
Col = "b"
F1 = 2
Fx = Range(Range(Col & F1), Range(Col & "65536").End(xlUp)).Rows.Count
For Fila = F1 To Fx + F1 - 1
If Application.CountIf(Range(Col & F1 & ":" & Col & Fila), Range(Col &


Fila)) > 1 Then
If Repetidos Is Nothing Then Set Repetidos = Range(Col & Fila)
Set Repetidos = Union(Repetidos, Range(Col & Fila))
End If
Next
If Repetidos Is Nothing Then Exit Sub
Repetidos.EntireRow.Delete
Set Repetidos = Nothing
End Sub


Respuesta Responder a este mensaje
#5 KL
28/01/2005 - 01:04 | Informe spam
Jose,

Te pongo otra opcion mas abajo.

Saludos,
KL

'--Inicio Codigo--
Sub Eliminar_repetidos2()
Dim fila As Long
With Application
.ScreenUpdating = False
For fila = Cells(Rows.Count, 2).End(xlUp).Row To 1 Step -1
If .WorksheetFunction.CountIf(Range("B:B"), _
Cells(fila, 2)) > 1 Then Cells(fila, 2).EntireRow.Delete
Next fila
.ScreenUpdating = True
End With
End Sub
'--Fin Codigo--


"jose" wrote in message
news:OQO$
Gracias a Héctor y Alfredo. La cosa funciona ya perfectamente. Yo seguiré
estudiando VB, que ya veis que me queda todavía una eternidad. Gracias de
nuevo


"Héctor Miguel" escribió en el mensaje
news:OBRBj9$
hola, chicos !

> jose escribio en el mensaje ...
> ... una hoja con 2000 y pico registros ... repetidos que he de eliminar


[...]

>> Alfredo Espinosa escribio en el mensaje ...
>> Trate de no modificar mucho tu codigo, para mi gusto no es la mejor


manera, pero creo que asi lo entenderas mejor [...]

[solo pequeños comentarios] ;)
1.- en el codigo de Alfredo hay un 'salto de columna' [despues de


'eliminada' la fila] por la 'siguiente' instruccion...
>> Selection.Delete
>> ActiveCell.Offset(-1, 1).Select
2.- 'la estructura' [del bucle for...next] 'avanza' por el rango


['pero'...]
-> la celda que 'seguia' de la que se elimina... 'retrocede' [se


convierte en 'chivo brincado']
3.- para eliminar filas [generalmente] es preferible utilizar bucles 'en


reversa' [p.e. for fila = 50 to 1 step -1]
o... convertir a un rango no-contiguo las celdas ['eliminables'] y


eliminar sus filas en un solo 'paso'
['de pasadita'... se ahorra tiempo al no 'tener que' ir eliminando


fila por fila]

la macro que expongo en seguida es [o 'debiera ser'] +/- rapidita, con


alguna que otra 'ventaja' como:
-> no es 'relevante' si los datos estan ordenados o no [como bien comenta


Alfredo en su PD]
-> modificar un solo 'dato' para la columna o fila 'de partida'
-> usar la funcion de hoja de calculo contar.si [no toma en cuenta si son


mayusculas/minusculas]
si cualquier duda... ¿comentarios?
saludos,
hector.
en un modulo de codigo 'normal' ==>> Sub Eliminar_Repetidos()
Dim Repetidos As Range, Col As String, F1 As Long, Fx As Long, Fila As


Long
Col = "b"
F1 = 2
Fx = Range(Range(Col & F1), Range(Col & "65536").End(xlUp)).Rows.Count
For Fila = F1 To Fx + F1 - 1
If Application.CountIf(Range(Col & F1 & ":" & Col & Fila), Range(Col
&


Fila)) > 1 Then
If Repetidos Is Nothing Then Set Repetidos = Range(Col & Fila)
Set Repetidos = Union(Repetidos, Range(Col & Fila))
End If
Next
If Repetidos Is Nothing Then Exit Sub
Repetidos.EntireRow.Delete
Set Repetidos = Nothing
End Sub






Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida