Registrar datos no repetidos en celdas

Hola que tal como estas.. Bueno espero me puedas ayudar con esto que estoy sufriendo desde hace semanas espero que si puedas ayudarme y estaré muy agradecido de ti... Mira lo que quiero es que me ayudes a grabar datos en celdas desde un userform mira te explico bien. En la hoja "DATOS EMPLEADOS" tengo la columa
a1=codigo
b1=nombre
c1apellidos
d1=cargo
e1=nombres y apellidos
f1=foto
y en mi userform "registro de empleados" tengo 6 textbox
textbox 2= codigo (ingreso)
textbox 3 = nombre(ingreso)
textbox 4 = apellidos(ingreso)
textbox 5 = cargo(ingreso)
textbox 6 = nombres y apellidos (concateno textbox3& ","& " " &textbox 4)
textbox 7 = foto (concateno "foto-"&""&textbox2)
Yo tengo este código que me graba perfectamente los datos si ingreso un empleado con código prr002 y sus restos de datos lo graba normal pero perooo..! Si pongo otra vez prr002 me vuelve a grabar cosa que no quiero porque el código debe de ser único.. Y quiero que cuando se vuelva a repetir el código me salga un mensaje de "el código ya existe" o algo por el estilo por favor de verdad te agradecería mucho..!
'Desprotegemos la hoja
ActiveSheet.Unprotect
'Nos situamos al principio
On Error GoTo ConError
Range("A1").Select
'Bajamos hasta encontrar la fila vacía
If Me.TextBox2.Text <> "" And TextBox3.Text <> "" And TextBox4.Text <> "" Then
Do While Not IsEmpty(ActiveCell)
'Bajamos una fila
ActiveCell.Offset(1, 0).Select
Loop
'grabamos los datos en la primera fila vacía
'primero el CODIGO DEL EMPLEADO
ActiveCell = TextBox2
'ahora EL NOMBRE
ActiveCell.Offset(0, 1) = TextBox3.Text
'ahora LOS APELLIDOS
ActiveCell.Offset(0, 2) = TextBox4.Text
ActiveCell.Offset(0, 3) = TextBox5.Text
'-------------CARGA EL NOMBRE Y APELLIDO----------------
Me.TextBox6.Text = ""
MsgBox ("REGISTRO GRABADO CON EXITO"), vbInformation, "ADMINISTRACION"
Worksheets("DATOS EMPLEADOS").Range("A1:F50"), 5, 0)
TextBox2.SetFocus
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
Me.TextBox6.Text = ""
Me.TextBox7.Text = ""
Exit Sub
Else
ConError:
MsgBox ("NO SE PUDO GRABAR LOS DATOS, POR FAVOR VUELVA A INTENTARLO"), vbInformation, "ADMINISTRACION"
'limpiamos los textbox
End If
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox7.Text = ""
'ponemos el focus en el TextBox1
TextBox2.SetFocus
'protegemos la hoja
ActiveSheet.Protect

3 Respuestas

Respuesta
1
Pero si necesitas usuarios únicos tendrás que decírselo al programa. Antes de grabar deberías comprobarlo. El esqueleto del código sería en lugar de ActiveCell = TextBox2
If Not CodigoExiste (textbox2.text) then 'lo graba
ActiveCell = TextBox2
..... esto de tu codigo cuando es correcto que grabe
else
Msgbox " El código ya existe
end if
Y la función código existe seria algo parecido a
Function CodigoExiste(s As String) As Boolean
Dim res As Boolean
Dim c As Range
res = False 'por defecto supongo que no existe
For Each c In Range(...)
If c.Value = s Then res = True
Next c
CodigoExiste = res
End Function
Donde tendrás previamente que calcular el rango donde buscar. También puedes optimizar la función cambiando el for por un while...
Si me permites además un par de sugerencias. Es mejor en general hacer funciones separadas de lectura y escritura por facilidad de lectura y mantenimiento del código. Incluso si te creas tipos de usuario con las estructuras de datos te será más fácil luego mantener el código, modificarlo...
Respuesta
1
Ok lo que necesitas es una pequeña sub para verificar si existe o no el dato a ingresar.
Para ello necesitas definir el rango a recorrer ( en donde se aloja el odigo) y debes declarar una variable boleana de tipo global, la que nos indicara el resultado de la verificación.
En términos simples es
Presionas botón
-Verifica si existe código-
Dependiendo del resultado de la búsqueda
Si es True entonces salir del procedimiento indicando que el usuario ya existe
de lo contrario naturalmente si es false continue el procedimiento.
Así. Veo que estas realizando un proyecto para ingreso datos. Antes de programar siempre debes hacer el algoritmo primero en papel y haciéndote todas las preguntas y poniéndote en situaciones que podrían suceder... el famos "y si...". créeme es lo mejor, te ahorraras mucho tiempo
Bueno e, bucle seria algo así:
Primero declaramos variable boleana en ámbito global
En este caso:
Dim existe As Boolean
(Aunque dice dim esta declaración la haces bajo la linea option explicit del modulo y ya te queda "visible", para todos los eventos del modulo).
luego el sub que hara la tarea de verificar:
Sub verifica(codigo As String)
Dim r As Range
existe = False
For Each r In Sheets(2).Range("A:A")
If Ucase(trim(r)) = ucase(trim(codigo)) Then existe = True: Set r = Nothing: Exit For
Next
Set r = Nothing
End Sub
Como ves el sub cuenta con un argumento, el cual debes pasarle como string este seria el código a verificar
O sea la llamada seria
Verifica(PRR002)
Ok. Allí esta.
Sigue el flujo indiacdo y ya:
Inicia tu rutina - ingresa código a verificar en el text - realiza llamada de verificación verifica(argumento) - espera resultado de variable "existe" - si es true continua proceso y si no lo es realiza las acciones que consideres necesarias.
Ya me ayudaste una vez y estoy seguro que esta vez no sera la excepción muchas gracias de antemano.:!
Ups. Lo olvide..
El sub esta como ejemplo, debes ajustarlos rangos y la hoja es decir:
For Each r In Sheets(2).Range("A:A")
En donde recorrerá la columna A para la hoja 2
Tu cambias esos valores por los que tengas ok.
Trate de entender tu código y me percate de eso...! Mira la verdad no soy muy bueno programando.. pero con los foros estoy aprendiendo mucho.. mira ise algo así
option explicit
------------------------------------------------------------
Dim existe As Boolean
Sub verifica(codigo As String)
Dim r As Range
existe = False
For Each r In Sheets("DATOS EMPLEADOS").Range("A:A")
If Ucase(trim(r)) = ucase(trim(codigo)) Then existe = True: Set r = Nothing: Exit For
Next
Set r = Nothing
End Sub
¿Pero mi pregunta es en el código que te pase de el btn_grabar siguel igual el código o tengo que modificar algo? ¿Por qué el código que me estas dando lo e pasado en un modulo pero no e cambiado nada en el btn_grabar me podías explicar más detallado por favor?
Gracias calvuch por tu tiempo..! Solo le agregue un if a mi código y si me funciona bien
Do While Not IsEmpty(ActiveCell)
'Bajamos una fila
If ActiveCell = TextBox2 Then
MsgBox "ya se encuentra ese codigo, asigne otro"
Me.TextBox2.Locked = False
TextBox2.SetFocus
TextBox2.Text = ""
Esto fue lo que le agregue al código del while.. te agradezco mucho por tu tiempo--!
Espero contar con tigo para otra consulta!
Respuesta
1
En el while que tienes coloquemos esto
...Do While Not IsEmpty(ActiveCell)
if activecell=textbox2 then
Msgbox "ya se encuentra ese codigo, asigne otro"
Exit sub
Else
ActiveCell.Offset(1, 0).Select
End if
Loop
...
Muchísimas gracias..! Gracias por tu tiempo.. disculpa la molestia me sirvió de mucho.. espero contar contigo en alguna otra duda..! Gracias de verdad

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas