VBA Excel - Dudas sobre ingreso de datos de TextBox que no permita duplicados de una tabla de Excel y formato de fechas.

Tengo 2 dudas sobre la programación de formularios que estoy haciendo, espero puedan ayudarme.

1) Tengo un textbox1 donde ingreso un número de un Documento de Identidad y automáticamente jala los datos a partir de ese número en los otros textbox (por ejemplo en la cabecera de una hoja de excel que contiene N° Documento de Identidad / Apellidos y Nombres / Centro de Costo / Ocupación / ... Etc). Esos datos, al pulsar un CommandButton1, son registrados en una hoja llamada "MatrizMod". Para que me jale datos al ingresar el Documento de Identidad al textbox debo ingresarlo completo los 8 números que lo componen obligatoriamente.

Lo que quiero es que al ingresar el Número de 8 dígitos y presione TAB o de click en otro campo me salga un aviso de que el dato ya ha sido ingresado dado que el número existe en la hoja de registros "MatrizMod" grabado anteriormente (y de ser posible me salga un aviso de si deseo continuar con el ingreso de datos o no, y al poner no se borre lo que ingresé en el textbox1 e ingrese otro número).

He intentado este código que encontré y modifiqué pero no he tenido éxito. Quisiera saber si hay algo que deba agregar:

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
dato = TextBox1.Value
contarsi = Application.WorksheetFunction.CountIf(Sheets("MatrizMod").Columns(1), dato)
If contarsi = TextBox1.Value Then
MsgBox "El trabajador ya está en lista, use el botón de Renovación"
TextBox1.SetFocus
Exit Sub
End If
End Sub

2) La otra pregunta corresponde a un problema con mi macro. Mi formulario al tener los datos listos, no solo graba los datos de los Textbox, sino agrega fórmulas correspondientes a 2 celdas que están ligadas a una celda con una fecha (que es ingresada de la fecha que contenga en el TextBox9 de mi formulario) pero que no realizan la fórmula y me sale #¡VALOR!, si esa fecha ingresada en mi formulario la vuelvo a tipear sin cambiar formato ni nada, sí acepta la formulación y lanza un resultado. Podría pensar que es por el formato conque lo graba, pero el problema es el mismo número que es ingresado en sí. Adjunto los códigos relacionados a dicho Textbox9:

Private Sub CommandButton1_Click()
Dim emptyRow As Long
Sheets("MatrizMod").Select
emptyRow = Range("A" & Rows.Count).End(xlUp).Row + 1
Cells(emptyRow, 1).Value = TextBox1.Value
(...)
Cells(emptyRow, 7).FormulaR1C1 = "=IF(RC[+2]=""Estable"",""ESTABLE"",INDEX(RC[+3]:RC[+24],1,COUNT(RC[+3]:RC[+24])))"
'INDEX(RC[+3]:RC[+24] donde RC[+3] es la celda donde se coloca el dato de la fecha y en esa celda se da error.
If OptionButton1.Value = True Then
Cells(emptyRow, 9).Value = OptionButton1.Caption
Cells(emptyRow, 10).Value = TextBox9.Value
Else
Cells(emptyRow, 9).Value = "Estable"
Cells(emptyRow, 10).Value = "ESTABLE"
End If
End Sub
Private Sub OptionButton1_Click()
If Me.OptionButton1 Then
(...)
TextBox9.Enabled = True
End If
Dim lngWhite As Long
lngWhite = RGB(255, 255, 255)
If TextBox4.Enabled = True Then 
(...)
TextBox9.BackColor = lngWhite
End If
End Sub
Private Sub OptionButton2_Click()
If OptionButton2 = True Then
TextBox9.Enabled = False
ComboBox2.Value = "A Plazo Indeterminado"
(...)
TextBox9.Value = ""
End If
Dim lngGray As Long
lngGray = RGB(216, 208, 200)
TextBox9.BackColor = lngGray
End If
End Sub
Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
(...)
If IsNumeric(TextBox5) Then
TextBox9 = DateAdd("d", MesesRenovar, InicioContrato)
FinContrato = DateValue(TextBox9)
End If
End Sub

1 Respuesta

Respuesta
1

Te respondo a la primer consulta (*)

La función Contar. SI devuelve el número de veces que aparece un texto o nro en un rango... por lo tanto debes controlar si esa función devuelve 0 (todavía no se encuentra el nro) o > 0 (ya se encuentra en la tabla).

Dejo el código en otro evento que creo se ejecuta mejor, pero puedes seguir con el tuyo solo cambia la línea de la comparación:

Private Sub TextBox1_Change()
'x Elsamatilde
If TextBox1 = "" Then Exit Sub
dato = TextBox1.Value
contarsi = Application.WorksheetFunction.CountIf(Sheets("MatrizMod").Columns(1), dato)
If contarsi > 0 Then
    MsgBox "El trabajador ya está en lista, use el botón de Renovación"
    TextBox1 = "": TextBox1.SetFocus
End If
End Sub

(*) Disculpa, pero solo podemos responder a 1 consulta por vez. Deja la segunda en otra entrada indicando en el título el asunto a tratar.

¡Gracias!  ¡Me ha funcionado!

Muchas gracias por al respuesta. Consulta. En esta parte:

contarsi = Application.WorksheetFunction.CountIf(Sheets("MatrizMod").Columns(1), dato)

Si solo quisiera toda la columna A o un rango en específico, ¿cómo sería?

Aparte, si en mi columna no hubiera números, sino Nombre y Apellidos, ¿cómo se modificaría mi código? Pues por los parámetros que deduzco de Contar.Si parece que solo admite valores numéricos para comparar.

Gracias por la respuesta.

No. La función 'cuenta' la cantidad de celdas, en un rango, que contiene un criterio ya sea numérico o alfanumérico.

Y ya le estás diciendo que 'cuente' en la columna A con esta expresión Columns(1) en la parte de la función CountIf.

Ahora, si quisieras un rango (de 1 más columnas) podés utilizar algo como esto:

CountIf(Sheets("MatrizMod"). Range("A2:B20"), dato)

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas