miércoles, 18 de julio de 2018

VBA: Mostrar segunda columna en Combobox

Hoy toca responder a la cuestión de un usuario que preguntaba por la manera de que su ComboBox reflejara el elemento correspondiente a la segunda columna de las dos que mostraba (Nombre + Apellido)... pero además el dato que quería almacenar era el de la primera !!

Para conseguir esta , aparentemente fácil tarea:
1-mostrar el valor de la segunda columna en el ComboBox (el apellido)
2-registrar el valor de la primera columna (Nombre)

debemos configurar tres propiedades del ComboBox:
.BoundColumn = 1
.ColumnCount = 2
.TextColumn = 2


En particular es relevante la tercera .TextColumn que de acuerdo a la biblioteca MSDN:
Los valores para la propiedad .TextColumn van de -1 al número de columnas de la lista (de -1 a 2 en nuestro ejemplo).
Por tanto, el valor de .TextColumn para la primera columna es 1, el valor de la segunda columna es 2 y así sucesivamente.
Al establecer TextColumn a 0 muestra los valores de ListIndex . Al establecer TextColumn a -1 muestra la primera columna que tiene un valor de ColumnWidths mayor que 0.

Cuando el usuario selecciona una fila de un ComboBox, la columna que se hace referencia en TextColumn se almacena en la propiedad Text .
Por ejemplo, estableceremos para nuestro ejercicio un control ComboBox que contiene los nombres en una columna y los apellidos en una segunda columna. Para presentar los Apellidos, especificaríamos la segunda columna como .TextColumn... y para almacenar los Nombres la primera columna como .BoundColumn.

Cuando la propiedad .Text de un ComboBox cambia (cuando el usuario escribe una entrada en el control), el nuevo texto se compara con la columna de datos especificadas por .TextColumn.


Conseguiremos con la programación que sigue mostrar ambos campos: Nombre y Apellido con la propiedad .ColumnCount = 2:

VBA: Mostrar segunda columna en Combobox



Y finalmente se mostrará solo el Apellido (segunda columna) pero registraremos el Nombre (primera columna)

VBA: Mostrar segunda columna en Combobox



Este último paso es posible a la combinación de .TextColumn=2 y .BoundColumn=1 con otras partes del código (por ejemplo, el uso de .Text)

Vamos con el código.
Insertaremos los siguientes eventos asociados al UserForm que tiene únicamente un ComboBox como control:

Private Sub UserForm_Initialize()
'MUY IMPORTANTE esta configuración!!!
With Me.ComboBox1
    .BoundColumn = 1
    .ColumnCount = 2
    .TextColumn = 2     'esta propiedad en particular...
End With

'También se puede emplear la propiedad .RowSource para rellenar el Comobobox
'Me.ComboBox1.RowSource = "TblNombres"
'o con un bucle...
For Each cNombre In Range("TblNombres[Nombre]")
  With Me.ComboBox1
    .AddItem cNombre.Value
    .List(.ListCount - 1, 1) = cNombre.Offset(0, 1).Value
  End With
Next cNombre
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub ComboBox1_Click()
'completamos  el valor que se verá al clicar...
With ComboBox1
    .Text = .List(.ListIndex, 1)       'se podría omitir...
    
    'trasladamos a la hoja de cálculo el dato de la primera columna (Nombre)
    Range("E1").Value = .List(.ListIndex, 0)        'también vale   .Value
End With

End Sub



Listo... puedes probar y verificar el correcto funcionamiento...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.