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 :

Opérateur de comparaison modifiable [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Opérateur de comparaison modifiable
    Bonjour,
    J'utilise une procédure qui me permet sur un évènement click de trier une ListBox multi-colonnes sur la colonne choisie.
    Je veux passer alternativement d'un tri croissant à un tri décroissant sans avoir à dupliquer la procédure (croissant, décroissant) juste pour un changement d'opérateur de comparaison.

    Et-il possible d'écrire une structure de test avec un opérateur de comparaison modifiable ?

    Par avance, merci

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il y a sûrement moyen. Le plus simple serait de nous donner ta procédure.

    Comme solution, je vois l'utilisation d'une variable de type Integer déclarée en Static dans la procédure évènementielle.

    Lors d'un clic, la variable est testée et tu branches sur la portion de code qui va bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Liste_OnClick()
    static commutateur as integer ' 0 = aucun tri, 1 = ascendant, 2 = descendant
    select case commutateur
        case 0, 2
            ' On trie par ordre croissant
            commutateur=1
        case 1
            ' On trie par ordre décroissant
            commutateur=2
    end select
    Non testé. A voir avec ta proc

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    J'ai adapté une procédure de Jacques BOISGONTIER (voir ci-dessous).
    En faite je voulais garder le même code et faire varier l'opérateur de comparaison (< ou >) en le passant par exemple en argument.
    Seulement à y regarder de plus près et en faisant des tests, je viens de m'apercevoir que que la procédure de JB est bien plus compliquée qu'il n'y paraît. Le changement d'ordre (croissant/décroissant) ne se fait pas uniquement en inversant l'opérateur de comparaison...
    Désolé j'ai mal analysé mon besoin.
    Je vais retravailler mon sujet sauf si tu as la solution
    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
     
    Sub tri(a(), gauc, droi, NbCol, colTri) ' Source => http://boisgontierjacques.free.fr/pages_site/formulaireListes2colonnes.htm
        ref = a((gauc + droi) \ 2, colTri)
        g = gauc: D = droi
        Do
            Do While a(g, colTri) < ref: g = g + 1: Loop
            Do While ref < a(D, colTri): D = D - 1: Loop
            If g <= D Then
                For C = 0 To NbCol - 1
                    temp = a(g, C): a(g, C) = a(D, C): a(D, C) = temp
                Next
                g = g + 1: D = D - 1
            End If
        Loop While g <= D
        If g < droi Then Call tri(a, g, droi, NbCol, colTri)
        If gauc < D Then Call tri(a, gauc, D, NbCol, colTri)
    End Sub

  4. #4
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    D'où viennent les données de ta liste ?

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 925
    Points
    55 925
    Billets dans le blog
    131
    Par défaut
    Ne serait-il pas plus simple de baser ta liste déroulante sur une plage de données? Ainsi, il te suffit de trier la plage de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub cmdTriCol1_Click()
      Static Ordre As Integer
     
      Select Case Ordre
        Case 1
          Feuil3.Range("a1:c4").Sort key1:=Feuil3.Range("a1"), order1:=xlDescending, Header:=xlYes
          Ordre = 2
        Case Is <> 1
          Feuil3.Range("a1:c4").Sort key1:=Feuil3.Range("a1"), order1:=xlAscending, Header:=xlYes
          Ordre = 1
      End Select
    End Sub
    [EDIT]
    Il faut évidemment adapter la plage à ta situation, et il est préférable de travailler avec une plage nommée pour que ses dimensions puissent être dynamiques.
    [/EDIT]

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    J'initialise la Listbox avec la procédure ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub Rech()
        Chem = Workbooks("GPOTM.xls").Worksheets("Param").Cells(1, 2).Value
        If Chem = "" Then Exit Sub
        Nom = Dir(Chem & "\" & "*.OTM")
            Do Until Nom = ""
                    Lbx_ListeDoc.AddItem (Left(Nom, Len(Nom) - 4))
                    Lbx_ListeDoc.List(Lbx_ListeDoc.ListCount - 1, 1) = CStr(FileDateTime(Chem & "\" & Nom))
                    N = N + 1
                Nom = Dir
            Loop
        If N = 1 Then Lbx_ListeDoc.ListIndex = 0
    End Sub

  7. #7
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Les procédures de tri sont toujours compliquées. Tu devrais réfléchir à la suggestion de Pierre Fauconnier.

    Tu peux :
    • Utiliser un nom défini pour ta combobox (Dans un contrôle ActiveX, on ouvre la fenêtre des propriétés et on renseigne la Propriété ListFillRange : ndNomDefini. Dans un contrôle de formulaire, on ouvre Format de contrôle, onglet Contrôle et dans Plage d’entrée on écrit le nom du nom défini.)
    • Ecrire les noms de fichier dans une plage, éventuellement une feuille cachée
    • Trier la plage
    • Modifier le nom défini pour qu'il référence la plage en question.


    Mais ce n'est qu'une suggestion.

    Sinon, pour répondre à ta question initiale, il serait plus clair de faire 2 procédures, une pour chaque sens de tris. Sinon tu vas mettre des Select case, ou des If...Then et tu vas finir par écrire les 2 procédures imbriquées plus les tests...

    Cordialement,

    PGZ

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci à tous,
    Vous m'avez convaincu que le plus simple est souvent facteur de réussite.
    Je reprends mon code sur les bases proposées par Pierre Fauconnier.

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

Discussions similaires

  1. [Débutant] Opérateur de comparaison modifiable par le code
    Par noftal dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/11/2013, 20h44
  2. LIKE et opérateurs de comparaison
    Par celeamas dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/10/2006, 14h01
  3. Pb avec l'opérateur de comparaison IN
    Par petitnuage dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 16h13
  4. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 11h58
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

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