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 un tableau() multidimensionnel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 113
    Par défaut Trier un tableau() multidimensionnel
    Bonjour à tous,


    Voilà j'ai un tableau de 7 lignes sur 8 colonnes. Et j'aimerais pouvoir trier le tableau à partir de la seconde colonne. Alors qu'un tableau à une seule colonne c'est simple comme suite :
    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
    Public Sub prepaWGranuZQ15(ByVal ZQ15name As String)
     
       address = ThisWorkbook.path
       Set wb = Workbooks.Open(address & "\Temp\" & ZQ15name, local:=True)
       wb.Sheets(1).Activate
     
       Dim aTab(0 To 6, 0 To 7) As variant
       Dim x As Long
       Dim i As Long, j As Long, lInc As Long, n As Long, lMin As Long
       Dim lLowerBound As Long, lUpperBound As Long
       Dim vRef As String
     
       'Inscription des valeurs dans le tableau
       For x = 0 To 6
           aTab(x) = cells(9, 60 + x * 8).Value
       Next 
     
       lLowerBound = LBound(aTab)
       lUpperBound = UBound(aTab)
       n = lUpperBound - lLowerBound + 1
       lInc = 1
     
       While lInc < n
          lInc = lInc * 3 + 1
       Wend
       While lInc > 1
          lInc = lInc / 3
          lMin = lInc + lLowerBound
          For i = lMin To lUpperBound
             j = i
             vRef = aTab(i)
             Do While vRef < aTab(j - lInc)
                aTab(j) = aTab(j - lInc)
                j = j - lInc
                If j < lMin Then Exit Do
             Loop
             aTab(j) = vRef
          Next i
       Wend
     
    End sub
    J'avoue assez fort coincer sur le faite de trier sur la deuxième colonne et garder les autres valeurs sur leurs lignes réciproques.

    De plus j'aimerais aussi qu'il trie comme dans le code par ordre alphabétique mais avec les lignes vides à la fin au lieu du début.

    Quelqu'un aurait un conseil ?
    Merci d'avance.

    Bien à vous,
    Rave

  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 171
    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 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai écrit une procédure de tri (limité à trois niveaux pour être compatible avec la version 2003) avec des arguments qui te permettront je crois de trouver ton bonheur.
    Je l'ai mis dans la rubrique Contribuer dont tu trouveras le lien en dessous de ma signature. Il y a un fichier à télécharger avec des exemples.
    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 éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Bonjour,

    Remarque:Eviter la méthode de tri Escargot

    Tri multi-colonnes

    La colonne de tri peut être choisie
    0,06 sec pour 5.000 items

    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
     
    Sub TriTableau2D()
     Dim a()
     a = Range("a2:e" & [A65000].End(xlUp).Row).Value     ' Tableau 2D
     Call Tri(a(), 1, LBound(a, 1), UBound(a, 1))
     [G2].Resize(UBound(a, 1), UBound(a, 2)) = a  
     'pour excel <2007 si dates
     '[K2].Resize(UBound(b)).Value = Application.index(b, , 4)
    End Sub
     
    Sub Tri(a(), ColTri, gauc, droi) ' Quick sort
       ref = a((gauc + droi) \ 2, ColTri)
       g = gauc: d = droi
       Do
          Do While a(g, ColTri) < ref: g = g + 1: Loop
          Do While ref < a(d, ColTri): d = d - 1: Loop
            If g <= d Then
               For k = LBound(a, 2) To UBound(a, 2)
                 temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
               Next k
               g = g + 1: d = d - 1
            End If
        Loop While g <= d
        If g < droi Then Call Tri(a, ColTri, g, droi)
        If gauc < d Then Call Tri(a, ColTri, gauc, d)
    End Sub
    Tri de tableau multi-critères multi-colonnes
    -Le tableau est en A2xxxxx
    -La colonne A contient des noms et la colonne C des salaires

    La clé de tri est

    clé(i) = a(i, 1) & Format(a(i, 3), "0000"): index(i) = i

    Temps de tri
    0,07s pour 5.000 éléments

    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
     
    Sub TriTableau2D2Critères()
     Dim clé() As String, index() As Long
     a = Range("A2:D" & [A65000].End(xlUp).Row).Value
     Dim b()
     ReDim b(LBound(a) To UBound(a), LBound(a, 2) To UBound(a, 2))
     ReDim clé(LBound(a) To UBound(a, 1))
     ReDim index(LBound(a) To UBound(a, 1))
     For i = LBound(a) To UBound(a, 1)
       clé(i) = a(i, 1) & Format(a(i, 3), "0000"): index(i) = i
     Next i
     Call Tri(clé(), index(), LBound(a), UBound(clé))
     For lig = LBound(clé) To UBound(clé)
       For col = LBound(a, 2) To UBound(a, 2): b(lig, col) = a(index(lig), col): Next col
     Next lig
     [H2].Resize(UBound(b), UBound(b, 2)) = b    ' Attention! pas de dates dans le champ
    ' si dates <Excel 2007 [K2].Resize(UBound(b)).Value = Application.index(b, , 4)   ' Colonne des dates 
    End Sub
     
    Sub Tri(clé() As String, index() As Long, gauc, droi) ' Quick sort
       ref = clé((gauc + droi) \ 2)
       g = gauc: d = droi
       Do
          Do While clé(g) < ref: g = g + 1: Loop
          Do While ref < clé(d): d = d - 1: Loop
            If g <= d Then
               temp = clé(g): clé(g) = clé(d): clé(d) = temp
               temp = index(g): index(g) = index(d): index(d) = temp
               g = g + 1: d = d - 1
            End If
        Loop While g <= d
        If g < droi Then Call Tri(clé, index, g, droi)
        If gauc < d Then Call Tri(clé, index, gauc, d)
    End Sub
    Fichiers attachés Fichiers attachés

  4. #4
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Bonsoir à tous,

    sophieceuzin, il peut être parfois nécessaire d'écrire son propre code d’algorithme de tri, dans ton cas je n'en vois aucune utilité. On aura l'impression de coder en C. Comme si l'on était pas dans une explication qui mettait à notre disposition un code bien propre.

    Tu souhaites trier le tableau sur la base de de ta 2 ème colonne.
    La methode Sort d'Excel suggérée par Philippe est déjà assez complète et satisfaisante à mes yeux dans de bien de situations, si ce n'est toutes les situations.(il suffirait de la manipuler autrement).

    Pour trier ta plage sur l'indice de colonne n°2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ma_Plage.Sort key1:=2, SortOn:=xlSortOnValues, Order1:=xlAscending, Header:=xlGuess, Orientation:=xlSortRows, DataOption:=xlSortNormal
    Consulte l'aide locale ou en ligne sur Sort pour mieux appréhender les options.

  5. #5
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 56
    Par défaut
    Bonjour,

    NVCfrm, le but n'est évidemment pas d'effectuer un tri dans le tableur mais celui d'un tableau en mémoire comme il est demandé dans le post initial.
    La lecture des données dans le tableur et l'écriture dans le tableur ne sont là que pour les besoins de la démonstration.

    Ceuzin

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 113
    Par défaut
    Merci Sophie ta première solution est exactement ce que je recherchais

    J'ai juste un soucis, qui est logique au point de vue du tri c'est qu'il m'est les cases vides avant alors que j'aimerais les avoir après.
    Je m'explique :

    J'ai pour l'instant mes données qui sont dans le tableur comme suite :

    Nom1 | Prénom 1 | Salaire 1 | Nom 2 | Prénom 2 | Salaire 2 | Nom 3 | Prénom 3 | Salaire 3 |...
    Et ainsi de suite jusqu'à 7
    En sachant qu'il est possible que seulement les deux premières "personnes" soit remplis donc le reste soit vide. J'aimerais garder ces vides pour la fin alors pour l'instant j'ai pensé à ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Dim tGranu()   
    Dim tTempGranu()
     
    For x = 0 To 6
         If cells(2, 59 + 3 * x) <> "" Then
            tTempGranu = Range(cells(2, 59 + 3 * x), cells(2, 66 + 3 * x))
            ReDim Preserve tGranu(x)
            tGranu(x) = Application.Transpose(tTempGranu)
        End If
    Next
    Pour avoir un tableau à analyser comme suite :
    Nom1 | Nom 2 | Nom 3 |
    Prénom 2 | Prénom 3 | Prénom 3 |
    Salaire 1 | Salaire 2 | Salaire 3 |

    Mais je me doute que ça marche pas trop, une idée de comment améliorer mon code ?

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 18/05/2012, 13h15
  2. Trier un tableau multidimensionnel
    Par malabarbe dans le forum Langage
    Réponses: 9
    Dernier message: 04/03/2010, 20h28
  3. [PHP 5.2] Trier un tableau multidimensionnel ?
    Par nazoreen dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2009, 15h59
  4. [Tableaux] comment trier un tableau multidimensionnel
    Par tibotibo69 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 17h04
  5. [Tableaux] trier un tableau multidimensionnel
    Par chris801 dans le forum Langage
    Réponses: 2
    Dernier message: 08/06/2007, 08h43

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