# Lista desplegable multiple



## oscar_igor (May 13, 2003)

Hola a todos:
Mi duda es la siguiente, tengo una lista desplegable la cual esta en un cuadro de dialogo y esta lista esta vinculada a un rango el cual me da como seleccion un numero determinado de clientes, la pregunta es ¿como hacer para que esta lista sea dinamica? el problema esta cuando son menos clientes en la lista aparece en blanco y cuando son mas obviamente no aparecen.
De antemano gracias


----------



## Juan Pablo González (May 13, 2003)

Cual es el rango actual donde están los clientes ? me imagino que no se dejan celdas en blanco, cierto ?


----------



## oscar_igor (May 14, 2003)

el rango actual es a1:a50 el siguiente mes es a1:a60 y el pasado mes fue de a1:a45, como comentaba en este ultimo caso no se ingresan valores pero como el rango esta seleccionado aprecen los datos en blanco y eln el primer mes faltan de incluir.
Saludos


----------



## Juan Pablo González (May 14, 2003)

Bueno, lo siguiente parece funcionar bien.

Asumiendo que el nombre del rango es *MiRango*, se debe cambiar la definición así:

=Hoja1!$A$1:INDICE(Hoja1!$A:$A,COINCIDIR(REPETIR("z",255),Hoja1!$A:$A))

Asumo que la hoja donde están los datos es Hoja1.

Bueno, ahora si el ComboBox ya está "amarrado" a MiRango, ya debería estar funcionando todo...


----------



## oscar_igor (May 14, 2003)

Perfecto!!!!!!!!!!!!!!!
El error estaba en que el rango es el que era variable.
Mil gracias nuevamente.
Saludos
 :D


----------



## Osasa54 (May 17, 2003)

Hola, he estado intentando aplicar la solucion de este post, ya que tengo un problema similar, pero no consigo saber como se hace exactamente. Podrías detallarmelo un poco mas?  

Muchas gracias


----------



## scano (May 20, 2003)

Esto es lo que analicé, ojalá te sirva para comprender la formula y donde ponerla:

La lista está en un cuadro de diálogo (formulario entiendo)
La lista tiene la propiedad RowSource vinculada a MiRango

Lo siguiente es suposición mía: debe asignarse el resultado de la fórmula a la variable MiRango para que cada vez que se ejecute el formulario reajuste el tamaño del rango.

Mis limitados conocimientos no me permiten aconsejarte en que parte del formulario poner el código. Ojalá Juan Pablo nos pueda orientar.

Lo que sigue es el desgloce de las fórmulas que empleó, cabe señalar que aún no entiendo cómo es que funciona REPETIR(), aunque ya lo vi funcionar.

MiRango = Hoja1!$A$1:INDICE(Hoja1!$A:$A,COINCIDIR(REPETIR("z",255),Hoja1!$A:$A)) 

INDICE(matriz,num_fila,num_columna)
COINCIDIR(valor_buscado,matriz_buscada)
REPETIR(texto,num_de_veces)

-*- Escribe esto en una celda 

     =COINCIDIR(REPETIR("z",255),Hoja1!$A:$A)
Y ve funcionar esta parte de la formula al rellenar la columna A con cualquieras letras, el resultado es el numero del último renglon ocupado OJO: SOLO FUNCIONA CON LETRAS, NO CON NUMEROS.


----------



## Juan Pablo González (May 20, 2003)

Hola, lo siento... se me había olvidado responder :P

Bueno, a ver si esto nos sirve:

Primero, en un libro nuevo, tengo una hoja, Hoja1, con una lista de nombres, que es la que utilizaré.

En A1 de esa hoja pongo el título (Solo por ponerlo !), *Nombres*.  En A2, y hacia abajo, comienzo a poner los nombres que me interesan:

Juan
Pablo
Alberto
Natalia
Monica
etc.

Esta lista es la que será "dinámica", es decir, añadiré (Y borraré) nombres más adelante, por lo que la lista tiene que ser "inteligente"...

Presiono Ctrl F3, para abrir el diálogo de Definir Nombre.  Ahí, pongo *MiRango* como el nombre, y en "Se refiere a:" la fórmula

=Hoja1!$A$2:INDICE(Hoja1!$A:$A, COINCIDIR(REPETIR("z", 255), Hoja1!$A:$A))

¿qué hace esta fórmula? bueno, crea un rango así, desde Hoja1!A2 (Que es el primer nombre), hasta el último texto que se encuentre en la columna A.  Esto se hace con el INDICE(COINCIDIR()) así:

REPETIR("z", 255) es, alfabéticamente, el texto "más" grande que se puede tener, así que 

COINCIDIR(textomuygrande, Hoja1!A:A)

me devuelve su ubicación dentro de la columna A.  Para números se utiliza

9.9999999999999E+307

en vez de REPETIR(), porque es el número más grande que se puede tener en Excel.

Como COINCIDIR me devuelve el número de la FILA donde está el texto, utilizo INDICE para que me cree una "referencia" hacia esa celda... mejor dicho, la función INDICE no devuelve un valor, sino que devuelve un Rango ! por eso puedo utilizarlo así:

=INDICE(...):INDICE(...)

o como en este caso, desde una posición conocida hasta la desconocida:

=A1:INDICE(...)

Listo, después de hacer clic en "Agregar", tenemos nuestro rango dinámico creado.

Ahora, vamos a crear el formulario (Userform).  Presionamos Alt + F11 para ir al editor de Visual Basic (VBE en Inglés).  Ahí, vamos a Insertar | Userform

Nos sale un Userform vacío.  Ahora, ahí, vamos a agregar un ComboBox, este tendrá el nombre *ComboBox1* que es el que se le asigna por defecto...

Con este ComboBox seleccionado, presionamos F4, para que nos aparezca la ventana de propiedades.  Ahí hay una propiedad que se llama *RowSource* que es un string (texto) que corresponde a la ubicación donde están los datos que aparecerán en el ComboBox.  Como nuestra lista está en el rango *MiRango*, escribimos 'MiRango' sin las comillas ahí.

Listo, ahora hacemos un click en el Userform para activarlo, y presionamos F5 para "ejecutar" el formulario y verlo "funcionando".  Ahí debe aparecer el combobox, inicialmente vacío, pero si se hace clic en la flecha para mostrar las opciones, deben aparecer todos los nombres que tenemos en la lista.

Para cerrar el formulario se debe hacer click en la "x".  Si se quiere, agreguen o borren nombres a la lista y ejecuten nuevamente el Userform, para ver que funcione...

Saludos !


----------



## scano (May 22, 2003)

Gracias Juan Pablo ary: 

Encontré especialmente útil la parte de cómo implementarlo con números, verás, en mi trabajo se manejan grupos de cuentas bancarias que totalizan 1400 y diariamente varía en número por las cancelaciones y nuevas aperturas, ahora con algunos arreglos puedo ayudar a facilitar su administración.

Por cierto que Oscar_Igor fue tan amable de contestarme un mensaje y me proporcionó copia de su archivo como lo implementó. 

Mi gratitud para los dos.


----------

