Formularios y ListBox en Microsoft Excel. Añadir, modificar y borrar registros.

Escrito por Administrador

24 de enero de 2023

El tema relativo a formularios y ListBox en Microsoft Excel, por su extensión, se quedó fuera del Curso de VBA para Microsoft Excel. Por eso, he querido traeros un ejemplo bastante completo y que os sirva de guía para usar esta herramienta que trata de asemejar Microsoft Excel con Microsoft Access, salvando las distancias, claro.

Como véis en la siguiente imagen, he creado una tabla con los trabajadores de una empresa, indicando el departamento al que pertenecen y el puesto que ocupan. Podríamos ir añadiendo trabajadores fila a fila, como hacemos habitualmente, pero... ¿y si lo hacemos a través de un formulario?

enviar-pedidos-proveedores-por-email-excel
Si pulsamos el botón "Acciones", se nos abre un Menú desde el que podemos acceder al formulario de alta, o bien al de búsqueda para editar o borrar empleados cargados previamente.
enviar-pedidos-proveedores-por-email-excel
El formulario de alta es muy sencillo,
enviar-pedidos-proveedores-por-email-excel
El formulario de búsqueda, nos permite buscar empleados por departamento, y una vez localizado, editar o borrar el registro.
enviar-pedidos-proveedores-por-email-excel
enviar-pedidos-proveedores-por-email-excel
enviar-pedidos-proveedores-por-email-excel
Ahora que hemos visto cómo está estructurado el ejemplo, vamos a ver cómo crear los formularios y ListBox en Microsoft Excel.

En primer lugar, abrimos el editor de Visual Basic. En la barra de menú, elegimos Insertar > Userform. Se abrirá una ventana como la siguiente,

enviar-pedidos-proveedores-por-email-excel
Con el cuadro de herramientas que aparece a la derecha de la imagen, diseñamos los cuatro formularios del ejemplo.
enviar-pedidos-proveedores-por-email-excel
Formulario de alta
enviar-pedidos-proveedores-por-email-excel
Formulario de edición
enviar-pedidos-proveedores-por-email-excel
Formulario de búsqueda
enviar-pedidos-proveedores-por-email-excel
Formulario de Menú
A continuación, asociamos el código a cada uno de los elementos de los formularios. Voy a separar el código por formulario, para que quede de la manera más clara posible.

 

1. Formulario de alta

Private Sub Alta_Click()

'Alta de un registro

Dim strTitulo As String
Dim Continuar As String
Dim TransRowRng As Range
Dim NewRow As Integer
Dim Limpiar As String

strTitulo = "VBA Total"

'Confirmamos que queremos dar de alta el registro

Continuar = MsgBox("Dar de alta los datos?", vbYesNo + vbExclamation, strTitulo)

'En caso negativo, salimos de la función

If Continuar = vbNo Then Exit Sub

'En caso afirmativo, comprobamos si el ID ya se encuentra dado de alta

Cuenta = Application.WorksheetFunction.CountIf(Range("A:A"), Me.txtID)

'Si ya está dado de alta, lanzamos un mensaje de aviso

If Cuenta > 0 Then

MsgBox "El ID '" & Me.txtID & "' ya se encuentra registrado", vbExclamation, strTitulo

Else

'En caso de que no se encuentre registrado en la tabla, lo añadimos una fila por debajo del último registro

Set TransRowRng = ThisWorkbook.Worksheets("Hoja1").Cells(1, 1).CurrentRegion

NewRow = TransRowRng.Rows.Count + 1

With ThisWorkbook.Worksheets("Hoja1")

.Cells(NewRow, 1).Value = Me.txtID
.Cells(NewRow, 2).Value = Me.txtUsuario
.Cells(NewRow, 3).Value = Me.txtDepartamento
.Cells(NewRow, 4).Value = Me.txtPuesto

End With

'Lanzamos un aviso informando del éxito de la operación

MsgBox "Alta exitosa.", vbInformation, strTitulo

Unload Me

End If

End Sub

Private Sub Cancelar_Click()

'Cerramos el formulario

Unload Me

End Sub

2. Formulario de búsqueda

Private Sub UserForm_Initialize()

'Damos formato al ListBox y traemos los datos de la tabla para el encabezado

For i = 1 To 4

Me.Controls("Label" & i) = Cells(1, i).Value

Next i

With ListBox1

.ColumnCount = 4
.ColumnWidths = "60 pt;60 pt;60 pt;60 pt"

End With

End Sub

Private Sub Filtrar_Click()

'Gestionamos los errores saliendo de la función

On Error GoTo Errores

If Me.txtFiltro1.Value = "" Then Exit Sub

'Si la búsqueda coincide con el valor introducido en el filtro, cargamos el registro completo en el ListBox

Me.ListBox1.Clear

j = 1

Filas = Range("a1").CurrentRegion.Rows.Count

For i = 2 To Filas

If LCase(Cells(i, j).Offset(0, 2).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then

Me.ListBox1.AddItem Cells(i, j)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)

Else

End If

Next i

Exit Sub

Errores:

MsgBox "No se encuentra.", vbExclamation, "EXCELeINFO"

End Sub

Private Sub Modificar_Click()

'Si no aparece ningún registro en el ListBox, lanzamos un mensaje de error

If Me.ListBox1.ListIndex < 0 Then

MsgBox "No se ha elegido ningún registro", vbExclamation, "EXCELeINFO"

Else

'En caso contrario, abrimos el formulario de edición de registros

frmModificar.Show

End If

End Sub

Private Sub Eliminar_Click()

'Confirmamos que queremos eliminar el registro

Pregunta = MsgBox("Está seguro de eliminar el registro?", vbYesNo + vbQuestion, "EXCELeINFO")

'En caso afirmativo, borramos el registro completo

If Pregunta <> vbNo Then

ActiveCell.EntireRow.Delete

End If

'Volvemos a abrir el formulario de búsqueda

Call Filtrar_Click

End Sub

Private Sub ListBox1_Click()

'Activamos la celda del registro elegido

Range("a2").Activate

Cuenta = Me.ListBox1.ListCount

Set Rango = Range("A1").CurrentRegion

For i = 0 To Cuenta - 1

If Me.ListBox1.Selected(i) Then

Valor = Me.ListBox1.List(i)

Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate

End If

Next i

End Sub

Private Sub Cerrar_Click()

'Cerramos el formulario

Unload Me

End Sub

3. Formulario de edición

Private Sub UserForm_Initialize()

'Cargamos los campos del formulario con los del registro seleccionado

For i = 1 To 4

Me.Controls("TextBox" & i).Value = ActiveCell.Offset(0, i - 1).Value

Next i

End Sub

Private Sub Modificar_Click()

'Actualizamos el registro

For i = 1 To 4

ActiveCell.Offset(0, i - 1).Value = Me.Controls("TextBox" & i).Value

Next i

Unload Me

End Sub

Private Sub Cancelar_Click()

'Cerramos el formulario

Unload Me

End Sub

4. Formulario de Menú

Private Sub Alta_Click()

'Abrimos el formulario de alta

frmAlta.Show

End Sub

Private Sub Buscar_Click()

'Abrimos el formulario de búsqueda

frmBuscar.Show

End Sub

Private Sub Salir_Click()

'Cerramos el formulario

Unload Me

End Sub

Espero que te haya quedado claro el ejemplo y te sirva para realizar tus formularios y ListBox en Microsoft Excel. Descarga el archivo de ejemplo y practica.

Por último, quiero invitarte a compartir tus dudas en los comentarios o en el foro. Intentaré ayudarte en todo lo que pueda, y así aprenderemos todos.

Hasta la próxima.

Si te ha servido y quieres donar

Descarga el archivo del ejemplo

2 Comentarios

  1. Avatar

    Muchas felicidades!! Excelente ejemplo claro y entendible.

    Dios te bendiga amigo.

    Javier D.L.
    Culiacán México

    Responder
    • Avatar

      Gracias Javier por tu comentario.

      Por aquí ando para lo que necesites.

      Saludos.

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Últimas publicaciones

Categorías

abril 2024
LMXJVSD
1234567
891011121314
15161718192021
22232425262728
2930 

Debates en el foro

Avatar
Buscar Datos en Columnas
Avatar
Formularios con ADO

Contacto