Filtrer données avec un ComboBox

Fermé
Zanlepan - Modifié par pijaku le 7/10/2015 à 08:45
 Zanlepan - 9 oct. 2015 à 14:52
Bonjour,

J'ai créé un tableau ou j'ai mis en en-tête 1 comboBox dans chaque colonne pour filtrer le contenu des rangées. Je suis capables de remplir les combo box, mais pas d'appliquer le filtre. C'est-à-dire que quand je sélectionne une valeur du comboBox, elle s'affiche dedans mais le reste du tableau n'est pas changée. Aussi j'aimerais savoir comment faire pour afficher une valeur par défaut dans le combo box (je veux qu'il soit écrit "Select a port"). Voici mon code:

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 réponse

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752
Modifié par pijaku le 7/10/2015 à 08:47
Bonjour,

Dans ton message, tu nous donnes un code.
Peux tu me dire à quoi servent, ce que font les lignes suivantes :

With ActiveSheet.CB_loadPort
      For Each portName In ports
         .AddItem portName
     Next portName
    .Style = fmStyleDropDownList
    .AutoSize = False
End With


De plus, décrit nous ceci :
Sub CB_loadPort_Change()


EDIT : complément d'information : ou et comment sont déclarées tes variables?

Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
0
Voici la déclaration de mes 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 première partie du code que tu as mis sert à prendre la liste qui se trouve sur la page vessels et de remplir mon comboBox avec (ce dernier est situé sur une autre feuille)

Mon comboBox s'appelle CB_loadPort, la sous-routine CB_loadPort_change() est appelée lorsqu'on clique sur un commandButton sur la feuille Template. Ce command button copie la feuille template, la renomme et rempli le comboBox qui est initialement vide sur cette feuille.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 752 > Zanlepan
9 oct. 2015 à 07:56
Bonjour,

Le problème ici est que la procédure CB_loadPort_change() est une procédure événementielle qui se déclenche à chaque changement de valeur dans la combobox CB_loadPort. En gros, quand tu sélectionnes une valeur, ou que tu saisis, ne serait-ce qu'un caractère dans celle Combo, le code se déclenche et... remplit à nouveau ta Combobox.

1- le code du CommandButton, doit se trouver dans la procédure CommandButtonXX_Click (ou XX est le numéro du bouton).

2- En VBA, on type chaque variable, sauf s'il s'agit de Variant.
Tes variables :
Public vessels, vesselName, actualYear, ws, newpath, ports, portName 'ceux sont des Variant
Public premierNavire As String, dernierNavire As String, newFileName As String, annee As String, premierPort As String, dernierPort As String

3- le code de ta combobox, censé filtrer la feuille, devra non pas se trouver dans la procédure CB_loadPort_Change() mais CB_loadPort_Click(). C'est en effet cet événement qu'il convient d'utiliser pour faire en sorte qu'à chaque sélection d'une valeur dans la combo, la macro se déclenche.

4- tu as une Combobox par colonne. Le but ici sera de n'avoir qu'une seule procédure pour toutes tes combobox. cela te fera un code du style :

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


Code que tu appelleras grâce à :
Sub CB_loadPort_Click()
    If CB_loadPort <> "" And CB_loadPort <> "Select a port" Then
        Call Filtre(3, CB_loadPort.Value) 'ou 3 est le numéro "en dur" de la colonne ou se trouve ta combo
    End If
End Sub


5- comme tu filtres ta feuille, il te faut aussi une Sub pour tout afficher

6- pour donner une valeur par défaut à ta combobox :
CB_LoadPort.Text = "Select a port"
0
Zanlepan > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
Modifié par Zanlepan le 9/10/2015 à 14:52
WOAH! Merci quelle belle réponse claire et détaillée, je ne m'attendais pas à ça!!!
Je vais prendre le temps d'analyser tout ca, mais vraiment, merci mille fois !
0