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 :

Comment trier un tableau excel du gauche à droite


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 102
    Par défaut Comment trier un tableau excel du gauche à droite
    Bonjour ,


    depuis pas mal de temps j'essaye de trier un enssemble de valeur dans un tableau à valeur varriable issus d'un traitement de donnée.

    on obitien celui joint.

    Alors je veux trier mon tableau de la maniére suivante :

    1§ les donnée devrais étre trier on se basant sur la ligne 1 à partir de la cellue B2 et il sont de la forme suivante num.num.... jusqu'au ... X.X
    exemple 1.1 1.3 1.5 .. ou bien 1.1.1 1.1.2 1.1.4 Ou bien les deux 1.1 1.1.1 .12.1 1.3


    2§ Les données devrais étre trier du plus petit au plus grand et de la gauche vers la droite


    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
    48
     
    Private Sub TriHorizontal()
    Dim col As Integer
     col = Cells(1, 2).End(xlToRight).Column
        Range("B1").Select
        Range(Selection, Selection.End(xlDown)).Select
        Range(Selection, Selection.End(xlToRight)).Select
        ActiveWorkbook.Worksheets("synthése").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("synthése").Sort.SortFields.Add Key:=Range(Cells(1, 2), Cells(1, col) _
            ), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("synthése").Sort
            .SetRange Range(Cells(1, 2), Cells(13, col))
            .Header = xlGuess
            .MatchCase = True
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With
    With Sheets("synthése")
    .Select
    Selection.NumberFormat = "0.00"
     
    Dim cell As Range
    Dim coll As Integer
     
    coll = Cells(1, 1).End(xlToRight).Column
    For Each cell In Range(Cells(1, 1), Cells(1, col))
     
     
    If cell.Value = "Fils" Or cell.Value = "Fil" Or cell.Value = "fils" Or cell.Value = "fil" Or cell.Value = "File" Or cell.Value = "file" Or cell.Value = "Vide" Then
     
    cell.Select
    Columns(cell.Column).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.ClearContents
    ActiveSheet.Range("A1").Select
    GoTo Pol
     
     
    End If
    Next cell
     
    Pol:
     
     
     
    End With
    End Sub

    Merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un exemple de tri par ligne
    Imaginons une plage de cellule, référencée G1:L14
    Cette ligne trie de Z à A à partir de la 2ème colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RowSort Feuil3.Range("g1"), Order:=xlDescending
    Cette ligne trie de A à Z toujours à partir de la 2ème colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RowSort Feuil3.Range("g1")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RowSort Feuil3.Range("G1:L14")
    si la table à trier est contiguë à des cellules qui ne doivent pas être triées
    Exemple ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
     RowSort Feuil3.Range("g1"), Order:=xlDescending
    End Sub

    La procédure de tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub RowSort(DataTable As Range, Optional Order As Integer = xlAscending)
     ' Tri de la ligne 1
     Dim KeyRow As Range, ExportTo As Range: Set ExportTo = DataTable
     With ExportTo
      If .Count = 1 Then Set ExportTo = .CurrentRegion
     End With
     ' *** Tri ***
     With ExportTo: Set KeyRow = .Offset(0, 1).Resize(1, .Columns.Count - 1)
     .Offset(0, 1).Resize(, ExportTo.Columns.Count - 1).Sort _
      Key1:=KeyRow, Order1:=Order, _
      Header:=xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlSortRows
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 102
    Par défaut
    Bonjour monsieur,

    Je te remercie pour l'interret que tu porte à mon sujet , Or le trie se fais ttrés bien , mais pas dans l'ordre désiré :

    exemple il me donne çà:

    10.1 11.1 11.2 11.3 12.1 12.2 12.3 13.1 13.2 13.3 15.1 15.2 15.3 3.2 4.1 4.2 4.3 6.1 6.2 6.3 7.1 7.3 8.1 8.2 9.1 9.2 9.3


    à la place de donner çà :

    3.2 4.1 4.2 4.3 6.1 6.2 6.3 7.1 7.3 8.1 8.2 9.1 9.2 9.3 10.1 11.1 11.2 11.3 12.1 12.2 12.3 13.1 13.2 13.3 15.1 15.2 15.3


    Je suppose que le probléme est au points et virgule peut étre parceque quand je fais un remplaçement de points par virgule puis je fais le trie çà marche bien et aprés je refais le remplacement des virgule par des points .. mais quand j'automatise celà on faisant un enregistrement de macro çà ne marche pas :/


    Merci d'avance pour ton aide monsieur !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Le tri est correct
    10.1 est plus petit que 3.2 quand la valeur est alphanumérique

    Bonjour,
    Pour compléter la discussion, j'ai ajouté un argument facultatif dans cette procédure et rebaptisé une variable dont le nom ne signifiait pas grand chose par rapport au sujet traité
    La procédure de TRI (Gauche vers droite) fonctionne pour version 2003-2010 (Les erreurs ne sont pas gérées dans cette procédure)
    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
    Sub RowSort(DataTable As Range, Optional Order As Byte = xlAscending, Optional Header As Boolean = True)
     ' DataTable de type Range, doit contenir l'adresse d'au moins une cellule
     ' [Order]  Ordre de tri par défaut xlAscending
     ' [Header] La table contient ou nom des étiquettes de lignes (1ère colonne) par défaut xlYes
     ' Le tri ne se fait que sur une seule ligne
     Dim KeyRow As Range, Table As Range: Set Table = DataTable
     With Table
      If .Count = 1 Then Set Table = .CurrentRegion
     End With
     ' *** Tri ***
     With Table: Set KeyRow = .Offset(0, 1).Resize(1, .Columns.Count - 1)
     .Offset(0, Abs(Header)).Resize(, Table.Columns.Count - Abs(Header)).Sort _
      Key1:=KeyRow, Order1:=Order, _
      Header:=xlYes + Abs(Header = False), OrderCustom:=1, MatchCase:=False, Orientation:=xlSortRows
     End With
    End Sub
    La procédure d'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub TriVertical()
     Dim rng As Range: Set rng = shtData.Range("B1") ' ou shtData.Range("B1:E4")
     RowSort rng ', Order:=xldescending ' , Header:=False
     ' RowSort rng, Order:=xldescending ' Tri Descendant
     ' RowSort rng, Header:=False ' Tri Ascendant et trie toutes les colonnes (Pas de Header)
    End Sub
    shtData est le CodeName de la feuille nommée bd. L'affectation de la variable rng pourrait donc être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rng = ThisWorkbook.Worksheets("bd").Range("B1")
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre Expert
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Par défaut comment trier un tableau de gauche à droite
    bonjour Philippe,

    c'est vrai, le trie est correcte.

    Ici la gêne n'est pas probante mais dans une précédente discussion sur le sujet, Matrimax demandait un trie horizontal (enfin c'est ce que j'avais compris).

    Le trie donnait logiquement : Cycle 1, Cycle 10, Cycle 2, .......
    Il faut avouer que dans ce cas, l'ordonnancement est un peu perturbant et ne répond pas vraiment à ce qui est attendu.

    J'indiquais à Matrixmax que je ne savais comment résoudre ce problème.
    Y a t-il une solution.

    Cordialement.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour Paul,
    Sauf si l'on manipule les données alphanumériques, je ne vois pas vraiment comment résoudre le problème de Cycle 1, Cycle 10, Cycle 2, ........
    C'est exactement la même chose que Durand Monique, Durand Jean, etc...
    Pour les nombres alphanum ériques tels que 1.1 12.5 20.2 etc..., la nouvelle version de tri (depuis 2007) affiche un message
    Il se peut que la clé de tri suivante ne trie pas les données comme prévu, car elle contient des nombres au format texte et propose de trier séparément les nombres et les nombres stockés en tant que texte ou de trier toutes les données ressemblant à des nombres comme des nombres. Ce que la version 2003 que j'utilise pour garder la compatibilité ne fait pas (je pense, car je commence à avoir des doutes).

    Bonjour,
    Et bien j'ai eu raison de douter.
    En 2003, c'est également possible de trier une valeur alphanumérique ressemblant à un nombre telle que 11.1 comme une valeur numérique. Par contre pour des cas comme celui-ci, Option 4, Option 6 etc.. je ne vois pas de solution simple.
    Voici la version corrigée. J'ai ajouté une option TextAsValue qui a comme valeur par défaut, la constante xlSortNormal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub TriVertical()
     Dim rng As Range: Set rng = Feuil4.Range("A2:AG15") ' ou shtData.Range("B1:E4")
     RowSort rng, TextAsValue:=xlSortTextAsNumbers ', Order:=xlDescending   ' , Header:=False
    End Sub
    Procédure de tri
    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
    Sub RowSort(DataTable As Range, Optional Order As Byte = xlAscending, Optional Header As Boolean = True, Optional TextAsValue As Byte = xlSortNormal)
     ' DataTable de type Range, doit contenir l'adresse d'au moins une cellule
     ' [Order]  Ordre de tri par défaut xlAscending
     ' [Header] La table contient ou nom des étiquettes de lignes (1ère colonne) par défaut xlYes
     ' [TextAsValue] Permet de trier une valeur numérique ressemblant à un nombre comme tel. Par défaut xlSortNormal
     ' Le tri ne se fait que sur une seule ligne
     Dim KeyRow As Range, Table As Range: Set Table = DataTable
     With Table
      If .Count = 1 Then Set Table = .CurrentRegion
     End With
     ' *** Tri ***
     With Table
      Set KeyRow = .Offset(0, Abs(Header)).Resize(1, .Columns.Count - Abs(Header))
     .Offset(0, Abs(Header)).Resize(, Table.Columns.Count - Abs(Header)).Sort _
      Key1:=KeyRow, Order1:=Order, DataOption1:=TextAsValue, _
      Header:=xlYes + Abs(Header = False), OrderCustom:=1, MatchCase:=False, Orientation:=xlSortRows
     End With
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. [Tableaux] comment trier un tableau multidimensionnel
    Par tibotibo69 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 17h04
  2. Comment trier un tableau avec VBScript ?
    Par djokerta dans le forum VBScript
    Réponses: 3
    Dernier message: 27/09/2007, 20h44
  3. [VB.NET2005]Comment trier un tableau de datarows
    Par kissskoool dans le forum VB.NET
    Réponses: 6
    Dernier message: 27/09/2007, 14h08
  4. Réponses: 5
    Dernier message: 13/06/2006, 11h08
  5. Comment trier un tableau, et repérer les doublon?
    Par danje dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 18h45

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