XL 2013 Tri des colonnes selon un ordre défini par un vecteur

louloubru

XLDnaute Junior
Bonjour à tous,

je suis perdue dans les fonctionnalités de la fonction sort... Je n'arrive pas à faire le tri dont j'ai besoin, pourriez-vous m'aider ?

Je chercher à trier des colonnes dans une feuille grâce à l'en-tête de ces colonnes. J'ai un vecteur contenant les en-têtes dans l'ordre souhaité et j'aimerai maintenant trier mes colonnes selon cet ordre.

La plage de tri doit être dynamique car je peux rajouter des colonnes (dont l'en-tête s'ajoute dans mon vecteur) et des lignes.

J'ai défini la plage de tri :

VB:
Dim maplage as Range
Dim Dercol As Long
Dim Dernlig As Long
Dernlig = Range("A" & Rows.Count).End(xlUp).Row
Dercol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
maplage = Range(Cells(1, 1), Cells(Dernlig, Dercol))

Pas testé encore...

Je ne sais pas comment dire à la fonction sort de trier sur cette plage, les colonnes selon l'ordre défini dans le vecteur liste (valeurs de la première ligne).

En vous remerciant par avance !
 

louloubru

XLDnaute Junior
Re,
impeccable sauf que ...
Cela ne fonctionnait pas car mes données sont sous forme de tableau.
En enlevant la mise en forme tableau, impeccable.

Avec tableau j'ai : "Vous ne pouvez pas copier et insérer dans un tableau une sélection de cellules se trouvant à l'intérieur ..."

Donc la faute au tableau et sans cela fonctionne très bien.

Mon problème est que j'ai une autre procédure qui utilise mes tableaux... Donc qui ne fonctionne plus si j'enlève cette mise en forme.

Grrrr

Il s'agit de la procédure suivante :

VB:
 Dim TabE(), LE&, TabS(), LS&, C&, i&
    ReDim TabS(1 To 50000, 1 To 10)
    For i = LBound(Noms_feuilles) To UBound(Noms_feuilles)
        TabE = Sheets(Noms_feuilles(i)).ListObjects(1).DataBodyRange.Value
        If UBound(TabS, 2) < UBound(TabE, 2) Then ReDim Preserve TabS(1 To UBound(TabS, 1), 1 To UBound(TabE, 2))
            For LE = 1 To UBound(TabE, 1)
                If TabE(LE, Col) = 1 Then
                    LS = LS + 1
                        For C = 1 To UBound(TabE, 2)
                        TabS(LS, C) = TabE(LE, C)
                        Next C
                End If
            Next LE
    Next i

Le morceau de code ci-dessus stocke des lignes sous une certaine condition dans un tableau, tableau que je colle ensuite dans un nouveau classeur.
Sauf que j'utilise ici le fait que mes données sont sous forme de tableau dans toutes mes feuilles !
Donc plus de tableau --> tri des colonnes ok , mais plus de fichier d'export :(
Auriez-vous un autres moyen de stocker mes lignes (code ci-dessus sans utilisation des tableaux (le listObjects)).

Merci beaucoup pour le tri ! (Qui ne tente rien n'a rien pour ce deuxième problème ;) )
 

louloubru

XLDnaute Junior
Bonjour,
affaire résolue !
J'ai remplacé par UsedRange comme ceci :

Et oui effectivement j'ai enlevé tous les tableaux de mon fichier, sauf ceux qui servent pour les listes de validation parce que quand même il faut admettre que c'est bien pratique !
VB:
    'Création d'un tableau contenant mes lignes
    Dim TabE()
    Dim LE As Integer
    Dim TabS()
    Dim LS As Long
    LS = 0
    Dim C As Long
    C = 0
    Dim i As Long
    i = 0
    
    ReDim TabS(1 To 5000, 1 To 10)
    For i = LBound(Noms_feuilles) To UBound(Noms_feuilles)
        TabE = Sheets(Noms_feuilles(i)).UsedRange.Value
        If UBound(TabS, 2) < UBound(TabE, 2) Then ReDim Preserve TabS(1 To UBound(TabS, 1), 1 To UBound(TabE, 2))
            For LE = 1 To UBound(TabE, 1)
                If TabE(LE, Col) = 1 Then
                    LS = LS + 1
                        For C = 1 To UBound(TabE, 2)
                        TabS(LS, C) = TabE(LE, C)
                        Next C
                End If
            Next LE
    Next i
Merci à tous
(on ne peut pas indiquer une discussion comme résolue ?)
 

Discussions similaires

Statistiques des forums

Discussions
314 647
Messages
2 111 533
Membres
111 197
dernier inscrit
john49