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 :

Faire un tris sur trois niveaux


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut Faire un tris sur trois niveaux
    Bonjour, comme l'indique le tutre, j'essaie de faire trois niveaux de tris pour des données mais je n'y parviens pas.

    J'ai tableau où chaque ligne représente un élément qui est caractérisé par quatre informations données dans quatre colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom; Type1; Type2; Niveau
    Type1 peut prendre deux valeurs :
    Type2 peut prendre trois valeurs :
    Niveau est un entier positif.

    J'obtiens donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ligne 1. aaa beta  Y 2
    ligne 2. bbb alpha Y 1
    ligne 3. ccc alpha X 2
    etc.
    Je voudrais faire un premier niveau de tris en deux colonnes des Type1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    colonne_alpha; colonne_beta
    avec respectivement tous les noms des éléments alpha et beta dans les colonnes "colonne_alpha" et "colonne_beta"

    Il faudrait ensuite un second niveau de tris :
    Dans les colonnes "colonne_alpha" et "colonne_beta", les éléments doivents s'afficher dans l'ordre suivant :
    Tous les "X" puis les "Y" puis les "Z"

    Finalement, un troisième niveau de tris avec un classement par niveau.

    Cela donne donc tous les Type2 X classés du plus petit au plus grand, puis tous les Type 2 Y, classés du plus petit au plus grand etc. et ce, pour les deux colonne "colonne_alpha" et "colonne_beta".

    Je suppose que je ne suis pas le premier à rechercher à faire quelques chose dans ce style mais je n'ai pas trouvé de tutorial.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Si tu es capable de le faire directement dans Excel ?, enregistre une macro qui le fait et le problème est résolu !

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voir une de mes contributions "Procédure de tri pour Excel 2003-2010"
    Le lien se trouve en dessous de ma signature
    Il y a un fichier exemple qui est téléchargeable.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses. J'ai regardé votre fichier mais j'ai du mal à bien comprendre car je ne connais pas du tout les macros ni le VBA. Il y a-t-il un moyen de faire cela directement avec les fonctions même si c'est laborieux?

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La discussion est classée dans Macro et VBA, je suppose donc que c'est une procédure VBA qui est souhaitée or dans ma contribution, c'est une procédure VBA avec arguments à passer qui est proposée. Tout est expliqué dans la discussion.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    En effet, j'ai dû me tromper de section. Je vais essayer de comprendre votre exemple ainsi que la création de macros.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si c'est pour faire un tri sur plusieurs niveaux sans utilisation de VBA,
    Il suffit de cliquer sur la commande Tri du groupe Trier et Filtrer de l'onglet [Données]
    Dans la boite de dialogue qui va apparaître cliquer sur le bouton Ajouter un niveau et choisir les options proposées.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Expert éminent sénior 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
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour

    Une autre proposition purement vba qui utilise des variables tableaux et l'algorithme de tri rapide QuickSort.

    Les données sont en feuille Feuil1 de A2 à Dxx et les résultat est donnée en colonne F et G

    Code à adapter
    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
    74
    75
    76
    77
    78
    79
    Option Explicit
     
    Sub Initial()
    Const Alpha As String = "ALPHA"
    Const Beta As String = "BETA"
    Dim LastLig As Long, i As Long, a As Long, b As Long
    Dim Tb, TbA(), TbB()
     
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row
        a = Application.CountIf(.Range("B2:B" & LastLig), Alpha)
        b = Application.CountIf(.Range("B2:B" & LastLig), Beta)
        Tb = .Range("A2:D" & LastLig)
     
        ReDim TbA(1 To a, 1 To 1)
        ReDim TbB(1 To b, 1 To 1)
     
        a = 0
        b = 0
        For i = 1 To UBound(Tb, 1)
            If UCase(Tb(i, 2)) = Alpha Then
                a = a + 1
                Remplir TbA, a, Tb, i
            ElseIf UCase(Tb(i, 2)) = Beta Then
                b = b + 1
                Remplir TbB, b, Tb, i
            End If
        Next i
     
        TriRapide TbA, 1, a
        TriRapide TbB, 1, b
     
        Resultat TbA
        Resultat TbB
     
        .Range("F2").Resize(a, 1) = TbA
        .Range("G2").Resize(b, 1) = TbB
    End With
    End Sub
     
    Private Sub Remplir(ByRef TbX, ByVal x As Long, ByVal Tb, ByVal i As Long)
     
    TbX(x, 1) = Tb(i, 3) & "µ" & Tb(i, 4) & "µ" & Tb(i, 2) & "µ" & Tb(i, 1)
    End Sub
     
     
    Private Sub TriRapide(ByRef Tb, ByVal Bas As Long, ByVal Haut As Long)
    Dim Md As String, Tmp As String
    Dim m As Long, n As Long
     
    m = Bas
    n = Haut
    Md = Tb((Bas + Haut) \ 2, 1)
    Do While m <= n
        Do While Tb(m, 1) < Md And m < Haut
            m = m + 1
        Loop
        Do While Md < Tb(n, 1) And n > Bas
            n = n - 1
        Loop
        If m <= n Then
            Tmp = Tb(m, 1)
            Tb(m, 1) = Tb(n, 1)
            Tb(n, 1) = Tmp
            m = m + 1
            n = n - 1
        End If
    Loop
    If Bas < n Then TriRapide Tb, Bas, n
    If m < Haut Then TriRapide Tb, m, Haut
    End Sub
     
    Private Sub Resultat(ByRef TbX)
    Dim i As Long
     
    For i = 1 To UBound(TbX, 1)
        TbX(i, 1) = Split(TbX(i, 1), "µ")(3)
    Next i
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Si c'est pour faire un tri sur plusieurs niveaux sans utilisation de VBA,
    Il suffit de cliquer sur la commande Tri du groupe Trier et Filtrer de l'onglet [Données]
    Dans la boite de dialogue qui va apparaître cliquer sur le bouton Ajouter un niveau et choisir les options proposées.
    En effet, mais je souhaiterais que cela se fasse automatiquement. Par exemple, dès que je rentre une nouvelle série de données. De ce que je comprends après avoir regardé à droite et à gauche, seules les macros peuvent faire cela.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En effet, mais je souhaiterais que cela se fasse automatiquement. Par exemple, dès que je rentre une nouvelle série de données. De ce que je comprends après avoir regardé à droite et à gauche, seules les macros peuvent faire cela.
    Oui effectivement. D'où la raison qui m'a poussé à écrire une procédure qui utilise la méthode Sort de l'objet Range et qui est limitée à trois niveaux pour garder la compatibilité avec la version 2003.
    Il suffit d'associer cette procédure à une procédure événementielle Activate et/ou desactivate de l'objet WorkSheet
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_Deactivate()
     SortTable Me.Range("A1"), "-9;2"
    End Sub
    Au moment où l'on quitte la feuille (représentée par ME), tri des colonnes 9 et 2 de la table de données débutant en A1. Pour la colonne 9, le tri est décroissant.
    Sur mon blog, j'ai mis une nouvelle version de ma procédure qui permet de ne plus référencer la cellule de début si la table à trier débute en A1
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Merci, je commence à comprendre comment cela fonctionne. J'aurais cependant une autre question.

    Dans la feuille de calcul, Si j'ai une colonne A avec des noms et une colonne B avec des nombres, est-ce possible de les copier dans les colonnes C et D après un tri par ordre croissant des nombres de la colonne B.

    De plus, il faudrait que cela soit automatique : dès que je rajoute un nom dans la colonne A et un nombre dans la colonne B, il faudrait qu'ils soient transférés dans les colonnes C et D et triés avec les autres.

    J'ai mis un exemple au cas où je ne serais pas clair.

    Edition : petite précision. Cela semble être le cas dans votre exemple sur votre blog (sauf l'automatisation) mais le résultat est un gros bloc alors que je voudrais vraiment avoir le résultat dans des cellules.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Aide pour faire un tri sur Excel
    Par legolas51 dans le forum Excel
    Réponses: 4
    Dernier message: 05/09/2008, 16h23
  2. [MySQL] Faire un tri sur un des deux arguments d'un SET
    Par mathieugamin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/11/2006, 16h52
  3. [VBA-E] Macro Pour Faire un Tri sur plage variable
    Par tabarly35 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/09/2006, 19h02
  4. Comment faire un Tri sur plusieurs champs
    Par guile153 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2006, 12h52

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