Impedir registros repetidos considerando 2 columnas

En una Hoja Excel, a modo de base de datos, utilizo un UserForm para ingresar estos datos. Nos centraremos en las columnas"A" y "B" que es donde me surgen los problemas. En la Columna "A" van números de registro y en la "B", la fecha en la que se registran. Todos estos registros se corresponden con fechas del pasado 2013. Hasta ahora, para impedir que se introdujeran números de registro duplicados, a través de unas líneas de código, recorrían la columna "A" y si se encontraba ya registrado, con un MsgBox te advertía que ese núm. Ya se encontraba y te impedía su registro (al final pondré este código).
El problema que me surge es con los nuevos registros, correspondientes al 2014, en los que se pueden repetir con los del 2013, y no por ello deben de dejar de grabarse; es decir, se tienen que grabar. Lo que pretendo es modificar la macro, para que realice lo siguiente:
1. - Que compruebe si el nuevo número de registro se encuentra o no en la Columna "A".
2. - Si ya se encuentra grabado, comprobar en la Columna "B", si está grabado con fecha de 2013 y no con fecha de 2014. Si ya se encuentra grabado con fecha de 2013, la macro debe permitir el registro de todos los datos. Dicho de otra forma, debe comprobar que el nuevo número de registro, no se encuentre repetido con fecha de 2014; en cuyo caso, debe advertir de su duplicidad y no grabarse.

Private Sub cmdRegistra_Click() 
Dim Salir As Boolean, EstaHoja As String 
Application. ScreenUpdating = False 
For n = 1 To 2: If Me. Controls("textbox" & n) = "" Then Salir = True: GoTo Verifica 
Next 
For n = 1 To 4: If Me. Controls("combobox" & n) = "" Then Salir = True: GoTo Verifica 
Next 
If IsNull(DTPregistro) Then Salir = True 
If IsNull(DTPentrega) Then Salir = True 
Verifica: 
If Salir Then MsgBox "FALTAN DATOS! ": Exit Sub 
Sheets("DATOS"). Select 
' Comprueba si hay duplicados en la columna 1 antes de copiar datos , 
valor = TextBox1. Value 
contarsi = Application.WorksheetFunction.CountIf(Sheets("DATOS"). Columns(1), valor) 
If contarsi > 0 Then 
MsgBox "... Ya existe un Informe con ese número de registro, no se permiten duplicados" 
TextBox1. Value = "" 
Exit Sub 
End If 
' Fin de la comprobación de duplicados
t = Cells(Rows. Count, 1). End(xlUp). Row 
Cells(t + 1, 1) = TextBox1. Value 
Cells(t + 1, 2) = DTPregistro. Value 
Cells(t + 1, 3) = ComboBox1. Value 
Cells(t + 1, 4) = ComboBox2 & " " & TextBox3 
Cells(t + 1, 5) = TextBox2. Text 
Cells(t + 1, 6) = ComboBox3. Value 
Cells(t + 1, 7) = ComboBox4. Value 
Cells(t + 1, 8) = DTPentrega. Value 
Cells(t + 1, 13) = TextBox4. Text 
TextBox1. Value = "" 
DTPregistro. Value = "" 
TextBox2. Text = "" 
TextBox3. Text = "" 
ComboBox1. Value = "" 
ComboBox2. Value = "" 
ComboBox3. Value = "" 
ComboBox4. Value = "" 
DTPentrega. Value = "" 
TextBox4. Text = "" 
Application. ScreenUpdating = True 
End Sub

1 respuesta

Respuesta
1

Qué pena no aclaraste tu versión Excel para pasarte la función más apropiada.

Estás utilizando la función CONTAR. SI que en la hoja se vería como:

=CONTAR.SI(rango; criterio)

Ahora deberás utilizar esta otra :

=CONTAR.SI.CONJUNTO(rgo1; criterio; rgo2; criterio) y en VBA sería: COUNTIFS

Muchas gracias Elsa.

Utilizo excel 2003; pero no doy con la forma de implementar el código con la función que me recomiendas, CONTAR.SI.CONJUNTO. Me da error.

saludos.

Y claro, porque esa función fue agregada por Office con posterioridad, x eso es tan importante que aclaren en las consultas con qué versión trabajan.

Para tu versión podes utilizar alguna de estas 2:

BDCONTARA (base de datos, campo, rango de criterios.

Imaginando que colocarás en celda R1 el título del primer criterio y en R2 el valor buscado, en S1 el título del 2do criterio y en S2 el año buscado quedaría algo así:

=BDCONTARA(A1:G50;C1;R1:S2)

C1 es cualquier columna que contiene datos sin filas en blanco.

También podes usar esta otra, que es matricial, es decir que luego que la escribas debes presionar juntas las teclas Ctrl, Shift y Enter:

=SUMAPRODUCTO(($A$1:$A$50 = 100020)*($B$1:$B$50=2014))

Si el nro de reg es dato alfanumérico irá entre comillas.

Escribí tu fórmula con la grabadora encendida, presioná las 3 teclas para obtener el resultado correcto y luego detené la grabadora. En un módulo encontrarás la sintaxis de la fórmula.

Gracias, de nuevo. He probado con la segunda de las opciones y no me funciona. Una vez implementado el código de la macro, anteriormente expuesta, me queda así:

'Comprueba si hay duplicados en la columna 1 antes de copiar datos,
valor = TextBox1.Value
contarsi = FormulaArray = "=SUMPRODUCT(R1C1:R50C1=100020)*(R1C2:R50C2=2014)"
If contarsi > 0 Then
 MsgBox "...Ya existe un Informe con ese número de registro, no se permiten duplicados"
 TextBox1.Value = ""
 Exit Sub
End If
'Fin de la comprobación de duplicados

Por ser una función matricial no podrás incluirla en WorksheetFunction como lo hacías con la variable contarsi, o como podrías hacerlo con BDCONTARA, sino que tendrás que colocarla en alguna celda para luego consultar su contenido.

Por ej:

Range("AZ1").FormulaArray = "=SUMPRODUCT(R1C1:R50C1=100020)*(R1C2:R50C2=2014)"Range("AZ1").FormulaArray =
If Range("AZ1") > 0 Then
 MsgBox "Duplicados...."
Else

Pero esto solo te servirá para el valor 100020.... si necesitas comparar el valor de algún textbox sería algo como:

Range("AZ1").FormulaArray = "=SUMPRODUCT(R1C1:R50C1=" & valor & ")*(R1C2:R50C2=2014)"Range("AZ1").FormulaArray =
If Range("AZ1") > 0 Then

Considerá que los textbox guardan los valores como 'texto' y si en la hoja son números tendrás que utilizar:

valor = Val(Textbox1)

Probalo y comentame.

Sdos

Elsa

Muchas gracias, Elsa; pero ya me pierdo un poco. Por favor, implementarme ese código, pero dentro de la macro cmdRegistra, para que si me detecta que ya se encuentra registrado no me deje hacerlo: No se si te estoy pidiendo demasiado, pero no me veo ya capaz de hacerlo yo.

Discúlpame, pero en cualquier caso vaya por delante mi sincero agradecimiento. Mientras tanto, seguiré intentándolo.

Saludos

Si lo necesita, te podría enviar un archivo de prueba.

He añadido a la macro el código 'Comprueba si hay duplicados en la columna 1 antes de copiar datos'; pero me da "error 1004 en tiempo de ejecución. Error en el método Range de objeto _Global.

Private Sub cmdRegistra_Click()
Dim Salir As Boolean, EstaHoja As String
Application.ScreenUpdating = False
For n = 1 To 2: If Me.Controls("textbox" & n) = "" Then Salir = True: GoTo Verifica
Next
For n = 1 To 4: If Me.Controls("combobox" & n) = "" Then Salir = True: GoTo Verifica
Next
If IsNull(DTPregistro) Then Salir = True
If IsNull(DTPentrega) Then Salir = True
Verifica:
If Salir Then MsgBox "FALTAN DATOS !!!": Exit Sub
Sheets("DATOS").Select
'Comprueba si hay duplicados en la columna 1 antes de copiar datos,
valor = TextBox1.Value
contarsi = Evaluate("SUM(" & _
Range("A1:A" & t).Address & " = " & _
TextBox1 & ") * (YEAR(" & _
Range("B1:B" & t).Address & ") = " & _
Year(DTPregistro) & "))")
MsgBox "... Ya existe un Informe con ese número de registro, no se permiten duplicados"
TextBox1.Value = ""
Exit Sub
'Fin de la comprobación de duplicados
t = Cells(Rows.Count, 1).End(xlUp).Row
Cells(t + 1, 1) = TextBox1.Value
Cells(t + 1, 2) = DTPregistro.Value
Cells(t + 1, 3) = ComboBox1.Value
Cells(t + 1, 4) = ComboBox2 & " " & TextBox3
Cells(t + 1, 5) = TextBox2.Text
Cells(t + 1, 6) = ComboBox3.Value
Cells(t + 1, 7) = ComboBox4.Value
Cells(t + 1, 8) = DTPentrega.Value
Cells(t + 1, 13) = TextBox4.Text
TextBox1.Value = ""
DTPregistro.Value = ""
TextBox2.Text = ""
TextBox3.Text = ""
ComboBox1.Value = ""
ComboBox2.Value = ""
ComboBox3.Value = ""
ComboBox4.Value = ""
DTPentrega.Value = ""
TextBox4.Text = ""
Application.ScreenUpdating = True
End Sub

Que te parece? Porqué ese error?

Si, mejor enviame la hoja porque ahora agregaste una 't' que no sé de dónde sale ... '¿address' qué yo no te lo pasé?

La regla es: todo lo que es la función vá entre comillas y entre & van las variables... Range("A..." ) no parece ser una variable ... .

Espero tu libro. Copiá el correo que aparece en mi sitio que dejo al pie. No olvides aclararme el motivo de la consulta.

Acabo de enviarte mail con el libro. Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas