Saltar al contenido

Función cargar combobox


Recommended Posts

publicado

Hola a toda la gente del foro, hoy les traigo un código que fui recopilando y en el cual personas de este foro me han ido ayudando en armar. Lo que no puedo lograr es introducirla en un módulo y poder llamarla siempre que yo lo requiera.

Call CARGAR_COMBOBOX("BASE", "N_SE")

Function CARGAR_COMBOBOX(HOJA As String, POSBUS As String) As String

Dim Dir As String

'ACTIVA LA HOJA: "BASE"
Worksheets(HOJA).Activate
'ACTIVA LA CELDA A1
ActiveSheet.Range("A1").Activate

'BUSCA LA COLUMNA SEGÚN LA ETIQUETA INDICADA
Do While ActiveCell.Value <> POSBUS
'REALIZA UN DESPLAZAMIENTO (FILA,COLUMNA) Y ACTIVA LA CELDA
ActiveCell.Offset(0, 1).Activate
Loop

'GUARDA EL ADDRESS DE LA COLUMNA ACTIVA
COLUMNA = ActiveCell.Column

Dir = Columns(COLUMNA).Address(0, 0)
Dir = Left(Dir, InStr(Dir, ":") - 1)

LETRA_COLUMNA = Dir

'DEFINE EL RANGO DONDE VA A IR A BUSCAR LOS DATOS DEL COMBOBOX (CELDA INICIAL,CELDA FINAL)
Set rango = Range(LETRA_COLUMNA & 1, Range(LETRA_COLUMNA & 1).End(xlDown))

rango.AdvancedFilter 2, , Range("IV1"), Unique:=True

Range("IV:IV").Sort Range("IV1"), xlAscending, Header:=xlYes

'LIMPIA LA VARIABLE
N_SE.Clear

For Each vp In Range("IV:IV").SpecialCells(xlCellTypeConstants)
N_SE.AddItem vp.Value
Next

N_SE.RemoveItem (0)

Range("IV:IV").EntireColumn.SpecialCells(xlCellTypeConstants).ClearContents

Set rango = Nothing

End Function[/CODE]

Cuando lo quiero ejecutar me tira el error 424 - Se requiere un objeto

Desde ya muchas gracias todos. Saludos! :)

publicado

Pienso que para cargar un combobox (o un listbox) no es necesario una función, con un procedimiento público es suficiente.

He aligerado un poco el código para hacerlo un poco mas eficiente.

Tu código es correcto, pero solo funciona dentro del formulario, ya que haces referencia a un combo en concreto.

Si lo pones en un módulo, no sabe a que objeto te estás refiriendo ya que no esta definido en el módulo, de ahí el error.

Aquí está el procedimiento y la forma de llamarlo:

Procedimiento: (Válido para cualquier Combobox/Listbox de cualquier formulario)

Sub CARGAR_COMBOBOX(Combo As Control, Hoja As Worksheet, Columna As Integer)

'Copiamos la columna en la columna IV
Hoja.Columns(Columna).Copy Hoja.Range("IV:IV")

'Ordenamos la columna IV
Hoja.Range("IV:IV").Sort Hoja.Range("IV1"), xlAscending, Header:=xlYes

'LLenamos el Combobox
Combo.List() = Hoja.Range("IV2:IV" & Hoja.Range("IV" & Rows.Count).End(xlUp).Row).Value

'Limpiamos la columna IV
Hoja.Range("IV:IV").Clear

End Sub
[/CODE]

Llamada desde el formulario:

[CODE]Call CARGAR_COMBOBOX(Combo:=N_SE, Hoja:=Sheets("BASE"), Columna:=3)[/CODE]

Forma abreviada:

[CODE]CARGAR_COMBOBOX N_SE, Sheets("BASE"), 3[/CODE]

[u]Observa[/u]:

  • He añadido un parámetro mas: El control combobox.
  • La hoja se pasa como objeto en lugar de su nombre.
  • La columna se pasa como número

Te adjunto un ejemplo.

Cargar combobox ordenado.xls

publicado

Funciona muy bien y muy rápido, aunque encuentro un problema, si hay valores repetidos los carga tmb. ¿Eso se puede solucionar? Y otra consulta que subi en el archivo, yo cree una tabla para poder filtrar los datos, como se podria hacer para que solo cargue en los combobox los datos que filtre?

Desde ya muchas gracias!

Cargar combobox ordenado.rar

publicado

No acabo de entender que es lo que quieres filtrar. Sube un ejemplo.

He modificado la macro para que solo cargue valores únicos.

Sub CARGAR_COMBOBOX(Combo As Control, Hoja As Worksheet, Columna As Integer)

'Filtramos valores únicos sobre la columna IV y la ordenamos
Hoja.Columns(Columna).AdvancedFilter xlFilterCopy, , Hoja.Range("IV1"), Unique:=True
Hoja.Range("IV:IV").Sort Hoja.Range("IV1"), xlAscending, Header:=xlYes

'LLenamos el Combobox
Combo.List() = Hoja.Range("IV2:IV" & Hoja.Range("IV" & Rows.Count).End(xlUp).Row).Value

'Limpiamos la columna IV
Hoja.Range("IV:IV").Clear

End Sub[/CODE]

publicado

Aquí está lo que has pedido, o eso creo.

Sub CARGAR_COMBOBOX(Combo As Control, Hoja As Worksheet, Columna As Integer)

Application.ScreenUpdating = False

'Creamos la hoja de trabajo
Application.DisplayAlerts = False
On Error Resume Next
Sheets("Trabajo").Delete
On Error GoTo 0
Sheets.Add

With Hoja

'Copiamos los datos filtrados a la hoja de trabajo
.Range(.Cells(1, Columna), .Cells(.Range("A" & Rows.Count).End(xlUp).Row, Columna)) _
.SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1")

End With

With ActiveSheet

'Ordenamos los datos filtrados
.Range("A:A").Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes

'LLenamos el Combobox
For x = 2 To .Range("A" & Rows.Count).End(xlUp).Row
Combo.Value = .Range("A" & x)
If Combo.ListIndex = -1 Then Combo.AddItem .Range("A" & x) 'Únicos
Combo.Value = ""
Next

End With

'Eliminamos la hoja de trabajo
ActiveSheet.Delete
Application.DisplayAlerts = True

End Sub
[/CODE]

  • 1 month later...

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.