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 selon un ordre définit avec un élément vide


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 3
    Par défaut Tri selon un ordre définit avec un élément vide
    Bonjour
    J'ai trouvé un programme de tri qui marchait très bien jusqu'à ce que.... Mon problème c'est que j'aimerai trier les ligne selon l'ordre suivant : " , IFA,IFC,ABS,IFI". Autrement dit j'aimerai que les premières lignes de mon tableau soient celle dont la Colonne D est vide. Et la le programme ne marche plus. Ou plutot il marche pour les IFA IFC ASB et IFI mais les ligne dont la colonne D est vide n'apparaissent qu'après... Comment faire SVP?


    Voila le code
    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
        Dim nbligne As Long
        With Sheets("Suivie De Société")
            nbligne = .Range("B" & Rows.Count).End(xlUp).Row
            chaine = ","",IFAR,IFA,IFCR,IFC,ASB,IFI"
            MsgBox chaine
            With .Sort
                .SortFields.Clear
                .SortFields.Add Key:=Range("D14:D" & nbligne), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=",IFAR,IFA,IFCR,IFC,ASB,IFI", DataOption:=xlSortNormal
                .SetRange Range("A14:AK" & nbligne)
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With
        End With

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Tu ne peux rien y changer, le tri fonctionne comme ça, les cellules vides sont repoussées vers le bas.
    Tu peux par contre leurrer en inscrivant dans les cellules vides de la colonne D un caractère comme par exemple # que tu positionnes en début de chaîne et une fois le tri effectué, tu supprime le caractère :
    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
     
    Sub Test()
     
        Dim nbligne As Long
     
        With Sheets("Feuil1")
     
            nbligne = .Range("B" & Rows.Count).End(xlUp).Row
     
            .Range("D14:D" & nbligne).Cells.SpecialCells(xlCellTypeBlanks).Value = "#"
     
            With .Sort
     
                .SortFields.Clear
                .SortFields.Add Key:=Range("D14:D" & nbligne), _
                                SortOn:=xlSortOnValues, _
                                Order:=xlAscending, _
                                CustomOrder:=",#,IFAR,IFA,IFCR,IFC,ASB,IFI", _
                                DataOption:=xlSortNormal
                .SetRange Range("A14:AK" & nbligne)
                .Header = xlGuess
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
     
            End With
     
            .Range("D14:D" & nbligne).Replace "#", ""
     
        End With
     
    End Sub

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    j'ai répondu ici : https://www.developpez.net/forums/d1.../#post10416465
    eric

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 3
    Par défaut Merci
    Merci pour votre efficacité!! Le coup des 5"" ne fonctionne pas. J'ai donc opté pour la solution de Theze qui fonctionne parfaitement.
    Merci Beaucoup

  5. #5
    Membre Expert
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Par défaut Juste pour montrer une autre méthode possible
    Bonjour,

    Il est toujours intéressant de voir d'autres méthodes afin d'apprendre :
    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
    Sub Demo_TRi()
    Dim DL As Long, Plage As Range
        With Sheets(1)
            DL = .Cells(Rows.Count, 2).End(xlUp).Row
            Set Plage = .Range("A14:AK" & DL).Resize(, Columns("AK").Column + 1) 'Plage de tri - on ajoute une colonne supp à la fin pour y mettre la formule ci-dessous
                'Plage.Columns.Item(Plage.Columns.Count).Formula = "=ISBLANK(D14)" ' Formule afin de vérifier les cellules vide en Colonne D
                Plage.Columns.Item(Plage.Columns.Count).Formula = "=D14=""""" ' Formule afin de vérifier les cellules vide en Colonne D - autres façon de marquer la formule comme suggéré par @eriiic post #6
                Application.ScreenUpdating = False
            With .Sort
                .SortFields.Clear
                .SortFields.Add Key:=Plage.Columns.Item(Plage.Columns.Count), Order:=xlDescending ' Tri sur la colonne des formules
                .SortFields.Add Key:=Plage.Columns.Item(4), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:="IFAR,IFA,IFCR,IFC,ASB,IFI", DataOption:=xlSortNormal ' Tri Col D (4 ici car la plage commence en colonne A)
                .SetRange Plage: .Header = xlNo: .MatchCase = False: .Orientation = xlTopToBottom: .SortMethod = xlPinYin: .Apply
            End With
                Plage.Columns.Item(Plage.Columns.Count).ClearContents ' on efface les formules
                Application.ScreenUpdating = True
                Set Plage = Nothing
        End With
    End Sub
    @Theze ,@eriiic

    Edit : Ajout/Corr. du code
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre :resolu: en n'oubliant pas d'indiquer qu'elle est la solution finale choisie ;)

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour ryu,

    Intéressant, merci.
    J'aurais juste une petit restriction sur .Formula = "=isblank(D14)"
    Si tu as dans la cellule ' ou une formule du type ="" pour Estvide() ce n'est pas vide, même si visuellement ça l'est.
    Je préfére le classique =""
    eric

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

Discussions similaires

  1. [MySQL] faire un tri selon l'ordre de tb2
    Par drick35 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/03/2013, 15h13
  2. Tri d'une liste de fichiers selon un ordre
    Par Geoffrey49000 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/09/2011, 00h03
  3. [JDOM] Ajout d'éléments triés selon leur nom et problème de redondance.
    Par _fav_ dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/08/2010, 11h24
  4. Tri avec 1er élément aléatoire
    Par Mister Paul dans le forum Langage
    Réponses: 15
    Dernier message: 30/12/2009, 15h36
  5. [Lazarus] Tri ordre alpha avec tdbf
    Par sverdo dans le forum Lazarus
    Réponses: 1
    Dernier message: 24/08/2007, 20h53

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