Filtrar lista de cuadro conbinado y mostrar varias columnas

20/09/2008 - 05:12 por GRIEGO59 | Informe spam
Hola!
En un formulario tengo un combobox1 con este código:

'Carga el combobox con los productos al activar el formulario
Private Sub UserForm_Activate()
Sheets("Códigos").Select
Range("a1").Select

Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
ComboBox1.AddItem ActiveCell
Loop
End Sub

La lista del cuadro combinado muestra la columna "a".
Los títulos de las columnas a, b y c son Código, producto, proveedor.

Quisiera que la lista del cuadro combinado muestre las columnas "a", "b" y
"c" de la hoja "códigos" y se seleccione la columna "a"

Quisiera, si es posible, que la lista del combobox1 muestre los productos
asociados al proveedor seleccionado en un combobox2.

Gracias por la ayuda,

Darío

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
20/09/2008 - 06:03 | Informe spam
hola, Darío !

__ 1 __
En un formulario tengo un combobox1 con este codigo:
'Carga el combobox con los productos al activar el formulario
Private Sub UserForm_Activate()
Sheets("Codigos").Select
Range("a1").Select
Do While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
ComboBox1.AddItem ActiveCell
Loop
End Sub

La lista del cuadro combinado muestra la columna "a".
Los titulos de las columnas a, b y c son Codigo, producto, proveedor.
Quisiera que la lista del cuadro combinado muestre las columnas "a", "b" y "c" de la hoja "codigos" y se seleccione la columna "a"


__ 2 __
Quisiera, si es posible, que la lista del combobox1 muestre los productos asociados al proveedor seleccionado en un combobox2.



1) la carga de un control combo/lista la puedes agilizar sin "danzas" seleccionando la siguiente fila/celda...
(incluso, te sugiero usar el evento '_initialize' en lugar del '_activate' en el formulario) +/- asi:

Private Sub UserForm_Initialize()
ComboBox1.ColumnCount = 3
ComboBox1.ColumnWidths = "35;75;40"
With Worksheets("códigos")
ComboBox1.List = _
.Range(.Range("a2"), .Range("a2").End(xlDown)).Resize(, 3).Value
End With
End Sub

2) para este requerimiento (creo que) deberas reconsiderar algunos puntos (p.e.)
a) en lugar de llenar el combobox1 en la inicializacion del formulario... -> rellenar el combobox2 (con los proveedores)
b) puedes utilizar (auto)filtros(avanzados) para cargar proveedores "unicos"
c) ya no seria necesario mostrar en el combobox1 a los proveedores
d) el combobox1 debera rellenarse con otro (auto)filtro(avanzado) segun el proveedor seleccionado en el combobox2

3) comenta cual es el rango usado/disponible en tu hoja "codigos" para usar filtros avanzados (de ser conveniente)
y/o cualquier otro detalle que pudiera estarse quedando "en el tintero" :))

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 GRIEGO59
21/09/2008 - 05:26 | Informe spam
Hola
Hector


1) la carga de un control combo/lista la puedes agilizar sin "danzas" seleccionando la siguiente fila/celda...
(incluso, te sugiero usar el evento '_initialize' en lugar del '_activate' en el formulario) +/- asi:



Si, es más directo así, funciona bien.

2) para este requerimiento (creo que) deberas reconsiderar algunos puntos (p.e.)
a) en lugar de llenar el combobox1 en la inicializacion del formulario... -> rellenar el combobox2 (con los proveedores)


Si, es correcto.

b) puedes utilizar (auto)filtros(avanzados) para cargar proveedores "unicos"


Si

c) ya no seria necesario mostrar en el combobox1 a los proveedores


Correcto

d) el combobox1 debera rellenarse con otro (auto)filtro(avanzado) segun el proveedor seleccionado en el combobox2


Si

3) comenta cual es el rango usado/disponible en tu hoja "codigos" para usar filtros avanzados (de ser conveniente)
y/o cualquier otro detalle que pudiera estarse quedando "en el tintero" :))


Solamente uso las columnas a, b y c desde la fla 2 y va creciendo, la fila 1
es para títulos. El resto de la hoja está disponible.

Gracias por tu ayuda,
saludos,
Respuesta Responder a este mensaje
#3 Héctor Miguel
21/09/2008 - 06:24 | Informe spam
hola, Darío !

Solamente uso las columnas a, b y c desde la fla 2 y va creciendo
la fila 1 es para titulos. El resto de la hoja esta disponible.



el ejemplo que sigue, supone que:
- el primer combo se llama "proveedores" (y es el primero que se llena)
- el segundo combo se llama "productos" (y se llena de acuerdo con la seleccion del proveedor)
- al momento de mostrarse el formulario, la lista (en la hoja "codigos") YA NO CRECE -?-

utiliza los filtros avanzados en los siguientes eventos:
- _initialize (del formulario) para volcar la lista de proveedores (ordenada y solo registros unicos)
- _change (del combo proveedores) para filtrar y llenar el combo "productos" (segun proveedor seleccionado)
- _terminate (del formulario) para eliminar las columnas utilizadas por los filtros avanzados (hoja "codigos")

revisa, prueba, corrije, adapta, ... segun sea necesario
es probable que debas revisar el evento '_change' del segundo combo ("productos" ?)
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

en el modulo de codigo del formulario ==
Private CargandoProveedores As Boolean
Private Sub UserForm_Initialize()
CargandoProveedores = True
Productos.ColumnCount = 2
Productos.ColumnWidths = "75;40"
With Worksheets("códigos")
.Range("e1:f1") = .Range("c1")
.Range("a1").CurrentRegion.Offset(, 2).Resize(, 1).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("e1"), Unique:=True
.Columns("e").Sort Key1:=.Range("e1"), Order1:=xlAscending, Header:=True
Proveedores.List = .Range(.Range("e2"), .Range("e2").End(xlDown)).Value
End With
CargandoProveedores = False
End Sub
Private Sub Proveedores_Change()
Productos.Clear
If CargandoProveedores Then Exit Sub
With Worksheets("códigos")
.Range("f2") = Proveedores.Value
.Range("h1:i1").Value = .Range("a1:b1").Value
.Range("a1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=.Range("f1:f2"), _
CopyToRange:=.Range("h1:i1")
With .Range("h1").CurrentRegion
Productos.List = .Offset(1).Resize(.Rows.Count - 1).Value
End With
End With
End Sub
Private Sub UserForm_Terminate()
With Worksheets("códigos")
.Columns("d:i").Clear
Debug.Print .UsedRange.Address
End With
End Sub
Respuesta Responder a este mensaje
#4 GRIEGO59
22/09/2008 - 01:28 | Informe spam
Hola,
Hector!
Al abrir el formulario me da el siguiente mensaje:

"Error de compilación, no se ha definido variable"

Se activa el depurador marcando las siguientes líneas:

Private Sub UserForm_Initialize()
CargandoProveedores = True

Saludos,
Darío

"Héctor Miguel" escribió:

hola, Darío !

> Solamente uso las columnas a, b y c desde la fla 2 y va creciendo
> la fila 1 es para titulos. El resto de la hoja esta disponible.

el ejemplo que sigue, supone que:
- el primer combo se llama "proveedores" (y es el primero que se llena)
- el segundo combo se llama "productos" (y se llena de acuerdo con la seleccion del proveedor)
- al momento de mostrarse el formulario, la lista (en la hoja "codigos") YA NO CRECE -?-

utiliza los filtros avanzados en los siguientes eventos:
- _initialize (del formulario) para volcar la lista de proveedores (ordenada y solo registros unicos)
- _change (del combo proveedores) para filtrar y llenar el combo "productos" (segun proveedor seleccionado)
- _terminate (del formulario) para eliminar las columnas utilizadas por los filtros avanzados (hoja "codigos")

revisa, prueba, corrije, adapta, ... segun sea necesario
es probable que debas revisar el evento '_change' del segundo combo ("productos" ?)
si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

en el modulo de codigo del formulario ==>
Private CargandoProveedores As Boolean
Private Sub UserForm_Initialize()
CargandoProveedores = True
Productos.ColumnCount = 2
Productos.ColumnWidths = "75;40"
With Worksheets("códigos")
.Range("e1:f1") = .Range("c1")
.Range("a1").CurrentRegion.Offset(, 2).Resize(, 1).AdvancedFilter _
Action:=xlFilterCopy, CopyToRange:=.Range("e1"), Unique:=True
.Columns("e").Sort Key1:=.Range("e1"), Order1:=xlAscending, Header:=True
Proveedores.List = .Range(.Range("e2"), .Range("e2").End(xlDown)).Value
End With
CargandoProveedores = False
End Sub
Private Sub Proveedores_Change()
Productos.Clear
If CargandoProveedores Then Exit Sub
With Worksheets("códigos")
.Range("f2") = Proveedores.Value
.Range("h1:i1").Value = .Range("a1:b1").Value
.Range("a1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=.Range("f1:f2"), _
CopyToRange:=.Range("h1:i1")
With .Range("h1").CurrentRegion
Productos.List = .Offset(1).Resize(.Rows.Count - 1).Value
End With
End With
End Sub
Private Sub UserForm_Terminate()
With Worksheets("códigos")
.Columns("d:i").Clear
Debug.Print .UsedRange.Address
End With
End Sub



Respuesta Responder a este mensaje
#5 Héctor Miguel
22/09/2008 - 02:11 | Informe spam
hola, Darío !

Al abrir el formulario me da el siguiente mensaje:
"Error de compilacion, no se ha definido variable"
Se activa el depurador marcando las siguientes lineas:
Private Sub UserForm_Initialize()
CargandoProveedores = True

Saludos,
Dario



me parece raro, ya que la variable "CargandoProveedores" (precisamente)
-> ES la primer linea del codigo sugerido (en el area de declaraciones)...
en el modulo de codigo del formulario ==>>
Private CargandoProveedores As Boolean
Private Sub UserForm_Initialize()
CargandoProveedores = True
(...)





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