ComboBox affichant les donnees d'une colonne deja filtree

Delux

XLDnaute Occasionnel
Bonjour a tous,

(excuser moi pour les accents, je travaille sur un clavier QWERTY)

Je cherche depuis un petit bout de temps, mais sans succes, a creer un combobox qui afficherait le contenu d'une colonne filtree.

Pour etre plus clair, j'ai deux feuilles: Recherche (=feuille1) et liste (=Feuille2).

Liste : les donnees sont filtrees par des filtres.
Recherche : par un useform (Combobox) je veux afficher les donnees de la feuille liste.

Cependant, mon combobox affiche actuellement la liste complete et non triee.

Je souhaiterais que mon combobox n'affiche que les donnees triees qui sont triees dans la feuille2.

Je vous joints un exemple.

Merci d'avance

Cordialement,

Delux
 

Pièces jointes

  • Combobox filtree.xls
    59.5 KB · Affichages: 56

Dranreb

XLDnaute Barbatruc
Re : ComboBox affichant les donnees d'une colonne deja filtree

Bonjour.
Nettoyez la propriété RowSource et essayez ce code:
VB:
Option Explicit
'

Private Sub UserForm_Activate()
Me.ComboBox_Numb.List = WorksheetFunction.Index(ValeursFiltrées(Sheet2), 0, 1)
End Sub
'

Function ValeursFiltrées(Optional ByVal F As Worksheet) As Variant()
If F Is Nothing Then Set F = ActiveSheet
ValoriserFiltre ValeursFiltrées, F
End Function
Sub ValoriserFiltre(TSorti() As Variant, ByVal F As Worksheet)
Dim PlgF As Range, LMax As Long, CMax As Long, Zone As Range, TEntré() As Variant, L As Long, C As Long
Set PlgF = F.AutoFilter.Range
Set PlgF = PlgF.Rows(2).Resize(PlgF.Rows.Count - 1)
Set PlgF = PlgF.SpecialCells(xlCellTypeVisible)
LMax = 0: CMax = PlgF.Columns.Count
For Each Zone In PlgF.Areas
   LMax = LMax + Zone.Rows.Count
   Next Zone
ReDim TSorti(1 To LMax, 1 To CMax) As Variant
LMax = 0
For Each Zone In PlgF.Areas
   TEntré = Zone.Value
   For L = 1 To UBound(TEntré, 1): LMax = LMax + 1
      For C = 1 To CMax: TSorti(LMax, C) = TEntré(L, C): Next C
      Next L
   Next Zone
End Sub
'

Private Sub CommandButton_Validate_Click()
Range("A10") = ComboBox_Numb.Value
End Sub
'

Private Sub CommandButton_Cancel_Click()
Unload Me
End Sub
À +
 

Delux

XLDnaute Occasionnel
Re : ComboBox affichant les donnees d'une colonne deja filtree

Bonjour,

