ComboBox de 3 columnas

18/04/2006 - 17:22 por Maty | Informe spam
Estimados Señores:
Tengo un archivo Excel con 9 hojas, clasificadas así: 3 Verdes, 3 Azules y 3
Rojas, cada una de esas hojas contiene 4 rangos iguales pero, obviamente, con
datos diferentes.

Para ver la información que le interesa, el usuario debe seleccionar una
hoja y un rango, así el sistema le presenta el resultado en una hoja llamada
“Vistas”

Para lograr ese proceso, he diseñado un UserForm que contiene un ComboBox1
donde aparecen las 9 hojas organizadas en 3 columnas, y un ComboBox2 para
seleccionar uno de los 4 Rangos.

En términos de columnas los datos se presentan así en una hoja auxiliar:

VERDES AZULES ROJOS RANGOS
Verde1 Azul1 Roja1 Rango 1
Verde2 Azul2 Roja2 Rango 2
Verde3 Azul3 Roja3 Rango 3
Rango 4

La consulta concreta es: ¿Cómo se debería estructurar la “function
HojaElegida”, para seleccionar exactamente una de las 9 hojas, usando un
ComboBox?

La estructura de la “function HojaElegida”, funciona muy bien cuado se trata
de una sola columna, pero falla cuando se trata de 3 columnas.

Muchas gracias por su atención, Maty

A continuación presento todas las rutinas utilizadas para lograr ese proceso:

Option Explicit

Private Sub ComboBox1_Change() 'Seleccioina Hoja
End Sub

Private Sub ComboBox2_Change() 'Selecciona Rango
End Sub

Private Sub ComboBox4_Change()
End Sub

Private Sub CommandButton2_Click() 'Aceptar
CopiarRango
End Sub

Private Sub CommandButton3_Click() 'Salir
Sheets("Menú").Select
Range("A1").Select
Unload Me
End Sub

Private Function HojaElegida() As Object
Dim oRetorno As Object
Select Case ComboBox1.ListIndex
Case 0
Set oRetorno = Sheets("Verde1")
Case 1
Set oRetorno = Sheets("Verde2")
Case 2
Set oRetorno = Sheets("Verde3")
Case 3
Set oRetorno = Sheets("Azul1")
Case 4
Set oRetorno = Sheets("Azul2")
Case 5
Set oRetorno = Sheets("Azul3")
Case 6
Set oRetorno = Sheets("Rojo1")
Case 7
Set oRetorno = Sheets("Rojo2")
Case 8
Set oRetorno = Sheets("Rojo3")
End Select
Set HojaElegida = oRetorno
End Function

Private Function RangoElegido() As String
Select Case ComboBox2.ListIndex
Case 0
RangoElegido = "A1:B6"
Case 1
RangoElegido = "A8:B13"
Case 2
RangoElegido = "A15:B20"
Case 3
RangoElegido = "A22:B27"
End Select
End Function

Private Sub CopiarRango()
Dim oHoja As Object
Dim oRango As Range
Dim sRango As String
Dim Vistas As Object
Set oHoja = HojaElegida
sRango = RangoElegido
If (oHoja Is Nothing) Or (sRango = vbNullString) Then
MsgBox "Debe elegir la hoja y el rango"
Exit Sub
End If
Set oRango = oHoja.Range(sRango)
oRango.Copy
Sheets("Vistas").Activate
Sheets("Vistas").Range("A5").PasteSpecial
Sheets("Vistas").Range("A3").Value = oHoja.Name
Sheets("Vistas").Range("B3").Value = Me.ComboBox2
UserForm1.Hide
End Sub

Private Sub UserForm_Click()
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
20/04/2006 - 01:11 | Informe spam
hola, Maty !

1) [hasta donde se]... el uso de controles combobox y listbox -> de multiples columnas 'sirve' [o es utilizado]...
[principalmente] para mostrar datos que -> tienen relacion [en varias columnas] CON SU MISMA 'FILA' :-(
[p.e.] puedes 'ampliar' la informacion de un dato/fila en las siguientes columnas [pero] SIEMPRE de la misma fila ;)

2) si tu intencion [o necesidad] es que el usuario pueda 'diferenciar' la columna seleccionada [y no solo la fila]...
[me parece que] necesitaras 'mostrar' TODAS las opciones -> en una sola columna :-(
tal como esta el codigo de tu funcion HojaElegida ;)

3) [solo una 'sugerencia']... existe un tipo de datos 'especifico' para estableer referencias a objetos 'hoja de calculo'...
utiliza -> As Worksheet => en lugar de -> As Object

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

... 9 hojas... 3 Verdes, 3 Azules y 3 Rojas, cada una... contiene 4 rangos iguales... con datos diferentes.
Para ver la informacion que le interesa, el usuario debe seleccionar una hoja y un rango
asi el sistema le presenta el resultado en una hoja llamada 'Vistas'
... un UserForm... un ComboBox1... aparecen las 9 hojas organizadas en 3 columnas
... un ComboBox2 para seleccionar uno de los 4 Rangos.
... los datos se presentan asi en una hoja auxiliar:
VERDES AZULES ROJOS RANGOS
Verde1 Azul1 Roja1 Rango 1
Verde2 Azul2 Roja2 Rango 2
Verde3 Azul3 Roja3 Rango 3
Rango 4
... Como se deberia estructurar la function HojaElegida, para seleccionar exactamente una de las 9 hojas, usando un ComboBox?
... funciona muy bien cuado se trata de una sola columna, pero falla cuando se trata de 3 columnas.
Private Function HojaElegida() As Object
Dim oRetorno As Object
Select Case ComboBox1.ListIndex
Case 0
Set oRetorno = Sheets("Verde1")
Case 1
Set oRetorno = Sheets("Verde2")
Case 2
Set oRetorno = Sheets("Verde3")
Case 3
Set oRetorno = Sheets("Azul1")
Case 4
Set oRetorno = Sheets("Azul2")
Case 5
Set oRetorno = Sheets("Azul3")
Case 6
Set oRetorno = Sheets("Rojo1")
Case 7
Set oRetorno = Sheets("Rojo2")
Case 8
Set oRetorno = Sheets("Rojo3")
End Select
Set HojaElegida = oRetorno
End Function
Respuesta Responder a este mensaje
#2 Maty
20/04/2006 - 16:09 | Informe spam
Gracias Héctor:

Efectivamente, mi intención es que el usuario pueda 'diferenciar' la
columna seleccionada [y no solo la fila], quizas me convendría insertar 3
ComboBox en el fomulario, uno par cada columna y usar la estructura de la
función HojaElegida en cada caso.

Segiré tu sugerencia de utilizar -> As Worksheet => en lugar de -> As Object.

Si tengo problemas te cuento, y muchas gracias nuevamente,
Maty



"Héctor Miguel" escribió:

hola, Maty !

1) [hasta donde se]... el uso de controles combobox y listbox -> de multiples columnas 'sirve' [o es utilizado]...
[principalmente] para mostrar datos que -> tienen relacion [en varias columnas] CON SU MISMA 'FILA' :-(
[p.e.] puedes 'ampliar' la informacion de un dato/fila en las siguientes columnas [pero] SIEMPRE de la misma fila ;)

2) si tu intencion [o necesidad] es que el usuario pueda 'diferenciar' la columna seleccionada [y no solo la fila]...
[me parece que] necesitaras 'mostrar' TODAS las opciones -> en una sola columna :-(
tal como esta el codigo de tu funcion HojaElegida ;)

3) [solo una 'sugerencia']... existe un tipo de datos 'especifico' para estableer referencias a objetos 'hoja de calculo'...
utiliza -> As Worksheet => en lugar de -> As Object

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

> ... 9 hojas... 3 Verdes, 3 Azules y 3 Rojas, cada una... contiene 4 rangos iguales... con datos diferentes.
> Para ver la informacion que le interesa, el usuario debe seleccionar una hoja y un rango
> asi el sistema le presenta el resultado en una hoja llamada 'Vistas'
> ... un UserForm... un ComboBox1... aparecen las 9 hojas organizadas en 3 columnas
> ... un ComboBox2 para seleccionar uno de los 4 Rangos.
> ... los datos se presentan asi en una hoja auxiliar:
> VERDES AZULES ROJOS RANGOS
> Verde1 Azul1 Roja1 Rango 1
> Verde2 Azul2 Roja2 Rango 2
> Verde3 Azul3 Roja3 Rango 3
> Rango 4
> ... Como se deberia estructurar la function HojaElegida, para seleccionar exactamente una de las 9 hojas, usando un ComboBox?
> ... funciona muy bien cuado se trata de una sola columna, pero falla cuando se trata de 3 columnas.
> Private Function HojaElegida() As Object
> Dim oRetorno As Object
> Select Case ComboBox1.ListIndex
> Case 0
> Set oRetorno = Sheets("Verde1")
> Case 1
> Set oRetorno = Sheets("Verde2")
> Case 2
> Set oRetorno = Sheets("Verde3")
> Case 3
> Set oRetorno = Sheets("Azul1")
> Case 4
> Set oRetorno = Sheets("Azul2")
> Case 5
> Set oRetorno = Sheets("Azul3")
> Case 6
> Set oRetorno = Sheets("Rojo1")
> Case 7
> Set oRetorno = Sheets("Rojo2")
> Case 8
> Set oRetorno = Sheets("Rojo3")
> End Select
> Set HojaElegida = oRetorno
> End Function



Respuesta Responder a este mensaje
#3 Maty
20/04/2006 - 19:28 | Informe spam
Estimado Héctor:

De acuerdo a lo conversado, he insertado 3 ComboBox uno para cada Tipo de
hoja..

Todo me funcionaba perfectamente, hasta que, en algún momento marqué mas de
1 hoja, y, al activar el botón Aceptar, el sistema seleccionó la hoja del
combo que está mas a la derecha, quedando a la vista la o las otras hojas
seleccionadas.

Que modificación habría que introducir para el caso en que el usuario,
después de haber marcado una hoja, decidiera seleccionar otra? El ideal sería
que simplemente al seleccionar esa otra hoja, automáticamente se borrara la
anterior hoja marcada.

Muchas gracias por tu ayuda.

Maty


"Maty" escribió:

Gracias Héctor:

Efectivamente, mi intención es que el usuario pueda 'diferenciar' la
columna seleccionada [y no solo la fila], quizas me convendría insertar 3
ComboBox en el fomulario, uno par cada columna y usar la estructura de la
función HojaElegida en cada caso.

Segiré tu sugerencia de utilizar -> As Worksheet => en lugar de -> As Object.

Si tengo problemas te cuento, y muchas gracias nuevamente,
Maty



"Héctor Miguel" escribió:

> hola, Maty !
>
> 1) [hasta donde se]... el uso de controles combobox y listbox -> de multiples columnas 'sirve' [o es utilizado]...
> [principalmente] para mostrar datos que -> tienen relacion [en varias columnas] CON SU MISMA 'FILA' :-(
> [p.e.] puedes 'ampliar' la informacion de un dato/fila en las siguientes columnas [pero] SIEMPRE de la misma fila ;)
>
> 2) si tu intencion [o necesidad] es que el usuario pueda 'diferenciar' la columna seleccionada [y no solo la fila]...
> [me parece que] necesitaras 'mostrar' TODAS las opciones -> en una sola columna :-(
> tal como esta el codigo de tu funcion HojaElegida ;)
>
> 3) [solo una 'sugerencia']... existe un tipo de datos 'especifico' para estableer referencias a objetos 'hoja de calculo'...
> utiliza -> As Worksheet => en lugar de -> As Object
>
> si cualquier duda [o informacion adicional]... comentas ?
> saludos,
> hector.
>
> > ... 9 hojas... 3 Verdes, 3 Azules y 3 Rojas, cada una... contiene 4 rangos iguales... con datos diferentes.
> > Para ver la informacion que le interesa, el usuario debe seleccionar una hoja y un rango
> > asi el sistema le presenta el resultado en una hoja llamada 'Vistas'
> > ... un UserForm... un ComboBox1... aparecen las 9 hojas organizadas en 3 columnas
> > ... un ComboBox2 para seleccionar uno de los 4 Rangos.
> > ... los datos se presentan asi en una hoja auxiliar:
> > VERDES AZULES ROJOS RANGOS
> > Verde1 Azul1 Roja1 Rango 1
> > Verde2 Azul2 Roja2 Rango 2
> > Verde3 Azul3 Roja3 Rango 3
> > Rango 4
> > ... Como se deberia estructurar la function HojaElegida, para seleccionar exactamente una de las 9 hojas, usando un ComboBox?
> > ... funciona muy bien cuado se trata de una sola columna, pero falla cuando se trata de 3 columnas.
> > Private Function HojaElegida() As Object
> > Dim oRetorno As Object
> > Select Case ComboBox1.ListIndex
> > Case 0
> > Set oRetorno = Sheets("Verde1")
> > Case 1
> > Set oRetorno = Sheets("Verde2")
> > Case 2
> > Set oRetorno = Sheets("Verde3")
> > Case 3
> > Set oRetorno = Sheets("Azul1")
> > Case 4
> > Set oRetorno = Sheets("Azul2")
> > Case 5
> > Set oRetorno = Sheets("Azul3")
> > Case 6
> > Set oRetorno = Sheets("Rojo1")
> > Case 7
> > Set oRetorno = Sheets("Rojo2")
> > Case 8
> > Set oRetorno = Sheets("Rojo3")
> > End Select
> > Set HojaElegida = oRetorno
> > End Function
>
>
>
Respuesta Responder a este mensaje
#4 Héctor Miguel
21/04/2006 - 05:40 | Informe spam
hola, Maty !

... he insertado 3 ComboBox uno para cada Tipo de hoja.
... funcionaba perfectamente, hasta que, en algun momento marque mas de 1 hoja...
Que... habria que introducir para el caso en que el usuario, despues de haber marcado una hoja, decidiera seleccionar otra?
El ideal seria que simplemente al seleccionar esa otra hoja, automaticamente se borrara la anterior hoja marcada.



[creo que] una primera 'tentativa', pudiera ser utilizar...
-> 3 'optionbuttons' [verde, azul, roja] y dependiendo de a cual le haga click el usuario... 'llenar':
-> 1 [unico] 'combobox' con los nombres de las hojas -> de acuerdo con el 'optionbutton' clickado
[previo 'vaciado' de lo que hubiera podido contener anteriormente] ;)
[y... posiblemente hara falta 'cuidar' si se disparan eventos al modificar el combobox] -?-

opcionalmente, podrias 'obligar' a una re/seleccion del rango [en el segundo combobox] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#5 Maty
21/04/2006 - 18:49 | Informe spam
Estimado Héctor:
Lo cierto es que para mis necesidades se requiere que el usuario tenga a la
vista las 3 columnas y dentro de ellas pueda seleccionar una hoja. Por eso la
solución de los 3 combos ha sido muy buena.

Ahora bien, para resolver el problema de que el usuario pudiera haber
marcado una hoja en más de un ComboBox, he adicionado el siguiente botón que
limpia todas las ventanas.

Private Sub CommandButton5_Click()
Unload Me
UserForm1.Show
End Sub

Esta solución, por cierto no es nada elegante, pero si funciona. Sin
embargo, sigo pensando que a lo mejor hay una forma en que el usuario, al
marcar una segunda hoja en otro ComboBox, automáticamente se borre la
anterior hoja marcada en cualquiera de los otros 2 ComboBox. Será eso posible?

Si quieres te adjunto el total de códigos que he utilizado para hacer
funcionar los 3 combos para seleccionar hojas, mas el combo para seleccionar
rangos. Tu me dices.

Gracias, Maty


"Héctor Miguel" escribió:

hola, Maty !

> ... he insertado 3 ComboBox uno para cada Tipo de hoja.
> ... funcionaba perfectamente, hasta que, en algun momento marque mas de 1 hoja...
> Que... habria que introducir para el caso en que el usuario, despues de haber marcado una hoja, decidiera seleccionar otra?
> El ideal seria que simplemente al seleccionar esa otra hoja, automaticamente se borrara la anterior hoja marcada.

[creo que] una primera 'tentativa', pudiera ser utilizar...
-> 3 'optionbuttons' [verde, azul, roja] y dependiendo de a cual le haga click el usuario... 'llenar':
-> 1 [unico] 'combobox' con los nombres de las hojas -> de acuerdo con el 'optionbutton' clickado
[previo 'vaciado' de lo que hubiera podido contener anteriormente] ;)
[y... posiblemente hara falta 'cuidar' si se disparan eventos al modificar el combobox] -?-

opcionalmente, podrias 'obligar' a una re/seleccion del rango [en el segundo combobox] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida