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?
En primer lugar, abrimos el editor de Visual Basic. En la barra de menú, elegimos Insertar > Userform. Se abrirá una ventana como la siguiente,
1. Formulario de alta
'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
'Cerramos el formulario
Unload Me
End Sub
2. Formulario de búsqueda
'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
'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
'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
'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
'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
'Cerramos el formulario
Unload Me
End Sub
3. Formulario de edición
'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
'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
'Cerramos el formulario
Unload Me
End Sub
4. Formulario de Menú
'Abrimos el formulario de alta
frmAlta.Show
End Sub
'Abrimos el formulario de búsqueda
frmBuscar.Show
End Sub
'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
Enviar un comentario
Últimas publicaciones
Muchas felicidades!! Excelente ejemplo claro y entendible.
Dios te bendiga amigo.
Javier D.L.
Culiacán México
Gracias Javier por tu comentario.
Por aquí ando para lo que necesites.
Saludos.