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 ligne tableur Excel selon le contenu d'une variable tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Par défaut Trier ligne tableur Excel selon le contenu d'une variable tableau
    Bonjour à tous,

    Je bloque sur le code d'une partie de ma macro...
    Dans un tableur Excel, j'ai des lignes contenant un numéro puis un sous-numéro.
    Je cherche à trier les lignes du tableur de manière à ce qu'elle soit dans le même ordre que dans une cellule de la feuille d'à côté.
    Je vous joins un exemple.
    Première étape, pour chaque "numéro" je fais un Split() de la colonne B de la feuille "tri" pour mettre dans une variable tableau l'ordre attendu.
    Ça, ça fonctionne bien, c'est pas très compliqué !
    Mais ensuite, pour ce numéro précis, je dois réordonner les lignes de ma feuille "liste" pour que ça matche avec l'ordre du tableau.
    (sachant qu'il peut manquer des chiffres, comme dans mon exemple).

    Bref, j'ai beau tourner le truc dans tous les sens, je n'arrive même pas à trouver l'algo (et encore moins le code) qui me permettrait de faire ça.

    Un petit coup de main please ?

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour riomois85

    je cherche à trier les lignes du tableur de manière à ce qu'elle soit dans le même ordre que dans une cellule de la feuille d'à côté.
    Comme tu veux trier, autant utiliser le tri d'Excel et donc je te propose cette procédure avec ton exemple complété.
    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
    Sub Trier()
    Const cln = "A"     ' colonne liste numéro
    Const lln = 2       ' ligne liste numéro
    Const ctn = "A"     ' colonne tri numéro
    Dim der As Long     ' dernière ligne
    Dim lig As Long     ' ligne
    Dim p_t As Range    ' position tri
    Dim nbn As Long     ' nombre numéros
    Dim wl As Worksheet ' onglet liste
    Dim wt As Worksheet ' onglet tri
        Set wl = ActiveWorkbook.Worksheets("liste")         ' affectaion liste
        Set wt = ActiveWorkbook.Worksheets("tri")           ' affectaion tri
        der = wl.Cells(wl.Rows.Count, cln).End(xlUp).Row    ' dernière ligne
        With wl.Sort                                        ' tri numéros
            With .SortFields
                .Clear
                .Add Key:=wl.Cells(lln, cln).Resize(der, 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            End With
            .SetRange wl.Cells(lln, cln).Resize(der, 2)
            .Header = xlNo
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        lig = 2
        While lig < der                                                     ' tri sous-numéros
            nbn = Application.CountIf(wl.Columns(cln), wl.Cells(lig, cln))  ' nombre numéros
            Set p_t = wt.Columns(ctn).Find(wl.Cells(lig, cln), wt.Range(ctn & "1"), xlValues, xlWhole)
            If Not p_t Is Nothing Then
                With wl.Sort
                    With .SortFields
                        .Clear
                        .Add Key:=wl.Cells(lig, Chr(Asc(cln) + 1)).Resize(nbn, 1), SortOn:=xlSortOnValues, Order:=xlAscending, _
                         CustomOrder:=Replace(p_t.Offset(0, 1), " ", ","), DataOption:=xlSortNormal
                    End With
                    .SetRange wl.Cells(lig, cln).Resize(nbn, 2)
                    .Header = xlNo
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                End With
            End If
            lig = lig + nbn
        Wend
    End Sub
    Bon test tu as un bouton pour le lancer et tu peux positionner tes tableaux ailleurs en modifiant les constantes du code
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 71
    Par défaut
    J'ai un peu galéré à adapter le script à mon "vrai" fichier (je maitrise mal le Sort et les offset, alors les 2 cumulés... ), mais une fois en place ça marche nickel !

    Un grand merci !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/10/2020, 11h50
  2. [WD15] transformer une ligne en colonne selon le contenu
    Par Menadel dans le forum WinDev
    Réponses: 26
    Dernier message: 09/08/2017, 16h40
  3. où est le problème? écriture du contenu d'une variable tableau
    Par nouveauvba dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/04/2017, 16h17
  4. [XL-2010] Trier des feuilles excel selon un résultat.
    Par adsens dans le forum Excel
    Réponses: 5
    Dernier message: 24/11/2014, 19h12
  5. [XL-2002] Supprimer une ligne selon le contenu d'une cellule
    Par Alexis078 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/07/2014, 18h11

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