sábado, 17 de marzo de 2018

Interactuando con Userform

El modelo que aquí se presenta permite crear registros en una base de datos. Además también se podrán modificar o eliminar registros de esa base.

Como adicional, utilizaremos 4 botones que nos permitirán encontrar el primer registro, el último, los anteriores y los siguientes al registro mostrado en el formulario.

Imaginemos una base con 2 campos principales: Código y Nombre. Pueden ser Proveedores, Clientes, Productos, Alumnos, Empleados, etc.

El código nos servirá para numerarlos de modo consecutivo. Pero la búsqueda se hará por Nombre (o Descripción, Apellidos, u otros textos).























¿Cuáles son los principales procesos que ejecutaremos desde el userform?

1- Al inicio del código del userform declaramos 2 variables que serán utilizas a lo largo de todos los subprocesos:
          Dim hop                  'variable que identifica a la hoja base de Proveedores
            Dim fily As Long     'variable que indica la fila del registro encontrado

2- En el evento Initilize del formulario se procede a :
  • Ordenar por la col B (texto) para mostrarlos en el desplegable y también para la búsqueda desde los botones inferiores. Esto porque al crear registros se agregan al final de la base y porque además el usuario puede cambiar el orden si lo necesita.
  •  Mostrar la numeración correlativa con la siguiente instrucción, que se repetirá luego de cada registro creado:
            Label7.Caption = Application.WorksheetFunction.Max(hop.Range("A:A")) + 1

3-  Para Buscar un registro se despliega la lista o se comienza a introducir los primeros caracteres para ubicarlo. Se muestran los campos del registro encontrado y se guarda en la variable 'fily' la fila. Se puede optar por Eliminarlo o sobreescribir en ellos para modificarlo.

Al Aceptar se ejecuta el mismo proceso que si fuera un nuevo registro. Si la variable 'fily' está vacía se busca la primer fila libre para agregarla, sino se sobreescribe en la fila del registro encontrado.

4- El primer registro es el de la fila 2 porque la tabla se encuentra ordenada por nombres. Y se mostrarán los campos de este registro:
          fily = 2
          Call paseDatos

5- El último registro es el último de la tabla y se obtiene con esta instrucción:
          fily = hop.Range("A" & Rows.Count).End(xlUp).Row
          Call paseDatos

6- El anterior es el de la fila anterior al del registro mostrado actualmente, entonces será:
dato = TextBox4.Text
Set busco = hop.Range("B:B").Find(dato, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    fily = busco.Row - 1

7- El siguiente será el de la fila siguiente al del registro mostrado actualmente:
dato = TextBox4.Text
Set busco = hop.Range("B:B").Find(dato, LookIn:=xlValues, lookat:=xlWhole)
If Not busco Is Nothing Then
    fily = busco.Row + 1

En el caso 6 (anterior) habrá que evaluar si no se está ya en el primer registro... y en el caso 7 (último) se evaluará si se llegó a una fila vacía significando que ya se está mostrando el último y por lo tanto no hay 'siguiente'.
If hop.Range("A" & fily) <> "" Then
      Call paseDatos
Else
      MsgBox "No hay más registros en la base.", , "ATENCIÓN"
      Exit Sub
End If

El resto de la programación del formulario son instrucciones de control, de pase a mayúsculas en algunos campos o de control de números en otros. 

Descargar el ejemplo completo desde aquí.

En el libro de ejemplo se deja además un userform que permite la búsqueda por ID desde los botones inferiores (Primero, Anterior, Siguiente y Último). La hoja siempre se presenta de modo ordenado por la columna B (texto).
Este ejemplo se explica en el siguiente VIDEO

2 comentarios:

  1. Inge. Elsa su canal es super fascinante¡¡ necesitamos muchísimos más docentes como usted aquí en México¡

    Le mando un gran saludo.

    ResponderEliminar
  2. Gracias Arturo. En breve ya se viene el 7mo video !
    Sdos!

    ResponderEliminar