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 :

Trier des données par ordre croissant


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut Trier des données par ordre croissant
    Bonjour
    Je dispose d'un tableau "Tableau4" sur ma feuille "Données"
    Ce tableau à 7 colonnes (Jour, Date; Nbre1, Nbre2, Nbre3, Nbre4, Nbre5) et 1350 lignes
    Il y a t'il une possibilité pour automatiser le "rangement" les nombres par ordre croissant sur la ligne ?
    En fait, sur une ligne (et les colonnes de A:G), j'ai par exemple

    A B C D E F G
    Lundi 13/04/2020 12 6 32 4 120


    Je voudrais passer en :
    A B C D E F G
    Lundi 13/04/2020 4 6 12 32 120

    Et cela pour les 1350 lignes

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par texas2607 Voir le message
    Bonjour,

    Sur les colonnes de I à M par exemple, utilisez des fonctions GRANDE.VALEUR. Exemple en I2 =GRANDE.VALEUR($C$2:$G$2;5)

  3. #3
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonjour
    Je viens de tester et en mettant
    I2 =GRANDE.VALEUR($C$2:$G$2;5)
    J2 =GRANDE.VALEUR($C$2:$G$2;4)
    K2 =GRANDE.VALEUR($C$2:$G$2;3)
    L2 =GRANDE.VALEUR($C$2:$G$2;2)
    M2 =GRANDE.VALEUR($C$2:$G$2;1)

    cela me sort effectivement la ligne en ordre croissant.
    Mais comment copier cette formule sur 1350 lignes et par la suite remplacer mes données originales par celle triées ?
    IL n'y a pas un moyen de "l'automatiser", en vba ou autre ?

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par texas2607 Voir le message
    En dupliquant vers le bas les formules, puis en copiant-collant par specialvaleur les colonnes de I à M sur elles mêmes , puis en remplaçant les colonnes C:G par I:M.
    Sinon, tout est automatisable par VBA.

  5. #5
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    C'est bon, ça fonctionne.
    Merci pour tout et bonne soirée.

  6. #6
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Désolé mais j'ai une question subsidiaire
    Du coup j'utilise pour autre chose la formule.

    Sur d'autres tableaux j'ai à classer des chiffres du + vers le - mais le souci c'est que suivant le résultat d'autre calculs je peux avoir 5, 6 ou 7 chiffre à classer, donc ma formule peut-être :
    =GRANDE.VALEUR(Numéros!$B$4:$B$8;5)
    ou
    =GRANDE.VALEUR(Numéros!$B$4:$B$9;6)
    ou
    =GRANDE.VALEUR(Numéros!$B$4:$B$10;7)
    etc....

    Donc ma question est :
    Est-ce que cette formule peut être adapté en fonction de résultat de calcul ou alors est ce on peut la générer en VBA tel qu'on la veut et la coller dans des cellules ?

    Merci bien

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par texas2607 Voir le message
    Il suffit de mettre une condition SIERREUR pour les cas à 6 ou 7 nombres.
    Pièce jointe 559677

    En ce qui concerne, la mise en place des formules par VBA, placez déjà vos formules à la main. Créez une macro, et passez sur chaque cellule contenant une formule, mettez vous à la fin de la formule dans la barre de formule et faites Enter, fermez votre macro.

    Le résultat pour le vidage d'écran ci-dessus donne cela :
    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 Macro1()
        Range("C2").Select
        ActiveCell.FormulaR1C1 = "=LARGE(R4C2:R10C2,1)"
        Range("D2").Select
        ActiveCell.FormulaR1C1 = "=LARGE(R4C2:R10C2,2)"
        Range("E2").Select
        ActiveCell.FormulaR1C1 = "=LARGE(R4C2:R10C2,3)"
        Range("F2").Select
        ActiveCell.FormulaR1C1 = "=LARGE(R4C2:R10C2,4)"
        Range("G2").Select
        ActiveCell.FormulaR1C1 = "=LARGE(R4C2:R10C2,5)"
        Range("H2").Select
        ActiveCell.FormulaR1C1 = "=IFERROR(LARGE(R4C2:R10C2,6),"""")"
        Range("I2").Select
        ActiveCell.FormulaR1C1 = "=IFERROR(LARGE(R4C2:R10C2,7),"""")"
    End Sub
    Après, il vous faut la simplifier et la généraliser.

  8. #8
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    Exemple de tri horizontal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TriHoriz()
        n = [A1].CurrentRegion.Rows.Count
        For i = 0 To n - 2
         Set Rng = Range("C2:G2").Offset(i)
         Rng.Sort key1:=Rng.Cells(1, 1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortRows
        Next i
    End Sub


    Boisgontier
    Fichiers attachés Fichiers attachés

  9. #9
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    @Eric KERGRESSE
    Oups, désolé je me suis mis dedans.
    J'ai mentionné du + vers le - alors que c'est l'inverse. Toutes mes excuses


    Alors j'ai tenté d'adapter ce que tu m'a dis mais si je fais :
    B2 SIERREUR(GRANDE.VALEUR(Numéros!$B$4:$B$10;6);"")
    C2 GRANDE.VALEUR(Numéros!$B$4:$B$10;5)
    D2 GRANDE.VALEUR(Numéros!$B$4:$B$10;4)
    E2 GRANDE.VALEUR(Numéros!$B$4:$B$10;3)
    F2 GRANDE.VALEUR(Numéros!$B$4:$B$10;2)
    G2 GRANDE.VALEUR(Numéros!$B$4:$B$10;1)

    Si par exemple J'ai 6 chiffres alors c'est ok
    Si j'ai 5 chiffres alors la case B2 est vide et le tri commence en C2
    or c'est l'inverse pour mon tri, du + petit vers le + grand

    Et je viens de trouver la formule PETITE.VALEUR et en l'adaptant avec ta solution ca marche
    Merci bien

    @boisgontierjacques
    Merci je viens de tester c'est nickel

    Juste une chose :
    Peux tu m'expliquer ça : n = [A1].CurrentRegion.Rows.Count
    Car sur ma feuille j'ai plusieurs tableau, est ce qu'il est possible avec ta formule de la dédier à un tableau en particulier sans toucher les autres ?
    Merci


    Fred

  10. #10
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonsoir,
    @@boisgontierjacques
    J'arrive à faire fonctionner ta formule mais pas avec les tableaux, j'ai chaque fois une erreur :
    erreur d'exécution 1004
    La méthode sort de la classe Range a échoué
    Peux tu m'aider pour l'adapter à un tableau ?
    fichier exemple joint

    Merci
    Fichiers attachés Fichiers attachés

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,

    Il y a plusieurs blocs. Les blocs doivent être séparés par une ligne vide.
    Chaque ligne est triée.


    Nom : Sans titre - Copie (12).png
Affichages : 574
Taille : 13,6 Ko


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TriHoriz()
      Set début = Range("A1")
      Do While début <> ""
        Set RngBloc = début.CurrentRegion
        hauteur = RngBloc.Rows.Count
        n = hauteur - 1
        largeur = RngBloc.Columns.Count - 1
        For i = 0 To n - 1
         Set Rng = RngBloc.Offset(1, 1).Resize(, largeur).Offset(i)
         Rng.Sort key1:=Rng.Cells(1, 1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortRows
        Next i
        Set début = Cells(début.Row + hauteur + 1, 1)
       Loop
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  12. #12
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonjour
    Avec des données "rentrées brut" dans des cellules alors pas de souci avec ton code mais si je suis avec un tableau nommé tel que mis dans mon exemple alors cela ne fonctionne pas.

    J'ai ce fameux tableau "TableauResult" et c'est dans les cellules de ce tableau que je dois trier les cellules du - vers le +
    Dans l'exemple et ici, je l'ai positionné en A1 pour reprendre ton code mais sur ma feuille excel j'en ai plusieurs et à différents endroits.


    Nom : Capture.PNG
Affichages : 930
Taille : 16,9 Ko

    Merci

  13. #13
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    J'ai ajouté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      On Error Resume Next
      Range("TableauResult").ListObject.Unlist
      On Error GoTo 0
    Nom : Sans titre - Copie (14).png
Affichages : 523
Taille : 15,0 Ko


    Boisgontier
    Fichiers attachés Fichiers attachés

  14. #14
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Merci ça fonctionne mais cela me supprime le tableau et j'ai d'autres lignes de codes qui l'utilise
    Une possibilité une fois le tri effectué de redéclarer le tableau initial ?

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    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
    Sub TriHoriz()
      NomTableau = "TableauResult"
      On Error Resume Next
      champ = Range(NomTableau).Address
      Range(NomTableau).ListObject.Unlist
      On Error GoTo 0
      Set début = Range("A1")
      Do While début <> ""
        Set RngBloc = début.CurrentRegion
        hauteur = RngBloc.Rows.Count
        n = hauteur - 1
        largeur = RngBloc.Columns.Count - 1
        For i = 0 To n - 1
         Set RngLigne = RngBloc.Offset(1, 1).Resize(1, largeur).Offset(i)
         RngLigne.Sort key1:=RngLigne.Cells(1, 1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortRows
        Next i
        Set début = Cells(début.Row + hauteur + 1, 1)
       Loop
       On Error Resume Next
       ActiveSheet.ListObjects.Add(xlSrcRange, Range(champ), xlNo, xlNo).Name = NomTableau
       ActiveSheet.ListObjects(NomTableau).ShowHeaders = False
       ActiveSheet.Rows(1).Delete
       Cells.EntireColumn.AutoFit
       ActiveSheet.ListObjects(NomTableau).TableStyle = ""
       On Error GoTo 0
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  16. #16
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Merci tu es au top

    Prends soin de toi,

    Fred

  17. #17
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonsoir,
    cette ligne c'est dans le cas où le tableau est en A1
    Citation Envoyé par boisgontierjacques Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       Set début = Range("A1")
    Boisgontier
    comment je peux changer cette partie pour aller chercher la valeur et ça où que soit le tableau dans la feuille ?

    Merci
    Fred

  18. #18
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    J'ai pris pour début la première cellule de TableauResult.

    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
    Sub TriHoriz()
      NomTableau = "TableauResult"
      Set début = Range(NomTableau).Item(1, 1) 'Range("A1")
      On Error Resume Next
      champ = Range(NomTableau).Address
      Range(NomTableau).ListObject.Unlist
      On Error GoTo 0
      Do While début <> ""
        Set RngBloc = début.CurrentRegion
        hauteur = RngBloc.Rows.Count
        n = hauteur - 1
        largeur = RngBloc.Columns.Count - 1
        For i = 0 To n - 1
         Set RngLigne = RngBloc.Offset(1, 1).Resize(1, largeur).Offset(i)
         RngLigne.Sort key1:=RngLigne.Cells(1, 1), Order1:=xlAscending, Header:=xlNo, Orientation:=xlSortRows
        Next i
        Set début = Cells(début.Row + hauteur + 1, 1)
       Loop
       On Error Resume Next
       ActiveSheet.ListObjects.Add(xlSrcRange, Range(champ), xlNo, xlNo).Name = NomTableau
       ActiveSheet.ListObjects(NomTableau).ShowHeaders = False
       ActiveSheet.Rows(1).Delete
       Cells.EntireColumn.AutoFit
       ActiveSheet.ListObjects(NomTableau).TableStyle = ""
       On Error GoTo 0
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  19. #19
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    Bonjour,
    Merci bien tout fonctionne

    Très bonne journée,
    Fred

  20. #20
    Membre habitué Avatar de texas2607
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 344
    Points : 159
    Points
    159
    Par défaut
    @boisgontierjacques

    Rebonjour
    Alors en fait ce code m'a entraîné d'autres soucis que je n'arrivais pas à comprendre (des données étaient supprimées)
    En fouillant j'ai trouvé l'erreur :

    En lancant la procédure plusieurs fois à la suite (fais un test avec ton code en appuyant plusieurs fois sur le bouton), cela supprime des lignes sur la feuille.

    Un moyen de résoudre ce souci ?

    car l'affichage final est bon, le tableau tel qu'au départ et sans les entêtes de colonnes.

    d'avance merci
    Fred

Discussions similaires

  1. Trier des combobox par ordre croissant et alphabétique
    Par floflo50100 dans le forum Excel
    Réponses: 6
    Dernier message: 09/04/2015, 15h31
  2. Re - Trier des données par ordre d'importance
    Par popoliline dans le forum Access
    Réponses: 14
    Dernier message: 25/08/2006, 12h29
  3. Trier des données par ordre d'importance
    Par popoliline dans le forum Access
    Réponses: 19
    Dernier message: 23/08/2006, 19h42
  4. Trier un tableau par ordre croissant
    Par Halleck dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 01/11/2004, 00h04

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