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 Array bi-dimensionnel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut Tri Array bi-dimensionnel
    Bonjour à tous,

    J'ai un array de la taille suivante Tableau(5,50). Sachant que la première dimension (5) est fixe et que la seconde (50) est variable et redimensionnée après chaque appel de macro. La deuxième dimension varie de 10 à 70 en gros en fonction des données que je traite.

    J'ai trouvé de nombreux algorithmes de tri sur internet et le forum mais je n'ai pas l'impression qu'un tri soit proposé sur la première dimension et la valeur 3.

    En effet, mon tableau contient ce type de données :
    Pour i de 1 à 50 (en option base 1)
    Tableau(1,i) = Nom de la matière première "i"
    Tableau (2,i) = Origine de la matière première "i"
    Tableau(3,i) = Masse de la matière première "i"
    Tableau (4,i) = Variation de la matière première "i"
    Tableau(5,i) = Variation en pourcentage de la matière première "i"

    Je souhaiterais donc trier ce tableau en fonction des masses donc classer les différents Tableau(3,i) pour tous les i... Et que bien entendu le nouveau tableau garde les associations Nom,Origine,Masse,Variation et Variation Pourcentage.

    Merci d'avance pour votre aide.

    Cordialement,
    Martin

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une solution possible avec ce 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
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    Option Explicit
    Option Base 1
     
    Public Tableau() As Variant
    Public StrTemp As Variant
     
    Public I As Long
    Public J As Long
    Public CtrI As Long
    Public CtrJ As Long
     
    Public ShSource As Worksheet
    Public TitreSource As Long
    Public DerniereLigneSource As Long
    Public AireSource As Range
    Public CelluleSource As Range
     
    Public ShCible As Worksheet
    Public AireCible As Range
    Public CelluleCible As Range
     
     
     
    Sub TriDeLaMatrice()
     
               ChargementMatrice
     
               'Tri le contenu du tableau par ordre de la colonne 3
               For CtrI = 1 To UBound(Tableau, 2)
                   For CtrJ = 1 To UBound(Tableau, 2)
                        If Tableau(3, CtrI) < Tableau(3, CtrJ) Then
                            StrTemp = Array(Tableau(1, CtrI), Tableau(2, CtrI), Tableau(3, CtrI), Tableau(4, CtrI), Tableau(5, CtrI))
                            For J = 1 To 5
                                Tableau(J, CtrI) = Tableau(J, CtrJ)
                                Tableau(J, CtrJ) = StrTemp(J)
                            Next J
                        End If
                   Next CtrJ
               Next CtrI
     
               DechargementMatrice
     
     
    End Sub
     
    Sub ChargementMatrice()
     
        Set ShSource = Sheets("Feuil1")
        TitreSource = 10
     
        With ShSource
             DerniereLigneSource = .Cells(.Rows.Count, 1).End(xlUp).Row
             Set AireSource = .Range(.Cells(TitreSource + 1, 1), .Cells(DerniereLigneSource, 1))
             ReDim Tableau(5, AireSource.Count)
     
             I = 1
             For Each CelluleSource In AireSource
                 For J = 0 To 4
                     Tableau(J + 1, I) = CelluleSource.Offset(0, J)
                 Next J
                 I = I + 1
             Next CelluleSource
     
             Set AireSource = Nothing
     
        End With
     
        Set ShSource = Nothing
     
    End Sub
     
    Sub DechargementMatrice()
     
        Set ShCible = Sheets("Feuil1")
        TitreSource = 10
     
        With ShCible
     
             DerniereLigneSource = .Cells(.Rows.Count, 1).End(xlUp).Row
             Set AireCible = .Range(.Cells(TitreSource + 1, 7), .Cells(DerniereLigneSource, 7))
     
             I = 1
             For Each CelluleCible In AireCible
                 For J = 0 To 4
                    CelluleCible.Offset(0, J) = Tableau(J + 1, I)
                 Next J
                 I = I + 1
             Next CelluleCible
     
             Set AireCible = Nothing
     
        End With
     
        Set ShCible = Nothing
     
    End Sub
    Cordialement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut
    Merci Eric, ça fonctionne.
    Ce n'était pas si dur en fait j'aurais pu trouver...
    Vu ma faible quantité de données l'algo fonctionne bien. Après j'imagine que passé les 300 lignes, il faudrait envisager un algorithme de tri plus rapide.
    Mais ça fait largement l'affaire pour l'instant.
    Merci !
    Martin

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut
    Bonjour Eric,

    Finalement il s'avère que l'étape de tri du tableau a grandement augmenté la durée d'exécution de la macro.
    Penses-tu qu'on puisse adapter un algo de quick sort sur mon problème?
    Je m'en occupe si oui mais je souhaiterais savoir si tu penses cela faisable?
    Merci beaucoup.
    Martin

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SuperKiwi Voir le message
    Finalement il s'avère que l'étape de tri du tableau a grandement augmenté la durée d'exécution de la macro.
    Penses-tu qu'on puisse adapter un algo de quick sort sur mon problème?
    Je m'en occupe si oui mais je souhaiterais savoir si tu penses cela faisable?
    Merci beaucoup.
    Martin
    Est-il vraiment nécessaire de travailler avec une matrice ? Ne serait-ce pas plus simple de travailler directement avec une aire préalablement triée avec un champ "flag" si une ou plusieurs conditions devaient être satisfaites? Cf Set AireSource = ...

    Nb : Il y a quelques temps, j'étais un inconditionnel des matrices, mais j'essaye maintenant de m'en passer le plus possible.

    Cordialement.

Discussions similaires

  1. Tri tableau mutli dimensionnel
    Par foxmaster2005 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/10/2014, 08h11
  2. Tri array imbriqué
    Par chouchouilloux dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2012, 23h01
  3. Tri Array Multidim. avec valeurs égales
    Par jimmyneutron dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 02/05/2011, 10h23
  4. Array multi dimensionnelle et associative
    Par nico33307 dans le forum Langage
    Réponses: 6
    Dernier message: 09/05/2008, 07h05
  5. Fonction de tri array
    Par Montor dans le forum Langage
    Réponses: 6
    Dernier message: 07/05/2008, 16h33

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