a vueltas con rangos dinamicos

08/08/2003 - 21:16 por César | Informe spam
Hola grupo
el otro día cerré en falso mi problema con los rangos dinámicos:

necesito rellenar un combobox, de dos columnas, con los datos de un rango
dinámico. Según he descubierto, hay dos maneras basicamente de crear un
rango dinámico, una la que yo mismo propuse y la otra es mediante la
definición de un nombre de rango, usando DESREF Y CONTAR (gracias, Adolfo
Fernández).

El problema es que me gustaría poder utilizar 'autofiltro' con la tabla
donde tengo los datos, pero compruebo que aunque no se muestren ciertas
filas, no por ello dejan de existir. Con la solución que me propuso
Adolfo, es como no usar el filtro. Con la rutina que escribí, me pasan
cosas extrañas, sobre todo si filtro más de una columna, pero casi nunca
coincide lo que aparece en el combo con lo que aparece en la hoja donde
tengo los datos.

Además, la solución de DESREF ... no he conseguido que me llene un combo
de dos o más columnas, sólo con una me funciona.

¿alguna idea?

Preguntas similare

Leer las respuestas

#1 juanca
09/08/2003 - 01:08 | Informe spam
Disculpa Cesar no poder contestar tu pregunta sino que
aprovecho para hacerte otra.
Como asignas a un combo un rango dinamico(aunque sea una
sola fila), yo defino el nombre del rango y despues en la
propiedad ListFillRange del combo indico el nombre pero no
me lo acepta.
Como se logra?
Gracias

Hola grupo
el otro día cerré en falso mi problema con los rangos


dinámicos:

necesito rellenar un combobox, de dos columnas, con los


datos de un rango
dinámico. Según he descubierto, hay dos maneras


basicamente de crear un
rango dinámico, una la que yo mismo propuse y la otra es


mediante la
definición de un nombre de rango, usando DESREF Y CONTAR


(gracias, Adolfo
Fernández).

El problema es que me gustaría poder


utilizar 'autofiltro' con la tabla
donde tengo los datos, pero compruebo que aunque no se


muestren ciertas
filas, no por ello dejan de existir. Con la solución que


me propuso
Adolfo, es como no usar el filtro. Con la rutina que


escribí, me pasan
cosas extrañas, sobre todo si filtro más de una columna,


pero casi nunca
coincide lo que aparece en el combo con lo que aparece en


la hoja donde
tengo los datos.

Además, la solución de DESREF ... no he conseguido que me


llene un combo
de dos o más columnas, sólo con una me funciona.

¿alguna idea?
.

Respuesta Responder a este mensaje
#2 César
09/08/2003 - 07:40 | Informe spam
"juanca" wrote in news:050e01c35e01$f211d8e0
$:

Disculpa Cesar no poder contestar tu pregunta sino que
aprovecho para hacerte otra.
Como asignas a un combo un rango dinamico(aunque sea una
sola fila), yo defino el nombre del rango y despues en la
propiedad ListFillRange del combo indico el nombre pero no
me lo acepta.
Como se logra?
Gracias





¿qué quieres decir que no te lo acepta? a mí me ha pasado alguna vez que
escibo el nombre del rango en el editor de propiedades, como tú dices, y
al pulsar la tecla ENTER, desaparece. Pensaba que sería por haber tocado
alguna otra cosa y lo he resuelto borrando el combo y poniendo otro nuevo
(a veces hasta una hoja nueva!). No se si te refieres a lo mismo, no te
puedo decir más.

Un saludo
Respuesta Responder a este mensaje
#3 Héctor Miguel
09/08/2003 - 08:28 | Informe spam
Hola, chicos !

juanca escribió en el mensaje
... como asignas a un combo un rango dinamico (aunque sea una sola fila),
... defino ... y ... en la propiedad ListFillRange del combo indico el nombre pero no me lo acepta.



==> Puedes hacerlo (al menos) de cuatro maneras (ya sea un rango dinamico o "estatico"):
-o- en el editor de vba / en la ventana de propiedades / introduce el nombre en la propiedad (ListFillRange)
-o- por codigo asignando el nombre del rango (a la misma propiedad "ListFillRange")
-o- por codigo (usando el nombre "como" matriz) asignando el nombre a la propiedad List
-o- por codigo, usando el metodo AddItem (a traves de un ciclo "For...Next")

César escribió en el mensahe
... rellenar un combobox, de dos columnas, con los datos de un rango dinámico ...
... poder utilizar 'autofiltro' ... donde tengo los datos, pero ... aunque no se muestren ciertas filas, no por ello dejan de




existir.
... la solución que me propuso Adolfo, es como no usar el filtro.
... la rutina ... cosas extrañas, sobre todo si filtro más de una columna ... casi nunca coincide ... el combo con ... la hoja




[...]
... la solución de DESREF ... no he conseguido que me llene un combo de dos o más columnas, sólo con una me funciona.





==> Si "interpreto" bien... lo que necesitas es que el listado del combo COINCIDA con la lista "filtrada" ???
La unica forma (que yo he encontrado) es usando AddItem para "ir agregando" filas, y List(Fila, Columna) para el "llenado"
("condicionando" cada "agregado" a si la fila NO esta oculta) :))

El ejemplo hara lo que necesitas, solo... ASEGURATE de que "se cumplan" los siguiente "requisitos" :((
a) La hoja con el autofiltro contiene AL MENOS una formula =>bastara con "una simple" suma< (la razon es que usaremos el evento _Calculate de "la hoja" y el accionar de los AutoFiltros NO lo "dispara")
=>Ademas, aun usando ListFillRange = Rango_con_nombre -o- List = Matriz ... los datos "quedan fijos"<= :((
b) El combo NO es "dependiente" (o AddItem NO "funcionara") =>deberas dejar "vacia" la propiedad ListFillRange< c) Las propiedades BoundColumn, ColumnCount y ColumnWidht son "apropiadas"
== en el modulo de eventos de la hoja con AutoFiltro =Private Sub Worksheet_Calculate()
Dim Celda As Range, Sig As Long
Me.ComboBox1.Clear
For Each Celda In Range(Range("a2"), Range("a65536").End(xlUp))
If Not Celda.EntireRow.Hidden Then
With Me.ComboBox1
.AddItem
.List(Sig, 0) = Celda
.List(Sig, 1) = Celda.Offset(, 1)
Sig = Sig + 1
End With
End If
Next
Me.ComboBox1.ListIndex = -1
End Sub
_______
Saludos,
Héctor.
MS-MVP
Respuesta Responder a este mensaje
#4 Héctor Miguel
09/08/2003 - 09:45 | Informe spam
Hola, César !

For Each Celda In Range(Range("a2"), Range("a65536").End(xlUp))
¿cómo modificar esta línea si los datos están en otra hoja? tengo el combo en hoja2 y el rango con los datos en hoja1.



==> Esa parte del codigo se debe quedar "tal cual" (solo modifica si es "otro" el rango =>"a2"."a65536"< y... el codigo va en el modulo de la hoja que contiene el listado Y el AutoFiltro <== OJO
La parte del codigo que se debe modificar es: la "referencia" a la ubicacion del Combo
== en un bloque With...End With (para que no lo tengas que "escribir" varias veces :)) =Private Sub Worksheet_Calculate()
Dim Celda As Range, Sig As Long
With Worksheets("Hoja2").ComboBox1
.Clear
For Each Celda In Range(Range("a2"), Range("a65536").End(xlUp))
If Not Celda.EntireRow.Hidden Then
.AddItem
.List(Sig, 0) = Celda
.List(Sig, 1) = Celda.Offset(, 1)
Sig = Sig + 1
End If
Next
.ListIndex = -1
End With
End Sub
_______
Saludos,
Héctor.
MS-MVP
Respuesta Responder a este mensaje
#5 César
09/08/2003 - 10:13 | Informe spam
eum... se me pasó comentar que en lugar de utilizar el evento calculate,
que me obliga a introducir una fórmula innecesaria utilizo el evento
Activate de la hoja donde tengo el combo. Así cada vez que el usuario
filtra o manipula los datos de origen de cualquier manera, tiene
necesariamente que cambiar de hoja para ver el combo. Eso dispara el evento
Activate que lanza el código, sin necesidad de recurrir a artificios como
el de la fórmula.

Personalmente creo que es una solución más elegante, pero para gustos se
hicieron los colores.

Para hacerlo 'a mi manera' creo que si necesito modificar esa línea ¿no?

gracias por cada aportación, entre lo que encuentro en google y la
realimentación que obtengo aquí no sabeís cuánto estoy avanzando :)
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida