Rechercher : dans
Par :

[VBA] Tri tableau multidimensionnel

Dernière réponse le 27 jan 2009 à 14:09:28 zoubinho, le 21 jan 2009 à 15:35:18 
 Signaler ce message aux modérateurs

Bonjour,

Sous Excel VBA, je cherche à trier mon tableau multidimensionnel dont la 1ere colonne est un String et la 2nde, un Integer. Voilà ce que ça donne visuellement :

toto 10
titi 5
tutu 20
tata 15

Et je cherche à obtenir :
titi 5
toto 10
tata 15
tutu 20

Mon tableau est défini de la sorte : Public Tab(4,2) as String
J'ai trouvé des exemples de tri pour des tableaux à une dimension ou même pour des Array, mais pas pour mon cas...

Quelqu'un aurait-il une idée ?

Merci d'avance

Configuration: Windows XP
Excel 2003

Meilleures réponses pour « [VBA] Tri tableau multidimensionnel » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Tri par fusion - récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri par fusion : Procedure Tri_Fusion (Var t : TAB; g, d : integer); Var m, i, j, k : integer; s : TAB; Begin If d > g Then ...
Pascal - Tri par insertion - Récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri par insertion : Procedure Tri_Ins (Var t: TAB; n: integer); Var aux,i : integer; begin If n > 1 Then begin ...
Javascript - Les tableaux VoirIntroduction à la notion de tableau Les variables de Javascript ne permettent de stocker qu'une seule donnée à la fois. Or, étant donné qu'il est souvent utile de manipuler de nombreuses données, le concept de variable se révéle parfois...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

Foreverson, le 21 jan 2009 à 15:45:14

Si tu veux faire une macro :

Outils->macro->nouvelle macro

Tu lui donnes un nom.

Ensuite, tu sélectionnes la plage de données (de la cellule toto à la cellule 15), puis "données", "trier", tu mets la colonne des nombres comme clé de tri, puis tu cliques sur croissant.

Ensuite, Outils->macro-> arrêter l'enregistrement.

Je pense que ça marche !

Sinon, sans la macro, tu fais juste le passage en italique.

Répondre à Foreverson

2

zoubinho, le 21 jan 2009 à 17:09:50

Bonjour Foreverson,

Merci de ta réponse.
Après record de la macro, voilà ce que j'ai obtenu :

    Range("A3:B6").Select
    Selection.Sort Key1:=Range("B3"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

Cependant, je l'ai peut-être mal exprimé, mais je voudrais effectuer mon tri sur les données de mon tableaux et non les données des cellules. Ici, c'est typiquement un traitement sur les cellules.

A la rigueur, si Excel acceptait ce genre de code :
    tab().Select
    Selection.Sort Key1:=tab(x,2), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal

alors je serais aux anges !! Mais ce n'est pas le cas.
Je suis donc à la recherche d'un petit bout de code I guess, qui n'est présent sur aucune page de la toile.. (ok 5h de recherche ne correspond pas à toute la toile, mais j'espère que vous comprenez l'exaspération au terme des 5 heures...)

Répondre à zoubinho

3

Foreverson, le 21 jan 2009 à 17:35:23

Je ne peux pas t'aider plus, je connais un poil Excel mais sans plus...

Bonne chance à toi !

Répondre à Foreverson

4

 zoubinho, le 27 jan 2009 à 14:09:28

J'ai finalement pondu mon propre code.
Il n'est surement pas optimisé, mais voilà ce que ça donne. J'ai dû passer par l'utilisation d'un buffer

Function SortTable(ByRef tablo() As Variant, ByVal nbItem As Integer)
    Dim i, j, k As Integer
    Dim buffer(1, 3) As Variant
    Dim temp, indice As Integer
    Dim newTab() As Variant
    ReDim newTab(nbItem, 3)
    
    For j = 0 To nbItem - 1
        temp = "200"
        For i = 0 To nbItem - 1
            If (tablo(i, 2) < temp) And (tablo(i, 2) > 0) Then
                temp = tablo(i, 2)
                For k = 0 To 3
                    'record whole line in buffer
                    indice = i
                    buffer(1, k) = tablo(i, k)
                Next k
            End If
        Next i
        If buffer(1, 1) <> "" Then
            tablo(indice, 2) = -1
            For k = 0 To 3
                newTab(j, k) = buffer(1, k)
            Next k
        End If
        
        'reset of indice and buffer
        indice = 0
        For k = 0 To 3
            buffer(1, k) = ""
        Next k
    Next j
    
    SortTable = newTab
    
End Function


Quelques indications :
tablo() est le tableau non trié
newTab() est le tableau trié
temp sert de critère de comparaison (chiffre, integer, enregistré dans un String)
indice permet de récupérer le n° de l'itération qu'il faudra rajouter à la suite dans le tableau trié.
buffer est un tableau de 4 colonnes permettant de copier la ligne entière.
- Lorsqu'un élément de tablo() a été ajouté à newTab(), sa valeur(champ de test) est mis à -1
- temp est initialisé à 200 car mes valeurs ne vont pas au dessus de 200.


Pour ceux qui cherchaient la même chose que moi, voilà un début de solution ; pour ceux qui veulent améliorer ce bout de code, don't hesitate !!

Répondre à zoubinho
Collection CommentÇaMarche.net