Como evitar que se duplique un dato en la base de datos

Trato que al ingresar los datos a la base de datos si en la columna "B" DNI es una cifra que ya esta en dicha base me lo indique en un Msgbox "El Dato ya existe"

Esta es la macro que tengo en el botón Aceptar

Private Sub Aceptar_Click()

Me.ListBox1.RowSource = ""

If TextDNI = "" Then
MsgBox "Elegir Dni"
Exit Sub
ElseIf TextMATERIA = "" Then
MsgBox "Elegir Una Materia"
Exit Sub
ElseIf OptionButton1.value = False And OptionButton2.value = False Then
MsgBox "Elegir Una CALIFICACION"
Exit Sub
End If

Dim CODIGO As String
Dim DNI As String
Dim NOMBRE As String
Dim APELLIDO As String
Dim CURSO As String
Dim AÑOS As String
Dim COND As String
Dim MATERIA As String
Dim OBSERVACIONES As String
Dim UltimaFila As Double 'Variable que almacena ultima fila

'Paso del formulario a la variable
CODIGO = TextCODIGO.value
DNI = TextDNI.value
NOMBRE = TextNOMBRE.value
APELLIDO = TextAPELLIDO.value
CURSO = TextCURSO.value
AÑOS = TextAÑOS
COND = TextCOND
MATERIA = TextMATERIA.value
OBSERVACIONES = TextOBSERVACIONES

UltimaFila = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

Cells(UltimaFila + 1, 1) = CODIGO

With Cells(UltimaFila + 1, 2)
.NumberFormat = "#,##0"
.value = DNI
End With

Cells(UltimaFila + 1, 3) = NOMBRE
Cells(UltimaFila + 1, 4) = APELLIDO
Cells(UltimaFila + 1, 5) = CURSO
Cells(UltimaFila + 1, 6) = AÑOS
Cells(UltimaFila + 1, 7) = COND
Cells(UltimaFila + 1, 23) = OBSERVACIONES

For i = 8 To 22
If Cells(8, i) = MATERIA Then
Cells(UltimaFila + 1, i) = IIf(OptionButton1.value = True, Label10.Caption, Label11.Caption)
Exit For
End If
Next

TextCODIGO.value = WorksheetFunction.Max(Sheets("Datos").Columns("A")) + 1

'TextCODIGO = "" 'Significa borrar
TextDNI = "" 'Empty
TextNOMBRE = "" 'Empty
TextAPELLIDO = "" 'Empty
TextCURSO = "" ' Empty
TextAÑOS = ""
TextCOND = ""
TextMATERIA = "" 'Empty
TextOBSERVACIONES = ""
OptionButton2 = False
OptionButton2 = False

TextDNI.SetFocus

Me.ListBox1.RowSource = "BASE"

End Sub

2 Respuestas

Respuesta
4

Antes de la declaración de todas esas variables (que dicho sea de paso no entiendo por qué utilizas variables si podrías pasar los datos directamente desde los controles) coloca estas instrucciones:

Set busco = ActiveSheet.Range("B:B").Find(TextDNI, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    MsgBox "Este DNI ya existe en la base.", , "Error"
    'opcional: volver a posicionarse en el control
    TextDNI. SetFocus
    Exit Sub
End If

Si la Base no es la hoja activa, reemplaza 'ActiveSheet'  por el nombre de la hoja.

Si los DNI están en otra columna reemplazá el rango por el que corresponda.

Ajustá el mensaje a gusto.

Buenos días Elsa le paso la macro y por email el archivo

Tal vez coloque las líneas donde no corresponde

Private Sub Aceptar_Click()

If TextDNI = "" Then
MsgBox "Elegir Dni"
Exit Sub
ElseIf TextMATERIA = "" Then
MsgBox "Elegir Una Materia"
Exit Sub
ElseIf OptionButton1.value = False And OptionButton2.value = False Then
MsgBox "Elegir Una CALIFICACION"
Exit Sub
End If

Dim CODIGO As String
Dim DNI As String
Dim NOMBRE As String
Dim APELLIDO As String
Dim CURSO As String
Dim AÑOS As String
Dim COND As String
Dim MATERIA As String
Dim OBSERVACIONES As String
Dim UltimaFila As Double 'Variable que almacena ultima fila

Set busco = ActiveSheet.Range("B:B").Find(TextDNI, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
MsgBox "Este DNI ya existe en la base.", , "Error"
'opcional: volver a posicionarse en el control
TextDNI.SetFocus
Exit Sub
End If


'Paso del formulario a la variable
CODIGO = TextCODIGO.value
DNI = TextDNI.value
NOMBRE = TextNOMBRE.value
APELLIDO = TextAPELLIDO.value
CURSO = TextCURSO.value
AÑOS = TextAÑOS
COND = TextCOND
MATERIA = TextMATERIA.value
OBSERVACIONES = TextOBSERVACIONES


UltimaFila = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count


Me.ListBox1.RowSource = ""

Cells(UltimaFila + 1, 1) = CODIGO

With Cells(UltimaFila + 1, 2)
.NumberFormat = "#,##0"
.value = DNI
End With

Cells(UltimaFila + 1, 3) = NOMBRE
Cells(UltimaFila + 1, 4) = APELLIDO
Cells(UltimaFila + 1, 5) = CURSO
Cells(UltimaFila + 1, 6) = AÑOS
Cells(UltimaFila + 1, 7) = COND
Cells(UltimaFila + 1, 23) = OBSERVACIONES

For i = 8 To ActiveSheet.ListObjects("BASE").ListColumns.Count
If Cells(8, i) = MATERIA Then
Cells(UltimaFila + 1, i) = IIf(OptionButton1.value = True, Label10.Caption, Label11.Caption)
If CheckBox1 Then Cells(UltimaFila + 1, i + 1) = Me.TextBox2 ' escribe la observacion una columna despues de la materia si el chek esta activo
Exit For ' sale del ciclo for
End If
Next

TextCODIGO.value = WorksheetFunction.Max(Sheets("Datos").Columns("A")) + 1

'TextCODIGO = "" 'Significa borrar
TextDNI = "" 'Empty
TextNOMBRE = "" 'Empty
TextAPELLIDO = "" 'Empty
TextCURSO = "" ' Empty
TextAÑOS = ""
TextCOND = ""
TextMATERIA = "" 'Empty
TextOBSERVACIONES = ""
TextBox2 = ""
OptionButton2 = False
OptionButton2 = False
CheckBox1 = False

TextDNI.SetFocus

Me.ListBox1.RowSource = "BASE"

End Sub

Saludoa, JC

En realidad te había sugerido colocar las instrucciones ANTES de la declaración de las variables, para así tener todas las validaciones juntas... pero eso no afecta al funcionamiento del botón.

El primer problema que observo es que usas un ComboBox pero lo llamas TextDNI, al igual que en Curso, Años, Materias. ¿Son todos controles ComboBox y los llamaste Txt?. Eso te confunde y también a los que leemos tus consultas.

El Combobox para el DNI (mal llamado TxtDNI) muestra valores de una columna A, no de la hoja activa, sino de la que se llama 'Lista'. Qué pena que no hayas leído con atención mi respuesta:

Si la Base no es la hoja activa, reemplaza 'ActiveSheet' por el nombre de la hoja.

Si los DNI están en otra columna reemplazá el rango por el que corresponda.

Ahora, siempre te va a mostrar el mensaje porque estás seleccionando valores de un Combobox que toma valores de una hoja. Y luego del mensaje se vuelve a posicionar en el control.

Si vas a utilizar ese control Combobox también para el ingreso de datos nuevos, debes tener en la hoja Lista, col A, los números sin formato. No puedo dejar una imagen aquí no coinciden los datos ingresados con los de la lista por su formato.

Devuelvo el libro ajustado y probado.

Sdos!

Respuesta
2

I. Hola Compañero, aunque no soy usuario de Excel ni de VBA, quisiera facilitarle la información que vi sobre esta posibilidad, por si pudiese serle de alguna utilidad mientras le atiende una persona conocedora de primera mano, la que si desea podríamos citar o invocar en caso de que no recibiese respuestas durante próximos días.

Le ruego me disculpe todas las molestias y el tipo de respuesta, ánimo.


https://stackoverflow-com.translate.goog/questions/31196997/how-can-i-display-a-message-if-a-value-already-exists-in-database?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://stackoverflow-com.translate.goog/questions/51458092/vba-check-if-columns-contains-specific-value?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://stackoverflow-com.translate.goog/questions/50758058/vba-userform-copy-the-input-data-and-paste-them-in-different-worksheet-based-on?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://www-mrexcel-com.translate.goog/board/threads/search-existing-data-through-userform-new-input-and-insert-if-no-duplicate-found.647699/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://stackoverflow.com/questions/45255145/vba-excel-specific-cell-entry-and-adding-a-warning-message 

https://forum-ozgrid-com.translate.goog/forum/index.php?thread/102824-add-data-from-userform-to-specific-cells-on-worksheet/&_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://www.myonlinetraininghub.com/excel-if-and-or-functions-explained 

https://www-access--programmers-co-uk.translate.goog/forums/threads/update-existing-access-records-based-on-cell-values.310839/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

Evitar duplicados en un campo de una tabla access en vba

https://www-excelandaccess-com.translate.goog/blog/working-with-tables-in-vba/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

Código para evitar datos duplicados

Evitar duplicados php/mysql

https://clickup-com.translate.goog/blog/how-to-create-a-dashboard-in-excel/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

https://excelmacromastery-com.translate.goog/excel-vba-copy/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=sc 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas