domingo, 12 de diciembre de 2021

VBA EXCEL 2022: LLENAR COMBOBOX DINAMICO CON DATOS UNICOS DE UNA TABLA

(LOS DATOS NO SE REPITEN E IGNORA CELDAS VACIAS)



Con este código podremos llenar un cuadro combinado (combobox) con DATOS UNICOS, es decir, que NO SE REPITEN, a partir de los datos de una tabla. La principal ventaja de éste metodo, es que, dadas las caracteristicas de las tablas de Excel, al escribir un dato en la primera fila vacia inmediatamente bajo nuestra tabla, esta se ampliara automaticamente y recojera este dato como propio. Al ampliarse la tabla, nuestro combobox obtendrá un nuevo dato de forma dinamica. 

ANTES: Nuestro libro de excel debe estar habilitada para ejecutar macros, es decir, con la extención .xlsm y nuestra pestaña de programador debe estar en modo diseño para que podamos escribir código y editar los objetos que vamos a utilizar.


PASO 1Creamos una tabla de datos (dando formato de tabla con escabezados). En diseño de tabla, parte superior izquierda, cambiamos el nombre a nuestra tabla que por defecto es Tabla1. Asignamos el nombre; en este caso "TABLADEDATOS" y luego comprobamos que el nombre esté creado accediendo a Formulas y administrador de nombres.

Cambiar nombre de la tabla

Administrador de nombres


PASO 2Creamos un botón de comando(commandbutton) en una de nuestras hojas, y tambien creamos un formulario. Hacemos doble clic sobre el botón de comando y escribimos lo siguiente:

Private Sub CommandButton1_Click()

UserForm1.Show

End Sub

Con esto mostraremos el formulario al hacer clic en el botón de comando.


PASO 3: En el formulario creamos un cuadro combinado (combobox). Creamos también una etiqueta (label) para describír qué datos nos mostrará el cuadro combinado. En este caso, queremos mostrar los datos de la columna "NOMBRES" de nuestra tabla.



PASO 4: Hacemos doble click en el formulario y escribimos lo siguiente:

Private Sub UserForm_Initialize() 
 
Dim Dictionary As Object
Set Dictionary = CreateObject("Scripting.Dictionary")
    
For Each Cell In Sheets("Hoja1").ListObjects("TABLADEDATOS").ListColumns(1).DataBodyRange
If Dictionary.exists(Cell.Value) Or IsEmpty(Cell.Value) Then
Else
Dictionary.Add Cell.Value, Empty
ComboBox1.AddItem Cell.Value
End If
Next Cell

End Sub

Declaramos y creamos un objeto de tipo diccionario llamado Dictionary. Situándonos en la "Hoja1", por cada celda en la columna "1" de nuestro objeto "TABLADEDATOS" , si el valor de la celda existe en el diccionario, o bien, está vacío, no haremos nada; de lo contrario, añadiremos un elemento al diccionario. El elemento es un par de datos y está compuesto por  una llave y su valor. La llave sería el valor de la celda y su valor, en este caso, estaría vacío. Finalmente añadimos tambien el valor de la celda al combobox.

COMENTARIO
  • Las llaves y valores del diccionario para este ejemplo serían los siguientes:
  • Si cambiamos el valor de Empty por un String, ejemplo: "None", quedarían de la siguiente forma:
  • Si cambiamos el valor de Empty por Cell.Offset(0,1), tomaría el valor de la celda que está en la misma fila, pero una columna hacia la derecha), quedando de la siguiente forma:
  • Si cambiamos el valor de Empty por Dictionary.count + 1, quedarían de la siguiente forma:


PASO 5: Ejecutar





LINK DE DESCARGA

No hay comentarios.:

Publicar un comentario