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 :

Boucle de tri croissant sur une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut Boucle de tri croissant sur une colonne
    Bonjour à toutes et à tous !

    Après plusieurs recherches sans succès, je me tourne vers vous pour trouver de l'aide à mon problème.

    J'ai besoin de trier de a à z une colonne et de recommencer le tri dans cette colonne après chaque cellule contenant "E0"

    Par exemple passer de :
    E0
    3
    2
    1
    E0
    3
    2
    1

    à

    E0
    1
    2
    3
    E0
    1
    2
    3

    Merci d'avance !

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Bonjour et bienvenue au forum !
    Qu'as-tu fais pour l'instant ? Ton but est-il d'automatiser l'action ? Je ne vois pas trop comment faire sans passer par du VBA. Tu connais un peu le VBA ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Merci à toi !
    Exactement je veux automatiser l'action sur un tableau de 5000 lignes.
    Oui, suite à mes recherches j'en ai aussi conclu qu'il fallait passer par du VBA.
    Malheureusement je ne m'y connais que très peu... Et j'ai trouvé que très peu d'infos concernant mon problème sur internet.

    Petite précision : Après la cellule E0 il n'y a pas toujours le même nombre de lignes avant la prochaine cellule E0.
    J'imagine que l'on ne va pas me mâcher le travail mais si tu à des pistes je suis preneuse !
    Merci d'avance

  4. #4
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Alors, voici quelques pistes :


    Essaie déjà d'avoir un petit bout de code avec cela, puis reviens vers nous

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Merci d'avoir pris le temps de m'aider !!
    J'ai tenté quelque chose en suivant la démarche...
    Est-ce que cela est-il un minimum cohérent ? :

    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
    Sub Macro1()
     
        Selection.AutoFilter
        ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort.SortFields.Add Key:=Range _
            ("A1:A11"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
            xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
    Dim plage As Range
     
    With Worksheets(1).Range("A1:A11")
    Set C = .Find(What:="E0")
    If Not C Is Nothing Then
    firstAddress = C.Address
    Set plage = C
    Do
    Set plage = Union(C, plage)
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> firstAddress
    End If
     
        Dim i As Integer
     
        i = 1
     
        While Not IsEmpty(Cells(i, 1))
            Debug.Print Cells(i, 1)
            i = i + 1
        Wend
    End Sub
    Merci d'avance

  6. #6
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 706
    Par défaut
    Il y a des premiers éléments, mais ce n'est pas encore tout à fait cela

    1. Analyse ce que tu veux faire :
    • Chercher le premier E0.
    • Chercher le deuxième E0
    • Trier les données entre le premier et le deuxième E0
    • Chercher le troisième E0
    • Trier les données entre le deuxième et le troisième E0
    • etc ...


    2. Regarde ce que tu as dans ton code
    Tu as un code pour trier une plage de cellules. Attention, ici tu as trié avec un filtre automatique. Ce n'est pas ce que tu veux, puisqu'un filtre automatique tri toute la colonne. Pour trier seulement une plage, avec l'enregistreu de macro tu obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A6"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A6:A8")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Ici, on tri la plage A6:A8.
    Il faut l'adapter avec une plage variable.

    Ici, tu cherche le premier E0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set C = Worksheets(1).Range("A1:A11").Find(What:="E0")
    Et ici, le prochain:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set C = Worksheets(1).Range("A1:A11").FindNext(C)
    Ta plage ne s'étend que de A1 à A11 ?

    3. On combine
    Tu peux créer une méthode qui à partir de 2 cellules effectue un tri entre les 2 cellules. Je te guide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub triEntreCe(cel1 As Range, cel2 As Range)
        '1. vérifier qu'il y a bien quelque chose entre les deux cellules --> si non : on sort de la méthode
           'tu peux utiliser Offset : cel1.Offset(1, 0) te donne la cellule juste en dessous de cel1
        If .... Then Exit Sub
        '2. Faire le tri de la plage de cellules entre cel1 et cel2 (les deux exclues), donc les cellules entre cel1.Offset(1, 0) et cel2.Offset(-1, 0) les deux inclues.
            'pour cela utilise le code obtenu par enregistreur de macro et adapte avec les bonnes cellules
    End Sub
    Ensuite tu créés la méthode principale qui fera tous les tris. Je te guide :
    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
    Sub tri()
        Dim cel0 As Range
        Dim cel1 As Range
        Dim cel2 As Range
        Dim dernCel As Range
        '1. Cherche la première occurence de E0
        Set cel0 = ...
        Set cel1 = cel0
        '2. Vérifie que cel1 n'est pas Nothing --> sinon on sort de la méthode
        If ... Then Exit Sub
        '3. Cherche la deuxième occurence de E0
        Set cel2 = ....
        '4. Boucle tant que cel2 <> cel0
        While ...
            'i. Faire le tri entre cel1 et cel2
            Call triEntreCel(cel1, cel2)
            'ii. cel1 prend la valeur de cel2
            Set cel1 = ...
            'iii. cel2 prend la valeur de la prochaine occurence de E0
            Set cel2 = ...
        Wend
        '5. Maintenant cel2 vaut cel0, il faut donc faire le tri entre cel1 et la dernière cellule de la colonne.
        dernCel = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp)       'permet d'avoir la dernière cellule non vide de la colonne A
        Call triEntreCel(cel1, dernCel.Offset(1, 0))
    End Sub
    Est-ce que tu arriveras à compléter ?

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Par défaut
    Merci beaucoup, c'est inespéré toute cette aide !
    Ma plage s'étend de A1 à A1430 mais je commencerais par tester ce code sur une plus petite plage.

    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
    Sub Macro1()
    ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A6"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A6:A8")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Set C = Worksheets(1).Range("A1:A11").Find(What:="E0")
    Set C = Worksheets(1).Range("A1:A11").FindNext(C)
    Sub triEntreCe(cel1 As Range, cel2 As Range)
        If     Range("A2:A4").Select
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("A2"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("Feuil1").Sort
            .SetRange Range("A2:A4")
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        Range("G6").Select
     Then Exit Sub
    End Sub

    Je ne vais pas pouvoir compléter tout de suite sans me pencher réellement sur le VBA.. En tout cas je garde tous ces précieux conseils de côté pour plus tard. Merci encore!

Discussions similaires

  1. DataTables tri auto sur une colonne
    Par Vincent Valentine dans le forum jQuery
    Réponses: 6
    Dernier message: 09/03/2016, 10h27
  2. Tri particulier sur une colonne
    Par sab_info dans le forum SSRS
    Réponses: 2
    Dernier message: 15/03/2013, 18h43
  3. [XL-2000] Tri croissant sur une feuille cachée
    Par cobra38 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/12/2010, 22h12
  4. Tri ListView sur une colonne de type List<T>
    Par thelpi dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 05/01/2010, 17h46
  5. [JSP] tri sur une colonne
    Par soony dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 28/07/2005, 16h02

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