Merci pour votre code il fonctionne a merveille.
Serait-il possible, sans trop vouloir abuser de votre gentillesse, d'avoir les explications en 'vert car je ne suis pas un pro de VBA? :eek: (j'aime bien comprendre les codes)

Cela me permettrait de l'adapter a la deuxieme combobox, qui necessite aussi d'etre filtree en meme temps.

Merci d'avance :)
 

Dranreb

XLDnaute Barbatruc
Re : ComboBox affichant les donnees d'une colonne deja filtree

Je vous conseille alors de mettre la fonction ValeursFiltrées et la procédure ValoriserFiltre dans un module ordinaire dédié aux dispositifs utilitaires à usage général.
VB:
Function ValeursFiltrées(Optional ByVal F As Worksheet) As Variant()
If F Is Nothing Then Set F = ActiveSheet ' Assume la feuille active si elle n'est pas précisée.
ValoriserFiltre ValeursFiltrées, F ' Exécute la procédure pour le tableau à retourner.
End Function
Sub ValoriserFiltre(TSorti() As Variant, ByVal F As Worksheet)
Dim PlgF As Range, LMax As Long, CMax As Long, Zone As Range, TEntré() As Variant, L As Long, C As Long
Set PlgF = F.AutoFilter.Range ' L'initialise à l'unique plage possible de la feuille couverte par un filtre auto.
Set PlgF = PlgF.Rows(2).Resize(PlgF.Rows.Count - 1) ' La réinitialise de façon à en sauter les entêtes.
Set PlgF = PlgF.SpecialCells(xlCellTypeVisible) ' La réinitialise de façon à n'en prendre que les cellules visibles.
       Rem. Ceci aboutit dans le cas général à une plage multi-zones, tout comme une union ou une sélection multiple.
LMax = 0: CMax = PlgF.Columns.Count ' Nombre de lignes de sortie à 0, et nombre de colonnes de la plage filtrée noté.
For Each Zone In PlgF.Areas ' Pour chaque zone:
   LMax = LMax + Zone.Rows.Count ' Ajoute au nombre de lignes total celui de la zone.
   Next Zone
ReDim TSorti(1 To LMax, 1 To CMax) As Variant ' Redimensionne convenablement le tableau à produire.
LMax = 0 ' Numéro de ligne de sortie courant remis à 0.
For Each Zone In PlgF.Areas ' Pour chaque zone:
   TEntré = Zone.Value ' en récupère l'intégralité des valeurs.
   For L = 1 To UBound(TEntré, 1): LMax = LMax + 1 ' Pour chacune des lignes, le N° de ligne de sortie est incrémenté
      For C = 1 To CMax: TSorti(LMax, C) = TEntré(L, C): Next C ' et on y copie la valeur de chaque colonne.
      Next L
   Next Zone
End Sub
P.S.
Cela me permettrait de l'adapter a la deuxieme combobox
J'avais mal lu, j'ignore pourquoi j'avais compris que vous vouliez l'utiliser dans un autre userform. Mais ça ne fait pas de mal de l'isoler quand même dans un module de service. Mais là, si c'est pour la même feuille, ne l'éxécutez pas deux fois:
VB:
Private Sub UserForm_Activate()
Dim TV() As Variant
'TV = ValeursFiltrées(Sheet2) ou mieux:
ValoriserFiltre TV, Sheet2
Me.ComboBox_Numb.List = WorksheetFunction.Index(TV, 0, 1)
Me.ComboBox_Name.List = WorksheetFunction.Index(TV, 0, 2)
End Sub
À +
 
Dernière édition:

Delux

XLDnaute Occasionnel
Re : ComboBox affichant les donnees d'une colonne deja filtree

Re,

Merci cela fonctionne tres bien.

Maintenant je vais essayer de l'adapter au fichier original qui ne ressemble pas trop a celui-ci mais dont le principe reste le meme.

Pourriez-vous m'indiquer les lignes a modifier le cas echeant?

Merci d'avance ;)

Cordialement,

Delux
 

Dranreb

XLDnaute Barbatruc
Re : ComboBox affichant les donnees d'une colonne deja filtree

Il n'y a rien à modifier dans ces fonctions de service. Juste veiller à spécifier dans leur invocation le tableau de variant à garnir, et l'expression Worksheet représentant la bonne feuille dont on veut tirer la plage filtrée.
Cordialement.
 

Dranreb

XLDnaute Barbatruc
Re : ComboBox affichant les donnees d'une colonne deja filtree

ValoriserFiltre TV, Sheet2
est en soit un exemple, qu'est ce qu'il vous faut de plus ? Lorsqu'une définition de procédure commence comme celle ci:
Sub ValoriserFiltre(TSorti() As Variant, ByVal F As Worksheet)
Cela signifie que pour l'utilser, il faut lui fournir deux paramètres:
le premier: TSorti() As Variant doit être déclaré avec un nom suivi de () et éventueleement derrière As Variant
Le second doit être une expression Worksheet représentant une feuille existante dans un classeur existant. Si c'est dans le classeur qui porte cette programmation, on peut spécifier son CodeName, c'est le nom qui figure dans la rubrique "Microsoft Excel Objets" du projet VBA, devant le nom Excel de la feuille rappelé entre parenthèses.
 
Dernière édition:

Discussions similaires