El formulario ‘miformulario’ tiene problemas varios. Y como tenés otro userform como copia de éste, también tendrás que arreglarlo en los mismos puntos.
- Se repiten las instrucciones del evento Initialize en Activate. Podrías declarar todas las propiedades directamente en la barra de Propiedades evitándote así líneas de código. Si querés hacerlo por código entonces solamente en el evento Initialize.
- Se vuelve a asignar 3 col a la lista en BT_AGREGAR_Click() cuando esto ya fue instruído en los eventos Initialize y Activate. (Ver pto anterior)
- No hay control de contenidos (ver importe en imagen)
- El orden del Enter o Tab es caótico. Arreglar la propiedad TabIndex de cada control.
- No se inhabilitan los botones de tareas (Registrar, Editar, Eliminar) mientras se está ejecutando una de ellas. Esto hace que se pueda crear cuando se intentó modificar. Incluso puedo crear registros vacíos…. O intentar eliminar (sin control de fila).
- Las consultas de confirmación no se hacen con InputBox sino con MsgBox. Luego se solicita clave.
sino = MsgBox("¿Confirmas ELIMINAR la fila " & datos & "?", vbQuestion + vbYesNo)
If sino <> vbYes Then Exit Sub
respuesta = Application.InputBox("Ingresa tu clave de usuario para eliminar registro.", "Ingrese Clave")
If respuesta = "123" Then
- Al utilizar la función FIND en una búsqueda, no se tiene que dar por asumido que la búsqueda fue exitosa. En especial si lo que se ingresa es por tipeo y no por selección desde un desplegable.
Set fila = Sheets("Productos").Range("B:B").Find(valor_buscado, lookat:=xlWhole)
linea = fila.Row 'error si el reg no fue encontrado. Ver video N° 11
Set fila = Sheets("Productos").Range("B:B").Find(valor_buscado, lookat:=xlWhole)
if fila is nothing Then
Msgbox "No se encontró el registro" :Exit sub
End If
linea = fila.Row
- Luego de eliminar un registro se ejecuta el evento Change del control txt_id. Pero ahora este control está vacío. Debes evaluar esta condición de vacío para no ejecutar el resto de las instrucciones.
Private Sub txt_id_Change()
If txt_id.Value = 0 Then Exit Sub
- Al eliminar un registro debes refrescar la lista:
Range("B" & linea).EntireRow.Delete
lista.RowSource = "tblProductos" 'refrescar la lista
End If
Seguramente habrá otros problemas pero no me detuve al resto de los procesos. Cuando finalices con los arreglos podrás dejar nuevas consultas aquí en el foro.
* Te invito a mirar los siguientes videos de mi canal. Enlace al pie.
N° 11: mejoras en el código. Dejar de utilizar Me, control de búsqueda exitosa, etc.
N° 27 y 28: Completo ejemplo de registro en base.
N° 25 + otros que allí se indican: Uso correcto de Find, con control de resultados.
N° 36: Filtro dinámico con lista en Userform.