Como evitar duplicados en excel macro

15/06/2007 - 23:08 por Mr Gonzalo | Informe spam
Hola amigos, buscando en la red, encontre este codigo pero no funciona del
todo bien, lo que quiero hacer es lo siguiente:

al estar introduciendo datos en excel que me notifique si el dato ya esta
capturado, el codigo es este:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Fila As Long
Dim F As Long
Dim NuevoDato
'si el rango cambiante está en la columna 3 (que es donde buscaré los datos
If Target.Column = 3 Then
'tomo la fila en la que se encuentra el nuevo dato ingresado
Fila = Target.Row
'y tomo el nuevo dato ingresado
NuevoDato = Target.Value
'ahora: yo sé que tu tabla comienza en la fila 3 y se extiende hasta un
lugar
'menos de donde ingresaste el nuevo valor, entonces el rango donde buscaré
'para evitar duplicados será desde C3 hasta una fila anterior a la celda en
donde
'ingresaste el nuevo dato.
Fila = Fila - 10 'resto uno para que busque hasta la celda anterior
'ahora busco el nuevo valor dentro del rango especificado, y pongo un
controlador
'de errores. si el valor existe, almaceno en F en que fila está, para
avisarle al usuario
'que duplicó datos:
On Error Resume Next
F = Range("C3:C25" & Fila).Find(what:=NevoDato, after:=ActiveCell,
LookIn:=xlValues, lookat:=xlWhole).Row
If Err.Number = 91 Then
Exit Sub
Else
MsgBox "El dato ingresado ya se encuentra en la fila " & F
End If
End If
End Sub


saludos.

gonzalo

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
16/06/2007 - 05:50 | Informe spam
hola, gonzalo !

... lo que quiero hacer es lo siguiente:
al estar introduciendo datos en excel que me notifique si el dato ya esta capturado, el codigo es este:



si no te resulta de *absoluta* necesidad conocer el lugar donde ya existe algun dato que se intente ingresar repetido -?-
prueba con algo +/- como lo siguiente:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([c:c], Target) Is Nothing Then ActiveCell.Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub
If Application.CountIf([c:c], Target) > 1 Then
MsgBox "El dato introducido en " & Target.Address & " ya existe !!!"
Application.Undo
End If
End Sub

[probablemente obtendrias igual resultado con una validacion de datos] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto __
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Fila As Long
Dim F As Long
Dim NuevoDato
'si el rango cambiante está en la columna 3 (que es donde buscaré los datos
If Target.Column = 3 Then
'tomo la fila en la que se encuentra el nuevo dato ingresado
Fila = Target.Row
'y tomo el nuevo dato ingresado
NuevoDato = Target.Value
'ahora: yo sé que tu tabla comienza en la fila 3 y se extiende hasta un lugar
'menos de donde ingresaste el nuevo valor, entonces el rango donde buscaré
'para evitar duplicados será desde C3 hasta una fila anterior a la celda en donde
'ingresaste el nuevo dato.
Fila = Fila - 10 'resto uno para que busque hasta la celda anterior
'ahora busco el nuevo valor dentro del rango especificado, y pongo un controlador
'de errores. si el valor existe, almaceno en F en que fila está, para avisarle al usuario
'que duplicó datos:
On Error Resume Next
F = Range("C3:C25" & Fila).Find(what:=NevoDato, after:=ActiveCell, LookIn:=xlValues, lookat:=xlWhole).Row
If Err.Number = 91 Then
Exit Sub
Else
MsgBox "El dato ingresado ya se encuentra en la fila " & F
End If
End If
End Sub
Respuesta Responder a este mensaje
#2 Mr Gonzalo
16/06/2007 - 17:05 | Informe spam
Gracias, amigo, el codigo funciona muy bien, y no es necesario saber donde
esta ubicado el valor duplicado, con que me notifique la duplicidad es mas
que suficiente, no uso validacion de datos por que ya tengo una validacion
en la misma columna,

saludos.

"Héctor Miguel" escribió en el mensaje
news:
hola, gonzalo !

... lo que quiero hacer es lo siguiente:
al estar introduciendo datos en excel que me notifique si el dato ya esta
capturado, el codigo es este:



si no te resulta de *absoluta* necesidad conocer el lugar donde ya existe
algun dato que se intente ingresar repetido -?-
prueba con algo +/- como lo siguiente:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([c:c], Target) Is Nothing Then ActiveCell.Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub
If Application.CountIf([c:c], Target) > 1 Then
MsgBox "El dato introducido en " & Target.Address & " ya existe !!!"
Application.Undo
End If
End Sub

[probablemente obtendrias igual resultado con una validacion de
os] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto __
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Fila As Long
Dim F As Long
Dim NuevoDato
'si el rango cambiante está en la columna 3 (que es donde buscaré los
datos
If Target.Column = 3 Then
'tomo la fila en la que se encuentra el nuevo dato ingresado
Fila = Target.Row
'y tomo el nuevo dato ingresado
NuevoDato = Target.Value
'ahora: yo sé que tu tabla comienza en la fila 3 y se extiende hasta un
lugar
'menos de donde ingresaste el nuevo valor, entonces el rango donde
buscaré
'para evitar duplicados será desde C3 hasta una fila anterior a la celda
en donde
'ingresaste el nuevo dato.
Fila = Fila - 10 'resto uno para que busque hasta la celda anterior
'ahora busco el nuevo valor dentro del rango especificado, y pongo un
controlador
'de errores. si el valor existe, almaceno en F en que fila está, para
avisarle al usuario
'que duplicó datos:
On Error Resume Next
F = Range("C3:C25" & Fila).Find(what:=NevoDato, after:=ActiveCell,
LookIn:=xlValues, lookat:=xlWhole).Row
If Err.Number = 91 Then
Exit Sub
Else
MsgBox "El dato ingresado ya se encuentra en la fila " & F
End If
End If
End Sub




Respuesta Responder a este mensaje
#3 Mr Gonzalo
16/06/2007 - 17:41 | Informe spam
Hola amigo, en la practica me di cuenta que el codigo me evita seleccionar
la columna o filas, esto no es muy comodo por que necesito imprimir
fragmentos de la lista, si pudieras checarlo, gracias

gonzalo
"Mr Gonzalo" escribió en el mensaje
news:eqG4$
Gracias, amigo, el codigo funciona muy bien, y no es necesario saber donde
esta ubicado el valor duplicado, con que me notifique la duplicidad es mas
que suficiente, no uso validacion de datos por que ya tengo una validacion
en la misma columna,

saludos.

"Héctor Miguel" escribió en el mensaje
news:
hola, gonzalo !

... lo que quiero hacer es lo siguiente:
al estar introduciendo datos en excel que me notifique si el dato ya
esta capturado, el codigo es este:



si no te resulta de *absoluta* necesidad conocer el lugar donde ya existe
algun dato que se intente ingresar repetido -?-
prueba con algo +/- como lo siguiente:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([c:c], Target) Is Nothing Then ActiveCell.Select
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 3 Then Exit Sub
If Application.CountIf([c:c], Target) > 1 Then
MsgBox "El dato introducido en " & Target.Address & " ya existe !!!"
Application.Undo
End If
End Sub

[probablemente obtendrias igual resultado con una validacion de
-?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ el codigo expuesto __
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim Fila As Long
Dim F As Long
Dim NuevoDato
'si el rango cambiante está en la columna 3 (que es donde buscaré los
datos
If Target.Column = 3 Then
'tomo la fila en la que se encuentra el nuevo dato ingresado
Fila = Target.Row
'y tomo el nuevo dato ingresado
NuevoDato = Target.Value
'ahora: yo sé que tu tabla comienza en la fila 3 y se extiende hasta un
lugar
'menos de donde ingresaste el nuevo valor, entonces el rango donde
buscaré
'para evitar duplicados será desde C3 hasta una fila anterior a la celda
en donde
'ingresaste el nuevo dato.
Fila = Fila - 10 'resto uno para que busque hasta la celda anterior
'ahora busco el nuevo valor dentro del rango especificado, y pongo un
controlador
'de errores. si el valor existe, almaceno en F en que fila está, para
avisarle al usuario
'que duplicó datos:
On Error Resume Next
F = Range("C3:C25" & Fila).Find(what:=NevoDato, after:=ActiveCell,
LookIn:=xlValues, lookat:=xlWhole).Row
If Err.Number = 91 Then
Exit Sub
Else
MsgBox "El dato ingresado ya se encuentra en la fila " & F
End If
End If
End Sub








Respuesta Responder a este mensaje
#4 Héctor Miguel
18/06/2007 - 08:10 | Informe spam
hola, gonzalo !

... en la practica me di cuenta que el codigo me evita seleccionar la columna o filas
esto no es muy comodo por que necesito imprimir fragmentos de la lista, si pudieras checarlo...



1) solo elimina de tu modulo de codigo, la fraccion primera de la propuesta original, la que *dice*:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([c:c], Target) Is Nothing Then ActiveCell.Select
End Sub







2) tambien, procura *evitar* cualquier entrada/pegado/modificacion/... que incluya en la columna 'C'
-> dos [o mas] celdas al mismo tiempo...
o el codigo se va a ver *en problemas* y sera necesario armar un *bucle* para dichas celdas [en la columna 'C']

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector-
Respuesta Responder a este mensaje
#5 Mr Gonzalo
19/06/2007 - 18:28 | Informe spam
Estimado amigo Hector, la macro que amablemente me proporcionaste funciona
muy bien, pero me he dado cuenta que comforme voy trabajando usa mucha
memoria, llegando a aumentar la memoria virtual a 1.5 gigas, y tengo que
reiciciar la maquina para liberar la memoria, digo que es a causa de la
macro pues esto no sucedia, intentare trabajar por el momento con validacion

"Héctor Miguel" escribió en el mensaje
news:
hola, gonzalo !

... en la practica me di cuenta que el codigo me evita seleccionar la
columna o filas
esto no es muy comodo por que necesito imprimir fragmentos de la lista,
si pudieras checarlo...



1) solo elimina de tu modulo de codigo, la fraccion primera de la
propuesta original, la que *dice*:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect([c:c], Target) Is Nothing Then ActiveCell.Select
End Sub







2) tambien, procura *evitar* cualquier entrada/pegado/modificacion/... que
incluya en la columna 'C'
-> dos [o mas] celdas al mismo tiempo...
o el codigo se va a ver *en problemas* y sera necesario armar un
*bucle* para dichas celdas [en la columna 'C']

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector-

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