Slection à l'intérieur d'un Range

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

GeoTrouvePas

XLDnaute Impliqué
Bonsoir tout le monde !

Je viens de gratter un peu sur le net et de trouver un moyen d'alimenter une listbox sans doublons grâce au code suivant :

Code:
Private Sub UserForm_Initialize()
    Dim Cell As Range
    Dim Unique As New Collection
    Dim Valeur As Range
    Dim i As Integer
    
    i = Range("A65536").End(xlUp).Row
    
    On Error Resume Next
    For Each Cell In Range("A1:A" & i)
        Unique.Add Cell, CStr(Cell)
    Next Cell
    On Error GoTo 0
    
    For Each Valeur In Unique
        Me.ListBox1.AddItem Valeur
    Next Valeur
End Sub

Jusque là, rien d'extraordinaire.
Mon problème est que je voudrais adapter cette procédure pour faire tourner la boucle sur un Range comportant plusieurs colonnes. J'aurai donc besoin de remplacer :

Code:
For Each Cell In Range("A1:A" & i)

par une formule voulant dire :

For Each Cell In "dans première colonne de " Range("Table_employes")

Malgrè plusieurs recherches, je ne trouve pas comment manipuler l'objet Range de cette façon.

Auriez - vous une idée ?

Merci de vos réponses.

Edit Sélection à l'intérieur d'un Range
 
Dernière édition:
Re : Slection à l'intérieur d'un Range

La fonction range accepte 2 paramètres
Générer par la fonction Cells

Donc RANGE(Cells(ligne,colonne), cells(ligne,colonne))

Pour "A1:A" & i

tu met RANGE(cells(1,1), cells(i,1))

pour "B1:B" & i
tu met RANGE (cells(1,2), cells(i,2))
 
Re : Slection à l'intérieur d'un Range

Merci mais ça ne résoud pas tout à fait mon problème.
J'ai du mal m'exprimer en fait.

Je voudrais savoir comment faire tourner la boucle :

Code:
For each cell in Range("Table_employe")

uniquement sur la première colonne de Range("Table_employe")

Cette plage étant amenée à être déplacée ou redimensionner, utiliser une formule du genre RANGE(cells(1,1), cells(i,1)) ne serait pas une façon pérenne de gérer cette boucle.

J'ai téléchargé un énorme pdf de formation sur vba, j'en ai lu beaucoup ce week end mais je me suis arrété au début du chapitre sur la méthode Range. Je l'ai pas sous la main et impossible de le retrouver sur le net ^^


Edit : Je viens de penser que je pourrais peut être utiliser xldown et xlup pour retrouver les coordonnées de la première colonne de ma plage et m'en servir de la façon que tu indiquais. Mais ça me titille quand même de savoir si on peut pas désigner directement la première colonne d'une plage.
 
Dernière édition:
Re : Slection à l'intérieur d'un Range

Bonsoir le fil 🙂
For Each Cell In "dans première colonne de " Range("Table_employes")
Tu peux utiliser
Code:
Range("Table_employes").Columns(1)
Par contre, il semblerait qu'une Collection soit très lente et qu'il vaux mieux utiliser un Dictionary. Tu peux aller faire un tour sur le site de JB et cliquer sur Dictionary sur la première page, tu trouveras des codes rapides pour alimenter ta ListBox sans doublon, et même triée 😉.
Bonne soirée 😎
 
Re : Slection à l'intérieur d'un Range

Bonsoir,
Code:
Dim Unique As New Collection
For i = 1 To Range("Table_employes").Rows.Count
    On Error Resume Next
    cell = Range("Table_employes")(i, 1).Value
    Unique.Add cell, CStr(cell)
    On Error GoTo 0
Next
'....
Ou encore...
Code:
Dim Unique As New Collection
T = Range("Table_employes").Value
For i = LBound(T) To UBound(T)
    On Error Resume Next
    Unique.Add T(i, 1), CStr(T(i, 1))
    On Error GoTo 0
Next
'...
Ou encore...
A+
kjin
 
Dernière édition:
Re : Slection à l'intérieur d'un Range

Range("Table_employes").Columns(1) ???
C'est aussi simple que ça ???

Et dire que je me cassé le crâne pendant pas loin d'une heure ^^

Les syntaxes les plus simples sont toujours les meilleurs comme on dit.

Merci à tous pour vos réponses Habitude, Kjin et JNP.
Je vais tester ça dès demain.

Bonne soirée tout le monde !
 
Re : Slection à l'intérieur d'un Range

Bonsoir à tous


Pour ne pas faire si simple que cela 😀
(et pour varier les plaisirs)


Code:
Sub a()
Dim c As Range
With [Table_employes]
    For Each c In .Item(1).Resize(.Rows.Count)
    MsgBox c.Address
    Next
End With
End Sub

PS: si tu veux la 3èm colonne alors
For Each c In .Item(1,3).Resize(.Rows.Count)
 
Re : Slection à l'intérieur d'un Range

Merci ça marche impeccable !

Par contre j'ai juste un petit soucis. Avec la commande :

Code:
Range("Table").Columns(1).Cells.Find(Login).Row

je recherche dans quelle ligne de la plage "Table" se trouve ma variable Login.

Mon soucis est que ça me renvoi une référence absolue alors que je souhaiterais obtenir une référence relative à l'intérieur de ma plage "Table" histoire de pas avoir de problème si jamais je déplace mes plages.

Je sais pas si j'ai été très clair ^^.

Merci de votre aide
 
Re : Slection à l'intérieur d'un Range

Par contre, il semblerait qu'une Collection soit très lente et qu'il vaux mieux utiliser un Dictionary. Tu peux aller faire un tour sur le site de JB et cliquer sur Dictionary sur la première page, tu trouveras des codes rapides pour alimenter ta ListBox sans doublon, et même triée 😉.

Je reviens sur ce sujet car, comme tu me l'avais conseillé, je suis allé consulter le site de JB qui soit dit en passant est une incroyable mine d'informations très utiles. Je m'étais permis d'utiliser une Collection car ma procédure ne devrait tourner que sur un tableau d'une cinquaintaine de lignes grand maximum, situation où la lenteur de la Collection ne devrait pas trop se faire sentir. Mais pour un perfectionniste comme moi 😛, l'utilisation du Dictionnaire proposée par JB était bien trop tentante ^^. J'ai donc adapté sa procédure à ma situation ce qui, pour info, donne :

Code:
Sub AlimenterCombo()
    Debut = Range("Table_Tiers").Rows(1).Row
    Fin = Range("Table_Tiers").End(xlDown).Row

    Set MonDico = CreateObject("Scripting.Dictionary")

    For i = Debut To Fin
        If Cells(i, Range("Table_Tiers").Columns(1).Column) = Utilisateur_Service Then
        MonDico.Item(i) = Cells(i, Range("Table_Tiers").Columns(2).Column)
            NCombo1.List = MonDico.items
        End If
    Next
End sub

Mais voilà, en farfouillant sur un autre site, je suis tombé sur la procédure suivante :

Code:
Sub AlimenterCombo()
Dim j As Integer
'Récupère les données de la colonne A...
For j = 1 To Sheets("test").Range("A1").End(xlDown).Row
ComboBox1 = Range("A" & j)
'...et filtre les doublons
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
Next j
End Sub

Je suis fort étonné que quelqu'un comme JB soit allé chercher une procédure aussi complexe que le Dictionnaire alors qu'une solution aussi simple était faisable. Je me suis donc dit qu'il devait exister une différence entre ces deux procédures où que la seconde devait peut être déconner dans certains cas. J'ai essayé de comparer, d'analyser et de tester les deux mais je ne trouve pas le hic.

Est ce que quelqu'un saurait me donner un avis éclairé sur le sujet ? (notamment sur ce que veux dire ComboBox1.ListIndex = -1)

Merci à tous et bonne journée
 
Re : Slection à l'intérieur d'un Range

Re 🙂,
Effectivement, cette procédure est simple (je ne connaissais pas), et fonctionne très bien, mais, sur des grosses listes, elle sera forcément un peu lente (et pas triée alphabétiquement 😛).
Le fonctionnement, c'est un peu le jeu des erreurs : je mets la valeur dans le combo, je regarde, si son ListIndex est -1, c'est qu'il n'était pas dans la liste car il aurait une valeur de 0 et plus, et je l'ajoute, sinon, je passe à la valeur suivante.
Bonne suite 😎
 
Re : Slection à l'intérieur d'un Range

J'ai trouvé ça dans les tutoriaux très complets d'un autre site. Pour ce qui est du tri alphabétique, il me semble qu'il y avait une procédure à part que je n'ai pas pris la peine de recopier car inutile dans ce post.

Merci pour tes renseignements et bonne fin de journée.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
587
Réponses
7
Affichages
450
Réponses
2
Affichages
526
Retour