Filtrar datos con un ComboBox
Zanlepan
-
Zanlepan -
Zanlepan -
Hola,
He creado una tabla donde he puesto en la cabecera 1 comboBox en cada columna para filtrar el contenido de las filas. Somos capaces de rellenar las combo box, pero no de aplicar el filtro. Es decir, cuando selecciono un valor de la comboBox, se muestra ahí pero el resto de la tabla no cambia. También me gustaría saber cómo hacer para mostrar un valor por defecto en la combo box (quiero que diga "Select a port"). Aquí va mi código:
Sub CB_loadPort_Change()
With Sheets("calculs")
premierPort = .Range("AA1").Address
dernierPort = .Range(premierPort).End(xlDown).Address
ports = .Range(premierPort & ":" & dernierPort)
End With
With ActiveSheet.CB_loadPort
For Each portName In ports
.AddItem portName
Next portName
.Style = fmStyleDropDownList
.AutoSize = False
End With
End Sub
Merci !
He creado una tabla donde he puesto en la cabecera 1 comboBox en cada columna para filtrar el contenido de las filas. Somos capaces de rellenar las combo box, pero no de aplicar el filtro. Es decir, cuando selecciono un valor de la comboBox, se muestra ahí pero el resto de la tabla no cambia. También me gustaría saber cómo hacer para mostrar un valor por defecto en la combo box (quiero que diga "Select a port"). Aquí va mi código:
Sub CB_loadPort_Change()
With Sheets("calculs")
premierPort = .Range("AA1").Address
dernierPort = .Range(premierPort).End(xlDown).Address
ports = .Range(premierPort & ":" & dernierPort)
End With
With ActiveSheet.CB_loadPort
For Each portName In ports
.AddItem portName
Next portName
.Style = fmStyleDropDownList
.AutoSize = False
End With
End Sub
Merci !
1 respuesta
-
Hola,
En tu mensaje nos das un código.
¿Puedes decirme para qué sirven, qué hacen las siguientes líneas:With ActiveSheet.CB_loadPort For Each portName In ports .AddItem portName Next portName .Style = fmStyleDropDownList .AutoSize = False End With
Además, descríbenos esto:Sub CB_loadPort_Change()
EDICIÓN: complemento de información: ¿dónde y cómo se declaran tus variables?
Antes, nunca conseguía terminar mis frases... pero ahora sí puedo.-
Aquí está la traducción al español del texto proporcionado: A continuación se muestra la declaración de mis variables:
Option Explicit Option Base 1 Public vessels, vesselName, actualYear, ws, newpath, ports, portName As Variant Public premierNavire, dernierNavire, newFileName, annee, premierPort, dernierPort As String
La primera parte del código que has puesto sirve para tomar la lista que se encuentra en la página vessels y llenar mi comboBox con (este último se encuentra en otra hoja)
Mi comboBox se llama CB_loadPort, la subrutina CB_loadPort_change() se llama cuando se pulsa un commandButton en la hoja Template. Este command button copia la hoja template, la renombra y rellena el comboBox que está inicialmente vacío en esa hoja.- Hola,
El problema aquí es que la rutina CB_loadPort_change() es una rutina disparadora de eventos que se ejecuta cada vez que cambia el valor en la combobox CB_loadPort. En resumen, cuando seleccionas un valor, o incluso escribes, aunque sea un carácter en esa Combo, el código se dispara y... vuelve a llenar tu Combobox.
1- el código del CommandButton, debe estar en la rutina CommandButtonXX_Click (o XX es el número del botón).
2- En VBA, se declara cada variable, salvo si se trata de Variant.
Tus variables :Public vessels, vesselName, actualYear, ws, newpath, ports, portName 'estos son Variant Public premierNavire As String, dernierNavire As String, newFileName As String, annee As String, premierPort As String, dernierPort As String
3- el código de tu combobox, destinado a filtrar la hoja, no deberá encontrarse en el procedimiento CB_loadPort_Change() sino en CB_loadPort_Click(). De hecho, es este evento el que conviene usar para hacer que al seleccionar un valor en la combo, se dispare la macro.
4- tienes una Combobox por columna. El objetivo aquí será tener solo un procedimiento para todas tus combobox. así tendrás un código tipo:
Sub Filtre(ByRef Col As Integer, ByRef Valeur_Combo As String) Dim DLig As Long, PremLig As Long, i As Long PremLig = 2 DLig = Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row For i = PremLig To DLig If Cells(i, Col) <> Valeur_Combo Then Rows(i).EntireRow.Hidden = True Next i End Sub
Código que llamarás con:Sub CB_loadPort_Click() If CB_loadPort <> "" And CB_loadPort <> "Select a port" Then Call Filtre(3, CB_loadPort.Value) 'o 3 es el número "hard-coded" de la columna donde está tu combo End If End Sub
5- ya que haces un filtrado de tu hoja, también necesitas una Sub para mostrar todo de nuevo
6- para darle un valor por defecto a tu combobox:
CB_LoadPort.Text = "Select a port"
-