combo sur 2 colonne d'une liste filtrée

Chombi

XLDnaute Occasionnel
Re bonjour à tous me revoilu avec mes filtres et mes tries

je voudrai l'affichage des lignes filtrées dans ma combo, je n'arrive pas à trouver pourquoi ça ne fonctionne pas
Code:
With ComboBox1
    .ColumnCount = 2
    .List = Range("A3:B" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Value
End With

ci joint fichier test, je n'ai pas trouve la réponse sur le forum, j'ai failli déterrer un fil de 2010 de Pierrot 93 mais je n'ai pas osé

Merci
 

Pièces jointes

  • filtre et triel.xlsm
    20.8 KB · Affichages: 43
  • filtre et triel.xlsm
    20.8 KB · Affichages: 42

job75

XLDnaute Barbatruc
Re : combo sur 2 colonne d'une liste filtrée

Bonsoir Chombi,

Une plage de cellules disjointes ne permet pas d'obtenir une matrice.

Il faut d'abord la copier, ici en Feuil2 :

Code:
Private Sub UserForm_Initialize()
ComboBox1.ColumnCount = 2
With Feuil2 'CodeName de la feuille
  .Cells.Delete
  Range("A3:B" & Range("A65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible).Copy .[A1]
  ComboBox1.List = .UsedRange.Value
End With
End Sub
Bonne nuit.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : combo sur 2 colonne d'une liste filtrée

Bonjour Chombi, job75,

Pour proposer autre chose que job75 :) (que je salue) un essai sans feuille auxiliaire, qui utilise le SpecialCells et qui conserve la sélection du combobox1 entre deux cliques sur le bouton "Valider" (si bien sûr la précédente sélection est dans la nouvelle liste filtrée)
VB:
Private Sub CommandButton1_Click()
  UserForm1.Hide
End Sub

Sub MaListe()
Dim derlig&, rg As Range, xcell As Range, liste(), i&
Dim Nom$, Prenom$, present&

  derlig = Range("A" & Rows.Count).End(xlUp).Row
  If derlig > 2 Then
    If derlig = 3 Then
      Set rg = Range("a2").Offset(1) ' cas où seule la ligne 3 est affichée
    Else
      Set rg = Range(Range("a2").Offset(1), Range("a" & derlig)).SpecialCells(xlCellTypeVisible)
    End If
    ReDim liste(1 To rg.Count, 1 To 2)
    With ComboBox1
      'ancienne sélection de combobox
      If .ListIndex > -1 Then
        Nom = .List(.ListIndex, 0): Prenom = .List(.ListIndex, 1): End If
      'remplissage de la liste
      For Each xcell In rg
        i = i + 1: liste(i, 1) = xcell: liste(i, 2) = xcell.Offset(, 1)
        'si liste(i, 1) et liste(i, 2) i correspondent à nom et prénom affichés par combobox1
        If liste(i, 1) = Nom And liste(i, 2) = Prenom Then present = i
      Next xcell
      .ColumnCount = 2
      .List = liste
      .ListIndex = present - 1
    End With
  End If
End Sub

Private Sub UserForm_Activate()
  MaListe
End Sub
 

Pièces jointes

  • Chombi-filtre et triel-v2.xlsm
    24.9 KB · Affichages: 32
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : combo sur 2 colonne d'une liste filtrée

Bonjour,

Sans feuille intermédiaire (la BD peut être déplacée sans modif du code)

Remplissage ListBox avec zone filtrée

Code:
Private Sub UserForm_Initialize()
  Set Rng = [_FilterDataBase]
  Dim tmp(): ReDim tmp(1 To [_FilterDataBase].Resize(, 1).SpecialCells(xlCellTypeVisible).Count)
  For Each c In [_FilterDataBase].Resize(, 1).SpecialCells(xlCellTypeVisible)
    i = i + 1: tmp(i) = c.Row - Rng.Row + 1
  Next c
  Me.ComboBox1.ColumnCount = 2
  Me.ComboBox1.List = Application.Index(Rng, Application.Transpose(tmp), Application.Transpose(Evaluate("Row(1:" & Rng.Columns.Count & ")")))
  Me.ComboBox1.RemoveItem 0
End Sub

ou

Code:
Private Sub UserForm_Initialize()
  Dim Liste(): ReDim Liste(1 To [_FilterDataBase].Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
  For Each c In [_FilterDataBase].Resize(, 1).SpecialCells(xlCellTypeVisible)
    i = i + 1:  Liste(i, 1) = c: Liste(i, 2) = c.Offset(, 1)
  Next c
  Me.ComboBox1.List = Liste
  Me.ComboBox1.RemoveItem 0
End Sub

http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreTableau.xls


JB
 

Pièces jointes

  • filtre et triel-1.xls
    47.5 KB · Affichages: 28
Dernière édition:

Chombi

XLDnaute Occasionnel
Re : combo sur 2 colonne d'une liste filtrée

Bonjour mapomme, JB

Merci pour ces propositions, le résultat recherché est la.

mais je vais utiliser la solution de job75 j'y ai ajouté :
Code:
Private Sub ComboBox1_Change()

Dim lignes As Long, b As Range
With Sheets("Feuil2")
       lignes = Sheets("Feuil2").Range("A65536").End(xlUp).Row + 1
        For Each b In Sheets("Feuil2").Range("A1", Sheets("Feuil2").Range("A65536").End(xlUp))
        If ComboBox1.Value = b Then
            .Cells(b.Row, 1).EntireRow.Delete
            lignes = lignes + 1
            End If
            
        Next b
End With

End Sub
et :
Code:
Private Sub ComboBox1_Click()

With Feuil2 'CodeName de la feuille
ComboBox1.List = .UsedRange.Value
End With

End Sub
qui me permet de rendre ma liste active (les noms précédemment sélectionnés disparaissent au fur et à mesure)

MERCI encore à vous 3
toujours flatté de voir des pointures comme vous répondre à mes interrogations

Cordialement
 

job75

XLDnaute Barbatruc
Re : combo sur 2 colonne d'une liste filtrée

Bonjour Chombi, mapomme, JB,

Pour retirer une ligne de la ComboBox pas besoin de toucher à la liste en Feuil2 :

Code:
Private Sub ComboBox1_Change()
With ComboBox1
  If .ListIndex >= 0 Then .RemoveItem .ListIndex
End With
End Sub
Bonne journée.
 

Chombi

XLDnaute Occasionnel
Re : combo sur 2 colonne d'une liste filtrée

Bonjour job75

merci en effet c'est mieux, j'ai toujours tendance à aller vers ce que je connais et comme tout les chemins mènent à Rome.... cela dit plus ou moins vite et vite c'est mieux :)
 

Chombi

XLDnaute Occasionnel
Re : combo sur 2 colonne d'une liste filtrée

Bonjour le Forum me revoilà j’espère la dernière fois avec mes tries et mes filtres

je r'ouvre ce fil, je ne voulais pas abuser mais je ne m'en sort pas

ci joint fichier

j'ai 2 pb : - je voudrai qu'a chaque ouverture du UF la liste se réinitialise, ça fonctionne bien à la première ouverture
mais il me manque des données à la seconde ouverture puis a la troisième etc... et parfois je ne sais pourquoi mais ça fonctionne ?????

- et je voudrai dans :
Code:
Private Sub ComboBox1_Change()
pouvoir attribuer un num en C en fonction du nom et du prénom j'ai essayé :
Code:
If Me.ComboBox1.Column(0).Value = A And Me.ComboBox1.Column(1).Value = A.Offset(0, 1) Then
mais ça ne fonctionne pas

Merci

P.S bonjour job75
Pour retirer une ligne de la ComboBox pas besoin de toucher à la liste en Feuil2
pour finir je n'ai pas su faire autrement que de toucher à la liste en feuil 2 ma liste ne s’actualisait pas à chaque sélection dans le combo
 

Pièces jointes

  • filtre et triel.xlsm
    31.4 KB · Affichages: 35
  • filtre et triel.xlsm
    31.4 KB · Affichages: 34
Dernière édition:

Chombi

XLDnaute Occasionnel
Re : combo sur 2 colonne d'une liste filtrée

e voudrai qu'a chaque ouverture du UF la liste se réinitialise, ça fonctionne bien à la première ouverture
mais il me manque des données à la seconde ouverture puis a la troisième etc... et parfois je ne sais pourquoi mais ça fonctionne ?????

Petite précision en fait cela fonctionne à la première ouverture je sélectionne des noms (tout va bien) quand je r'ouvre l'uf il me manque les noms précédemment sélectionnées, si je sélectionne un nom ma liste se vide, si je ferme avec la croix et que je r'ouvre tout redevient normal je doit avoir un bout de code mal placé mais je ne vois pas!

Merci
 

job75

XLDnaute Barbatruc
Re : combo sur 2 colonne d'une liste filtrée

Bonsoir Chombi,

Voyez le fichier joint, j'ai préféré refaire tout le code de l'UserForm :rolleyes:

Avec tous les doublons en Feuil1 la feuille "Filtre" devenait vraiment inutile (et nuisible), je l'ai supprimée.

Bonne nuit.
 

Pièces jointes

  • filtre et tri(1).xlsm
    33.7 KB · Affichages: 40
Dernière édition:

job75

XLDnaute Barbatruc
Re : combo sur 2 colonne d'une liste filtrée

Bonjour Chombi, le forum,

J'avais complètement zappé les prénoms et la 2ème colonne de la ComboBox.

C'est corrigé dans ce fichier (2).

Edit : ajouté un bouton pour la RAZ de l'ordre en colonne C.

Bonne journée.
 

Pièces jointes

  • filtre et tri(2).xlsm
    35.9 KB · Affichages: 31
Dernière édition:

Chombi

XLDnaute Occasionnel
Re : combo sur 2 colonne d'une liste filtrée

Bonjour job75

depuis 6h00 ce matin j'essaie de trouver un moment pour répondre à votre fil d'hier soir, au moment de le poster vous y avez déjà répondu... impressionnant

un grand grand merci
je ne sais comment vous remercier c'est vraiment super sympa, vous avez du y passer un peu de temps!

si il est possible d'avoir une petite explication pour me perfectionner et peut être aider un jour quelqu'un qui sera dans ma situation
En effet certaines parties sont au delà de mes compétences :
Code:
Sub tri(a, gauc, droi)       ' Quick sort
........
If gauc < d Then Call tri(a, gauc, d)
End Sub
je vois bien le lien avec :
Code:
  If d.Count Then
    a = d.keys
    tri a, 0, UBound(a)
    ComboBox1.List = a
  End If
je suppose que ça trie le combo mais...

encore merci
 

job75

XLDnaute Barbatruc
Re : combo sur 2 colonne d'une liste filtrée

Re,

Utilisez le fichier (2) de mon post #12 SVP.

La macro de tri Quick sort trie le tableau a (vecteur ligne) avant que le tableau b (2 colonnes) soit rempli.

La liste de la ComboBox est établie à partir du tableau b.

Pour finir j'ai testé avec un tableau de 100 000 lignes (sans doublon).

Sur Win 8 - Excel 2013 :

- la macro UserForm_Initialize s'exécute en 3,9 secondes

- la macro ComboBox1_Change s'exécute en 0,53 seconde.

C'est très satisfaisant.

A+
 

Discussions similaires

Réponses
2
Affichages
119

Statistiques des forums

Discussions
312 294
Messages
2 086 891
Membres
103 404
dernier inscrit
sultan87