Lista desplegable

28/09/2004 - 13:59 por Lorenzo | Informe spam
Buenos Dias.

Me gustaria saber se hay forma de en los dos (por favor, en los dos) tipos
de controles de lista desplegable que tiene excel (el de formularios y el de
controles) se puede asignar el contenido de dicha lista a una serie de
valores dependiendo del valor de una celda adyacente a cada uno de los
valores a mostrar. Me explico un poco mejor ...

Familia Descripcion
1 Articulo 1 Familia 1
1 Articulo 2 Familia 1
2 Articulo 1 Familia 2
2 Articulo 2 Familia 2

Tengo dos controles, uno para la familia 1 y otro para la familia 2 y quiero
que en sus valores solo aparezcan los que correspondan a cada familia. Los
valores aumentan y disminuyen constantemente, por lo que no puedo limitar el
valor a un rango ni asignar un nombre ... ¿se os ocurre algo?.

Me gustaria una solucion para ambos tipos de controles (si, ya se vaya
morro), pues uso de ambos tipos de controles por las caracteristicas de
personalizacion que tienen cada uno.

Gracias a todos por vuestra ayuda.-

Lorenzo / Malaga / España

Preguntas similare

Leer las respuestas

#1 Fernando Arroyo
28/09/2004 - 17:03 | Informe spam
Si los datos están ordenados por la columna 'Familia', y suponiendo que los cuadros combinados de la barra 'Cuadro de controles' se llamaran CCFamilia1 y CCFamilia2, y los de la barra 'Formularios' se llamaran FormFamilia1 y FormFamilia2, el código podría ser:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And Target.Cells.Count = 1 Then
CCFamilia1.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
CCFamilia2.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
Shapes("FormFamilia1").ControlFormat.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
Shapes("FormFamilia2").ControlFormat.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
End If
End Sub


Dicho código tendría que ir en el módulo de la hoja (click derecho sobre su etiqueta->Ver código)
Un saludo.


Fernando Arroyo
MS MVP - Excel


"Lorenzo" escribió en el mensaje news:%
Buenos Dias.

Me gustaria saber se hay forma de en los dos (por favor, en los dos) tipos
de controles de lista desplegable que tiene excel (el de formularios y el de
controles) se puede asignar el contenido de dicha lista a una serie de
valores dependiendo del valor de una celda adyacente a cada uno de los
valores a mostrar. Me explico un poco mejor ...

Familia Descripcion
1 Articulo 1 Familia 1
1 Articulo 2 Familia 1
2 Articulo 1 Familia 2
2 Articulo 2 Familia 2

Tengo dos controles, uno para la familia 1 y otro para la familia 2 y quiero
que en sus valores solo aparezcan los que correspondan a cada familia. Los
valores aumentan y disminuyen constantemente, por lo que no puedo limitar el
valor a un rango ni asignar un nombre ... ¿se os ocurre algo?.

Me gustaria una solucion para ambos tipos de controles (si, ya se vaya
morro), pues uso de ambos tipos de controles por las caracteristicas de
personalizacion que tienen cada uno.

Gracias a todos por vuestra ayuda.-

Lorenzo / Malaga / España



Respuesta Responder a este mensaje
#2 Fernando Arroyo
28/09/2004 - 17:12 | Informe spam
O, más rápido porque son tres pasos menos:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And Target.Cells.Count = 1 Then
CCFamilia1.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
CCFamilia2.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
Shapes("FormFamilia1").ControlFormat.ListFillRange = CCFamilia1.ListFillRange
Shapes("FormFamilia2").ControlFormat.ListFillRange = CCFamilia2.ListFillRange
End If
End Sub



"Fernando Arroyo" escribió en el mensaje news:
Si los datos están ordenados por la columna 'Familia', y suponiendo que los cuadros combinados de la barra 'Cuadro de controles' se llamaran CCFamilia1 y CCFamilia2, y los de la barra 'Formularios' se llamaran FormFamilia1 y FormFamilia2, el código podría ser:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And Target.Cells.Count = 1 Then
CCFamilia1.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
CCFamilia2.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
Shapes("FormFamilia1").ControlFormat.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
Shapes("FormFamilia2").ControlFormat.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
End If
End Sub


Dicho código tendría que ir en el módulo de la hoja (click derecho sobre su etiqueta->Ver código)
Un saludo.


Fernando Arroyo
MS MVP - Excel


"Lorenzo" escribió en el mensaje news:%
Buenos Dias.

Me gustaria saber se hay forma de en los dos (por favor, en los dos) tipos
de controles de lista desplegable que tiene excel (el de formularios y el de
controles) se puede asignar el contenido de dicha lista a una serie de
valores dependiendo del valor de una celda adyacente a cada uno de los
valores a mostrar. Me explico un poco mejor ...

Familia Descripcion
1 Articulo 1 Familia 1
1 Articulo 2 Familia 1
2 Articulo 1 Familia 2
2 Articulo 2 Familia 2

Tengo dos controles, uno para la familia 1 y otro para la familia 2 y quiero
que en sus valores solo aparezcan los que correspondan a cada familia. Los
valores aumentan y disminuyen constantemente, por lo que no puedo limitar el
valor a un rango ni asignar un nombre ... ¿se os ocurre algo?.

Me gustaria una solucion para ambos tipos de controles (si, ya se vaya
morro), pues uso de ambos tipos de controles por las caracteristicas de
personalizacion que tienen cada uno.

Gracias a todos por vuestra ayuda.-

Lorenzo / Malaga / España



Respuesta Responder a este mensaje
#3 Lorenzo
28/09/2004 - 18:34 | Informe spam
Gracias Fernando.

Hay alguna forma de hacerlo sin que esten ordenados los datos por familia ??
Me refiero a algun tipo de ListFillRange = ListFillRange + (Valor proxima
linea de la celda de familia es la correcta) o algo por el estilo, es decir,
ir rellenando el valor del desplegable con los valores correspondientes en
una pasada rapida sobre la hoja por codigo ...

Gracias.-

"Fernando Arroyo" escribió en el mensaje
news:
O, más rápido porque son tres pasos menos:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And
Target.Cells.Count = 1 Then
CCFamilia1.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
CCFamilia2.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" &
[CountA(A:A)]
Shapes("FormFamilia1").ControlFormat.ListFillRange CCFamilia1.ListFillRange
Shapes("FormFamilia2").ControlFormat.ListFillRange CCFamilia2.ListFillRange
End If
End Sub



"Fernando Arroyo" escribió en el mensaje
news:
Si los datos están ordenados por la columna 'Familia', y suponiendo que los
cuadros combinados de la barra 'Cuadro de controles' se llamaran CCFamilia1
y CCFamilia2, y los de la barra 'Formularios' se llamaran FormFamilia1 y
FormFamilia2, el código podría ser:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And
Target.Cells.Count = 1 Then
CCFamilia1.ListFillRange = "²:B" & [Match(2, A:A, 0)] - 1
CCFamilia2.ListFillRange = "=B" & [Match(2, A:A, 0)] & ":B" &
[CountA(A:A)]
Shapes("FormFamilia1").ControlFormat.ListFillRange = "²:B" &
[Match(2, A:A, 0)] - 1
Shapes("FormFamilia2").ControlFormat.ListFillRange = "=B" &
[Match(2, A:A, 0)] & ":B" & [CountA(A:A)]
End If
End Sub


Dicho código tendría que ir en el módulo de la hoja (click derecho sobre su
etiqueta->Ver código)
Un saludo.


Fernando Arroyo
MS MVP - Excel


"Lorenzo" escribió en el mensaje
news:%
Buenos Dias.

Me gustaria saber se hay forma de en los dos (por favor, en los dos) tipos
de controles de lista desplegable que tiene excel (el de formularios y el


de
controles) se puede asignar el contenido de dicha lista a una serie de
valores dependiendo del valor de una celda adyacente a cada uno de los
valores a mostrar. Me explico un poco mejor ...

Familia Descripcion
1 Articulo 1 Familia 1
1 Articulo 2 Familia 1
2 Articulo 1 Familia 2
2 Articulo 2 Familia 2

Tengo dos controles, uno para la familia 1 y otro para la familia 2 y


quiero
que en sus valores solo aparezcan los que correspondan a cada familia. Los
valores aumentan y disminuyen constantemente, por lo que no puedo limitar


el
valor a un rango ni asignar un nombre ... ¿se os ocurre algo?.

Me gustaria una solucion para ambos tipos de controles (si, ya se


vaya
morro), pues uso de ambos tipos de controles por las caracteristicas de
personalizacion que tienen cada uno.

Gracias a todos por vuestra ayuda.-

Lorenzo / Malaga / España



Respuesta Responder a este mensaje
#4 Fernando Arroyo
29/09/2004 - 12:20 | Informe spam
La propiedad ListFillRange no admite, que yo sepa, rangos múltiples.

Sí sería posible, sin embargo, cargar los cuadros combinados desde VBA usando su método AddItem, pero esto, en principio, no parece tener demasiado sentido en el caso de los cuadros combinados creados desde la barra de herramientas 'Formularios', porque dichos cuadros combinados devuelven el número del elemento seleccionado en la lista, y al estar dichos elementos dispersos por la columna A el número obtenido no tendría por qué corresponder a la fila en que dicho elemento se encuentra realmente.

En cualquier caso, he aquí el código:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And Target.Cells.Count = 1 Then

Dim n As Long

'Eliminar los rangos de la propiedad ListFillRange (sólo es necesario hacerlo una vez)
CCFamilia1.ListFillRange = ""
CCFamilia2.ListFillRange = ""
Shapes("FormFamilia1").ControlFormat.ListFillRange = ""
Shapes("FormFamilia2").ControlFormat.ListFillRange = ""

'Borrar el contenido de los cuadros combinados
CCFamilia1.Clear
CCFamilia2.Clear
Shapes("FormFamilia1").ControlFormat.RemoveAllItems
Shapes("FormFamilia2").ControlFormat.RemoveAllItems

'Llenar los cuadros combinados
For n = 2 To [A65536].End(xlUp).Row
If Cells(n, 1) = 1 Then
CCFamilia1.AddItem Cells(n, 2)
Shapes("FormFamilia1").ControlFormat.AddItem Cells(n, 2)
ElseIf Cells(n, 1) = 2 Then
CCFamilia2.AddItem Cells(n, 2)
Shapes("FormFamilia2").ControlFormat.AddItem Cells(n, 2)
End If
Next n

End If
End Sub


Las cuatro instrucciones después del comentario "Eliminar los rangos..." etc. puedes quitarlas después de la primera ejecución del código (junto con el propio comentario), pero es necesario ejecutarlas al menos una vez porque si no el resto del código no funcionará (a menos que entres en las propiedades de cada control y borres los rangos establecidos antes).
Un saludo.


Fernando Arroyo
MS MVP - Excel

"Lorenzo" escribió en el mensaje news:
Gracias Fernando.

Hay alguna forma de hacerlo sin que esten ordenados los datos por familia ??
Me refiero a algun tipo de ListFillRange = ListFillRange + (Valor proxima
linea de la celda de familia es la correcta) o algo por el estilo, es decir,
ir rellenando el valor del desplegable con los valores correspondientes en
una pasada rapida sobre la hoja por codigo ...

Gracias.-

Respuesta Responder a este mensaje
#5 Lorenzo
01/10/2004 - 17:37 | Informe spam
Muchisimas Gracias Fernando.

No habia podido conectar hasta hoy, pero es impresionante el nivelazo que
hay en el foro y por supuesto, como no, las ganas de ayudar a gente como yo
que esta aprendiendo.

Gracias de nuevo.

"Fernando Arroyo" escribió en el mensaje
news:
La propiedad ListFillRange no admite, que yo sepa, rangos múltiples.

Sí sería posible, sin embargo, cargar los cuadros combinados desde VBA
usando su método AddItem, pero esto, en principio, no parece tener demasiado
sentido en el caso de los cuadros combinados creados desde la barra de
herramientas 'Formularios', porque dichos cuadros combinados devuelven el
número del elemento seleccionado en la lista, y al estar dichos elementos
dispersos por la columna A el número obtenido no tendría por qué
corresponder a la fila en que dicho elemento se encuentra realmente.

En cualquier caso, he aquí el código:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, [A:A]) Is Nothing And
Target.Cells.Count = 1 Then

Dim n As Long

'Eliminar los rangos de la propiedad ListFillRange (sólo es
necesario hacerlo una vez)
CCFamilia1.ListFillRange = ""
CCFamilia2.ListFillRange = ""
Shapes("FormFamilia1").ControlFormat.ListFillRange = ""
Shapes("FormFamilia2").ControlFormat.ListFillRange = ""

'Borrar el contenido de los cuadros combinados
CCFamilia1.Clear
CCFamilia2.Clear
Shapes("FormFamilia1").ControlFormat.RemoveAllItems
Shapes("FormFamilia2").ControlFormat.RemoveAllItems

'Llenar los cuadros combinados
For n = 2 To [A65536].End(xlUp).Row
If Cells(n, 1) = 1 Then
CCFamilia1.AddItem Cells(n, 2)
Shapes("FormFamilia1").ControlFormat.AddItem Cells(n, 2)
ElseIf Cells(n, 1) = 2 Then
CCFamilia2.AddItem Cells(n, 2)
Shapes("FormFamilia2").ControlFormat.AddItem Cells(n, 2)
End If
Next n

End If
End Sub


Las cuatro instrucciones después del comentario "Eliminar los rangos..."
etc. puedes quitarlas después de la primera ejecución del código (junto con
el propio comentario), pero es necesario ejecutarlas al menos una vez porque
si no el resto del código no funcionará (a menos que entres en las
propiedades de cada control y borres los rangos establecidos antes).
Un saludo.


Fernando Arroyo
MS MVP - Excel

"Lorenzo" escribió en el mensaje
news:
Gracias Fernando.

Hay alguna forma de hacerlo sin que esten ordenados los datos por familia


??
Me refiero a algun tipo de ListFillRange = ListFillRange + (Valor proxima
linea de la celda de familia es la correcta) o algo por el estilo, es


decir,
ir rellenando el valor del desplegable con los valores correspondientes en
una pasada rapida sobre la hoja por codigo ...

Gracias.-

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida