Problema con código vba: eliminar fila si los datos en una columna está repetido

Necesito crear un código para que, al introducir datos en un formulario (Excel), si el dato en la columna A está repetido con alguno de la misma columna, salga un aviso e inmediatamente elimine la fila entera.

He intentado el siguiente código pero me da error en la parte resaltada en negrita.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
dato = Target.Value
contarsi = Application.WorksheetFunction.CountIf(Columns(1), dato)
If contarsi > 1 Then
MsgBox "El grupo ya existe."
Target.Select
Target.EntireRow.Delete
Exit Sub
End If
End If
End Sub

2 respuestas

Respuesta
2

Te anexo la macro actualizada

Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante Amor
    If Target.Column <> 1 Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    '
    If WorksheetFunction.CountIf(Columns(1), Target.Value) > 1 Then
        MsgBox "El grupo ya existe."
        Application.EnableEvents = False
        Target.Select
        Target.EntireRow.Delete
        Application.EnableEvents = True
    End If
End Sub
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

Hola Dante,

acabo de probar también tu macro ytampoco me funciona, me sale lo mismo que respondí a Fejoal...

Un saludo y gracias por vuestra ayuda y paciencia

Nueva cuestión, el código se tiene que poner en las Worksheet ¿no?

¿En las Userform no se coloca nada de eso?

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. En el panel del lado derecho copia la macro
Respuesta
1

.30.11.16

Buenas, Leo

En realidad te da error en la segunda pasada, porque al eliminar una línea estás cambiando la columna 1.

Eso se resuelve con la siguiente modificación a tu rutina:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
    dato = Target.Value
    contarsi = Application.WorksheetFunction.CountIf(Columns(1), dato)
    If contarsi > 1 Then
        MsgBox "El grupo ya existe."
        ' 
        Application.EnableEvents = False
        ' 
        Target.EntireRow.Delete
        '
        Application.EnableEvents = True
    End If
End If
End Sub

(bueno, también le saqué un par de líneas redundantes)

Pruebalo y dime si te anduvo correctamente.

Saludos

Fernando

(Buenos Aires, Argentina)

.

Hola buenos días,

Fejoal, acabo de probar tu código y aun así no me borra la línea repetida... adjunto recorte del resultado final (es el mismo que me daba a mi con mi código.)

Probare ahora la de Dante a ver si funciona y escribo de nuevo.

Muchas gracias a los dos!!

Ups, no puedo adjuntar pantallazo,

paso las lineas de la base de datos.

Otra pregunta. Tengo 2 Worksheets (una en español y otra en Inglés). Funcionaría para ambas? 

Un saludo

grupo remedy                        nombre grupo           departamento           etcetc....

TI-SERVICIO-HSE                                                                                          RUT RODRIGUEZ REY          

 TS-ALMACENAMIENTO                                                                          ANTONIO GALAN CALETEGUI                                                         HJHKJHJH             JKHJKHKH              KJHJKH

(Para hacer las pruebas pongo letras al azar para probar si funciona.)

En el resultado, pongo TI-SERVICIO-HSE, detecta que está repetido y borra la CELDA en vez de la FILA...

Un saludo y gracias!

(Me pongo a probar la de Dante)

Saludos!

.

Hola, Leo

Recuerda que la rutina cuenta sobre la primera columna. Pero no se ve bien en lo que mandaste. Para poner una imagen aqui, hay que grabarla en el disco y luego subirla con el primer botón de la barrita auxiliar.

Ayudaría que la subas.

Abrazo!

Fer

Pd: La otra solución no es distinta a la que te di antes. Solo reemplazó la variable que habías usado en tu primera macro por la instrucción que le ponía un valor . En fin...

.

Hola de nuevo,

antes de continuar, quería saber dónde colocar este código...

¿Se coloca en la Worksheet donde se encuentran los datos?

¿O se coloca en el Userform?

El problema añadido es el siguiente.

En mi proyecto, tengo una userform donde se guardarán los cambios que se realicen ( es decir, modificar datos de "x" grupo desde la "aplicacion") y por otro lado, si se necesita agregar un nuevo departamento pues que me lo permita.

Con el código actual, no me deja sobreescribir la actualización de datos (de los grupos ya existentes) y tampoco me borra la fila (lo que ya te comente antes).

No se si comprendes lo que quiero decir...

.

Que tal, Leo

Al ser una rutina basada en evento (Change), como lo planteaste en tu pregunta original, debe estar en la hoja u hojas donde quieres que se ejecute sin importar el idioma.

Es decir que para que funcione, debes activar el editor de Visual Basic (presiona Alt+F11) y en el panel de la izquierda busca la hoja donde quieres que esto ocurra. Da doble click sobre ella. (Otra forma de llegar a este punto es hacer click derecho sobre la solapa de esta hoja y elegir la opción "Ver Código). Como dije, esto es para cada hoja donde quieres que opere

Por otra parte, al haber usado la instrucción

Target.EntireRow.Delete

No hay forma de que sólo se borre la celda repetida, pues esta mata toda la linea de la celda que cambió. Claro que si esa celda fuese el único dato de la fila parecerá que sólo borró la celda.

Eventualmente, podrías evaluar algún modo de integrar esta rutina a los códigos que tiene tu formulario.

Veamos por ejemplo este código:

Sub deledupl()
'---- Variables modificables ----
'=== LEO, modifica estos datos de acuerdo a tu proyecto:
    CeliniCtrl = "A2" 'celda donde comienza el control de duplicados
'---- fin Variables
'
'---- inicio de rutina:
'
DatoNue = TextBox1.Value
    If Application.WorksheetFunction.CountIf(Columns(Range(CeliniCtrl).Column), DatoNue) > 0 Then
        MsgBox "El grupo " & DatoNue & " ya existe."
    Else
        Range(CeliniCtrl).Offset(11).Value = DatoNue
    End If
End Sub

Este evalúa el contenido que obtengas de un textbox de tu formulario antes de ingresarlo.

Si el recuento es mayor que cero -es decir que ya existe el dato- te avisa de tal situación y, si no lo agrega en la celda que le digas.

Es sólo un ejemplo que deberás adaptar al funcionamiento de tu formulario pero creo que captarás la idea.

Por supuesto, si te vuelcas por esta solución, quita la macro anterior para que no genere conflicto.

Bien, Leo, espero que puedas resolverlo con cualquiera de las dos soluciones que te dí.

Un abrazo

Fer

.

De acuerdo,

Estoy mirando otras formas de simplificarlo todo porque llevo 3 días contados trabajando con VBA y es todo muy complejo para mi.

Muchísimas gracias por tu ayuda, para siguientes problemas que pudiesen surgir te preguntaré de nuevo

Gracias!

.

Ok, Leo.

Cuenta conmigo.

Saludos

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas