jueves, 11 de enero de 2018

VBA: Limitar elementos de un ComboBox a la lista cargada

Se trata hoy de limitar qué elementos podemos insertar en un ComboBox dentro del contexto de formulario de usuario, para evitar incluir elementos fuera de la lista permitida.

Para mostrar estas propiedades ejercitaremos un ejemplo de búsqueda de datos desde un Userform.
Tenemos un listado de datos en A1:D19, con campos ID, Fecha, Concepto e Importe.
A partir del ID en un ComboBox rellenaremos tres TextBox.
Lo importante es que queremos controlar que el ComboBox asociado al ID se rellena solo con los datos habilitados.


Nuestros datos en la hoja de cálculo:

VBA: Limitar elementos de un ComboBox a la lista cargada



Por otro lado insertaremos un UserForm en nuestro proyecto, con
1- cuatro etiquetas - label,
2- tres TextBox:
txtFecha
txtConcepto
txtImporte
3- un CommandButton
cmdSalir
4- un ComboBox
cmbID

VBA: Limitar elementos de un ComboBox a la lista cargada



Lo importante será las propiedades del ComboBox a tocar para conseguir nuestro objetivo:
.MatchRequired = True
.Style = 2-fmStyleDropDownList
Modificando estas dos propiedades conjuntamente (recomendado) conseguimos la meta, y nos será imposible introducir un elemento fuera de los listados...

Estas propiedades del Combobox las podemos ajustar desde la ventana de propiedades del Control, o bien desde la programación, como se puede ver a continuación

En la ventana de código del UserForm incluimos:

Private Sub UserForm_Initialize()
'ajustamos propiedades para evitar introducir elementos fuera de la lista mostrada
Me.cmbID.MatchRequired = True
Me.cmbID.Style = fmStyleDropDownList
'cargamos los elementos del rango A2:A19
Me.cmbID.RowSource = "A2:A19"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmbID_Change()
'limpia los campos informados
Me.txtFecha.Value = ""
Me.txtConcepto.Value = ""
Me.txtImporte.Value = ""

'gestiona la búsqueda del ID deseado
Dim fila As Long
fila = Range("A2:A19").Find(what:=Me.cmbID.Value).Row

'carga los TextBox con valores de la lista...
Me.txtFecha.Value = CDate(Cells(fila, "B").Value)
Me.txtConcepto.Value = CStr(Cells(fila, "C").Value)
Me.txtImporte.Value = Format(CDbl(Cells(fila, "D").Value), "#,##0")

End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdSalir_Click()
'descarga y cierra el UserForm
Unload Me
End Sub



El resultado es el esperado... se nos hace imposible meter valores en el ComboBox distintos de los listados...

2 comentarios:

  1. Excelente Ismael, explicación muy clara, lo aplicaré en una pequeña APP que estoy realizando.

    ResponderEliminar
    Respuestas
    1. ;-)
      gracias!
      me alegro te haya sido de utilidad

      Eliminar