Cómo seleccionar y deseleccionar un elemento en un cuadro de lista
Estaba trabajando en un proyecto para una organización benéfica que apoyo libremente y quería configurar el formulario para que, de manera predeterminada, seleccionara un elemento particular en un cuadro de lista solo para simplificar la entrada de datos, ya que con un 95 % de probabilidad ese sería el valor deseado (un clic menos).
Ahora bien, sí, podría codificar un valor en una hoja de propiedades o mediante VBA, pero recordé haber hecho algo similar hace muchas lunas para otro cliente.
Entonces me puse a investigar y encontré una subrutina primitiva que había creado para este propósito.
Así que tomé eso y lo mejoré un poco, agregué mi encabezado y actualicé el controlador de errores, ¡et voilá!
Entonces, en caso de que alguno de ustedes tenga una necesidad similar de seleccionar o deseleccionar un elemento específico en un cuadro de lista, esta es mi función tal como está ahora.
'---------------------------------------------------------------------------------------
' Procedure : Listbox_SelectItem
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website :
' Purpose : Select/Deselect an item from a listbox
' Great for setting up default selections in forms
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
' (CC BY-SA 4.0) -
' Req'd Refs: None required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' oListbox : Listbox object (Me.ListboxName) to de/select the item in
' sListboxItem : Item to de/select
' lListboxColumn: Which column of the listbox to locate the item (sListboxItem)
' 0 based just like listbox columns
' bSelectItem : Whether to Select or Deselect the specified item
' True => Select the item
' False => Deselect the item
'
' Usage:
' ~~~~~~
' Select an item (default - found in the 1st column)
' Call Listbox_SelectItem(Me.lst_Status, "Certified", , True)
'
' Select an item found in the 3rd listbox column
' Call Listbox_SelectItem(Me.lst_Contacts, "Jones", 2, True)
'
' Deselect an item (default - found in the 1st column)
' Call Listbox_SelectItem(Me.lst_Status, "Testing", , False)
'
' Deselect an item found in the 2nd listbox column
' Call Listbox_SelectItem(Me.lst_Status, "Pending", 1, False)
'
' Revision History:
' Rev Date(yyyy-mm-dd) Description
' **************************************************************************************
' 1 Unknown Initial Release
' 2 2024-09-03 Added a procedure Header
' Updated the Error Handler
'---------------------------------------------------------------------------------------
Public Function Listbox_SelectItem(ByVal oListbox As Access.ListBox, _
ByVal sListboxItem As String, _
Optional lListboxColumn As Long = 0, _
Optional bSelectItem As Boolean = True) As Boolean
On Error GoTo Error_Handler
Dim lCounter As Long
With oListbox
For lCounter = 0 To .ListCount - 1
'If .ItemData(lCounter) = sListboxItem Then
If .Column(lListboxColumn, lCounter) = sListboxItem Then
.Selected(lCounter) = bSelectItem
Listbox_SelectItem = True 'If we're here the item was found and de/selected
End If
Next lCounter
End With
Error_Handler_Exit:
On Error Resume Next
Exit Function
Error_Handler:
MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
"Error Number: " & Err.Number & vbCrLf & _
"Error Source: Listbox_SelectItem" & vbCrLf & _
"Error Description: " & Err.Description & _
Switch(Erl = 0, "", Erl 0, vbCrLf & "Line No: " & Erl) _
, vbOKOnly + vbCritical, "An Error has Occurred!"
Resume Error_Handler_Exit
End Function
He intentado hacerlo flexible en el sentido de que no solo le dices a la función con qué cuadro de lista trabajar y qué elemento seleccionar o deseleccionar, sino que también tienes la opción de especificar en qué columna del cuadro de lista se encuentra el valor. Por lo tanto, si estás utilizando técnicas de normalización adecuadas, es decir, si tienes una columna de clave principal (probablemente oculta para el usuario) y luego otras columnas de datos, puedes seleccionar o deseleccionar en función de la columna de datos que elijas, si lo deseas. Si se omite el argumento, de forma predeterminada, simplemente busca en la primera columna del cuadro de lista.
Esto puede ser útil para establecer como predeterminado un elemento particular cuando se abre el formulario por primera vez, se crea un nuevo registro o quizás como reacción a otro cambio en el formulario.
Ojalá esto sea útil para algunos de ustedes.