IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri dans une ComboBox [XL-2000]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    987
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 987
    Par défaut Tri dans une ComboBox
    Bonjour au Forum ,

    Mon problème du jour se situe dans le tri d'une ComboBox
    en fait , je souhaite trier dans l'ordre croissant ma liste de presentation
    or mon combobox possède 2 colonnes , l'une pour les données et l'autre
    pour le N° de ligne
    Lorsque je selectionne ma donnée , çà se plante dlans la liste Index et j'avoue ne pas savoir quoi faire pour m'en sortir

    voici le code utilisé
    1 ) d'abord l'init de la combobox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Dim temp
    '----- definition de ComboBox1 à 2 colonnes
    With Me.ComboBox1
       .ColumnCount = 2
       .ColumnWidths = .Width - 2 & ";0"
    End With
    '-- Remplissage de la ComboBox1 sans doublons
    Set T = CreateObject("Scripting.Dictionary")
    With Sheets("B")
       For Each c In .Range("M2", .Cells(Rows.Count, 13).End(xlUp))
         With Me.ComboBox1
            If c.Offset(0, 0) <> Empty Then
               .AddItem c.Offset(0, 0)
               .List(.ListCount - 1, 1) = c.Row
               T.Item(c.Value) = c.Value
            End If
         End With
       Next c
    End With
    temp = T.items
    Tri temp, LBound(temp), UBound(temp) ' tri dans l'ordre croissant des données
    Me.ComboBox1.List = temp

    2) puis lors de la selection , l'objet du plantage

    "Impossible de lire la propriété List : Argument non valide "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Private Sub ComboBox1_Change()
    If Me.ComboBox1.ListIndex > -1 Then LigBase = Me.ComboBox1.List(Me.ComboBox1.ListIndex, 1)
    Pourtant à l'affichage ma liste est triée , mais je pense que ma colonne 2 n'est pas réactualisée correctement d'où peut-être le pb ...

    Votre aide me serait d'un grand secours

    Mille mercis par avance
    A+

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heuh!!!
    bonjour


    deja la il y a un truc que je ne comprend pas tres bien

    "If c.Offset(0, 0) <> Empty Then" 0 et 0 sinifie que tu parle de la celule elle meme donc a quoi sert le offset




    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    987
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 987
    Par défaut RE
    Merci pour ta reponse patricktoulon

    L'offset me sert à eliminer les cellules vides pour avoir une liste
    homogène , c'est cette même liste que je souhaite triéer dans le sens croissant
    mais bien sûr avec les n° de lignes appairées ( 2ieme colonne ) et c'est là que je ne sais plus faire

    en fait j'ai un combobox avec 2 colonnes
    la première comporte mes données à choisir
    la seconde les N° de lignes des données

    si je trie la première , la seconde doit suivre mais là çà se plante...

    j'espère avoir été un tout petit peu plus clair


    Cordialement
    A+

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonjour,
    Si tu as des doublons dans la source données de ta combo, la 2ème colonne de combobox1 sera remplie par la ligne de la dernière donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Private Sub UserForm_Initialize()
    Dim Collect As New Collection
    Dim c As Range
    Dim Temp() As String
    Dim i As Integer
     
    '----- definition de ComboBox1 à 2 colonnes
    With Me.ComboBox1
        .ColumnCount = 2
        .ColumnWidths = .Width - 2 & ";0"
    End With
     
    With Sheets("B")
        For Each c In .Range("M2", .Cells(Rows.Count, 13).End(xlUp))
            On Error Resume Next
            Collect.Add c.Value, c.Value
            On Error GoTo 0
        Next c
        For i = 1 To Collect.Count
            ReDim Preserve Temp(1 To 2, 1 To i)
            Temp(1, i) = Collect.Item(i)
        Next i
     
    Tri Temp(), 1, UBound(Temp, 2)
     
    For i = 1 To UBound(Temp, 2)
        Set c = .Range("M2", .Cells(Rows.Count, 13).End(xlUp)).Find(Temp(1, i), lookat:=xlWhole, SearchDirection:=xlPrevious)
        Temp(2, i) = c.Row
        Set c = Nothing
    Next i
    End With
    Me.ComboBox1.List = Application.Transpose(Temp())
     
    End Sub
     
    'QuickSort
    Public Sub Tri(Tablo() As String, ByVal Deb As Long, ByVal Fin As Long)
    Dim Moy As String, Mx As String, Mn As String
    Dim i As Long
     
    If Deb >= Fin Then Exit Sub
    i = Int((Fin - Deb + 1) * Rnd + Deb)
    Moy = Tablo(1, i)
    Tablo(1, i) = Tablo(1, Deb)
    Mn = Deb: Mx = Fin
    Do
        Do While Tablo(1, Mx) >= Moy
            Mx = Mx - 1
            If Mx <= Mn Then Exit Do
        Loop
        If Mx <= Mn Then
            Tablo(1, Mn) = Moy
            Exit Do
        End If
        Tablo(1, Mn) = Tablo(1, Mx)
        Mn = Mn + 1
        Do While Tablo(1, Mn) < Moy
            Mn = Mn + 1
            If Mn >= Mx Then Exit Do
        Loop
        If Mn >= Mx Then
            Mn = Mx
            Tablo(1, Mx) = Moy
            Exit Do
        End If
        Tablo(1, Mx) = Tablo(1, Mn)
    Loop
    Tri Tablo(), Deb, Mn - 1
    Tri Tablo(), Mn + 1, Fin
    End Sub

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    987
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 987
    Par défaut RE
    Merci mercatog

    je digère d'abord.....
    mais pour une meilleure comprehension
    peux-tu m'expliquer le terme "collect" que tu as employé
    j'avoue ne pas connaitre ce terme
    et surtout sa finalité

    tu dis ..
    Si tu as des doublons dans la source données de ta combo, la 2ème colonne de combobox1 sera remplie par la ligne de la dernière donnée
    Serait-ce la cause du palntage ?


    merci en tout cas pour ta proposition
    je te recontacte ...après digestion lol

    Cordialement
    A

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    J'avais utilisé une collection pour "gérer" les doublons. sinon une autre proposition reprenant le scripting.dictionary
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    Private Sub UserForm_Initialize()
    Dim MonDico As Object
    Dim c As Range
    Dim Temp() As String, TabVal() As String, TabRw() As Long
    Dim i As Integer
     
    With Me.ComboBox1
        .ColumnCount = 2
        .ColumnWidths = .Width - 2 & ";0"
    End With
    With Sheets("B")
        Set MonDico = CreateObject("Scripting.Dictionary")
        For Each c In .Range("M2", .Cells(Rows.Count, 13).End(xlUp))
            If Not MonDico.exists(c.Value) And c.Value <> "" Then
                i = i + 1
                MonDico(c.Value) = c.Value
                ReDim Preserve TabVal(1 To i)
                TabVal(i) = c.Value
                ReDim Preserve TabRw(1 To i)
                TabRw(i) = c.Row
            End If
        Next c
        ReDim Temp(1 To 2, 1 To MonDico.Count)
        For i = 1 To MonDico.Count
            Temp(1, i) = TabVal(i)
            Temp(2, i) = TabRw(i)
        Next i
        Tri Temp(), 1, UBound(Temp, 2)
    End With
    Me.ComboBox1.List = Application.Transpose(Temp())
     
    End Sub
    'QuickSort tableau à 2 dimensions
    Public Sub Tri(Tablo() As String, ByVal Deb As Long, ByVal Fin As Long)
    Dim Moy As String, Mx As String, Mn As String
    Dim i As Long, Rw As Long
     
    If Deb >= Fin Then Exit Sub
    i = Int((Fin - Deb + 1) * Rnd + Deb)
    Moy = Tablo(1, i)
    Rw = Tablo(2, i)
    Tablo(1, i) = Tablo(1, Deb)
    Tablo(2, i) = Tablo(2, Deb)
    Mn = Deb: Mx = Fin
    Do
        Do While Tablo(1, Mx) >= Moy
            Mx = Mx - 1
            If Mx <= Mn Then Exit Do
        Loop
        If Mx <= Mn Then
            Tablo(1, Mn) = Moy
            Tablo(2, Mn) = Rw
            Exit Do
        End If
        Tablo(1, Mn) = Tablo(1, Mx)
        Tablo(2, Mn) = Tablo(2, Mx)
        Mn = Mn + 1
        Do While Tablo(1, Mn) < Moy
            Mn = Mn + 1
            If Mn >= Mx Then Exit Do
        Loop
        If Mn >= Mx Then
            Mn = Mx
            Tablo(1, Mx) = Moy
            Tablo(2, Mx) = Rw
            Exit Do
        End If
        Tablo(1, Mx) = Tablo(1, Mn)
        Tablo(2, Mx) = Tablo(2, Mn)
    Loop
    Tri Tablo(), Deb, Mn - 1
    Tri Tablo(), Mn + 1, Fin
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [Débutant] Faire un tri sur un dataset d'après la selection dans une combobox
    Par j_quillet dans le forum C#
    Réponses: 0
    Dernier message: 28/03/2015, 23h22
  3. [XL-2000] Tri décroissant dans une combobox
    Par cobra38 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/12/2010, 16h47
  4. [VB+IE] Comment sélectionner dans une combobox d'une page IE
    Par danje dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 03/05/2005, 09h10
  5. Tri dans une DBGrid sur un champ date au format jj/mm
    Par Jeankiki dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/10/2004, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo