Trier par ordre alphabétique un tableau.

Signaler
-
 Nohlan -
Bonsoir,
Ceci est mon 1er message, je vais donc me présenter vite fais. Je m’appelle Jérémy, 25 ans, je suis étudiant en Dut Info S1 et j'ai débuté par Access en base de donnée.

Je tombe sur un petit problème que je n'arrive pas a régler. J'ai déjà essayé pas mal d’algorithme, mais rien ne fonctionne.

C'est pourtant simple, je souhaiterai trier un tableau de 2 colonne par ordre alphabétique.

Mon tableau ce présente telle quel :

For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    T_client_index(i, 1) = Mid(enreg_clients, 1, 3)
                    T_client_index(i, 2) = Mid(enreg_clients, 4)
                    
Next


1WISSOCQ
2ASCONE
3BENCTEUX
4CANNY
5CUVILLIER
6DUPONCHEL
7GODON
8LEFEBVRE
9LEMAITRE
10PAPEGAY
11RAVAUX
12SOUXDORF
13THOREZ
14VASTRA

Je n'ai mis qu'une petit parti bien sur ( il y a 132 noms)

Je ne demande pas un algorithme ou code tout fait. Je souhaite comprendre le fonctionnement du tri d'un tableau pour en faire un code.

D'avance merci !

51 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut et bienvenu, Jérémy.

Sous Access, tu fais du VBA, pas du VB.Net.
Mémorise la catégorie de la question pour le futur, merci.

VBA s'apparente à VB6.
En faisant une recherche de "trier tableau" parmi les codes (sauf .Net), tu trouveras des exemples - Les fichiers FRM, BAS, CLS sont lisibles sous NotePad (ou autre)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Merci pour ta réponse Jack, j'ai effectivement lue des sources sur le site mais je ne les comprend pas. Je ne souhaite pas faire un simple copier/coller du code. Je souhaite comprend comment cela fonctionne et en crée un.

Ayant 2 colonnes ( une pour le numero et une pour le nom ), je souhaite que les 2 bougent en même temps.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Bonjour,
1) Quel code as-tu tenté de comprendre ? (plusieurs manières possibles, donc plusieurs codes possible) ?
2) pour faire en sorte que la 2ème colonne suivent l'ordre de la première, c'est évident : lorsque l'on déplace (changement de ligne) un item de la première colonne, on en fait autant (on l'envoie sur la même ligne) avec l'item correspondant de la seconde (évident !)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Merci Ucfoutu.

J'avais trouvé ce code là qui m'avait l'aire opé :

Sub TriAlpha(stringTab As Variant)
   Dim var_tampon As String
    For i = UBound(stringTab) To 1 Step -1
        For j = 0 To i - 1
            If stringTab(j) > stringTab(j + 1) Then
                var_tampon = stringTab(j)
                stringTab(j) = stringTab(j + 1)
                stringTab(j + 1) = var_tampon
            End If
        Next j
    Next i
End Sub


je rajouterai biensur le déplacement de ma 2éme colonne.

Mais je ne vois pas comment va ce dérouler les actions dans mon tableau.
D'accord s'il trouve une chaine plus grande, il va la mettre en tampon pour remplacer par celle en j+1. Mais cette nouvelle variable qui est en 1er position ne sera plus verifié par les suivantes ? J'ai bien vue une 2éme boucle "for" au debut mais je ne comprend pas les lignes :

Sub TriAlpha(stringTab As Variant)
Dim var_tampon As String
For i = UBound(stringTab) To 1 Step -1
For j = 0 To i - 1
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
tout est pourtant là :
var_tampon = stringTab(j)
  stringTab(j) = stringTab(j + 1)
  stringTab(j + 1) = var_tampon

si tu ne comprends pas le déplacement induit pour un tableau à une seule colonne, avance pas à pas ! (c'est comme avec un tas de buchettes) !
Si tu le comprends et que tu ne vois vraiment pas comment l'adapter pour un tableau à deux colonnes, c'est que tu n'a alors pas encore acquis la connaissance d'un tableau dynamique !
Je vais ME CONTENTER de ceci :
Un tableau à 2 dimensions est ainsi dimensionné (exemple)
Dim tablo(3,2) ===>> 3 lignes et deux colonnes
On se réfère à la ligne x de la colonne y par : tablo(x,y)
Si je déplace la ligne 2 de la première colonne vers la ligne 1 de la première colonne ===>>
je déplace également la ligne 2 de la deuxième colonne vers la ligne 1 de la deuxième colonne.
Je ne vois vraiment pas : ni ton incompréhension, ni l'utilité d'une deuxième boucle !
Je VEUX te voir appliquer (au moins tenter) cela et voir le code écrit.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Personnellement, j'irais plutôt comme ceci
For i = 0 to UBound(stringTab) ' ou UBound(stringTab) -1 selon la méthode de vérification
For j = i to UBound(stringTab) 'même commentaire

Le "-1" peut être nécessaire pour éviter de vérifier une donnée en dehors des limites du tableau

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Private Sub TRIER_Click()
    
        Erase T_client_index
        
        Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client_index" For Input As fichier_client_index
        
                
                For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    T_client_index(i, 2) = Mid(enreg_clients, 1, 3)
                    T_client_index(i, 1) = Mid(enreg_clients, 4)
                    
                Next
        
                For i = UBound(T_client_index) To 1 Step -1
                    For j = 0 To i - 1
                        If Asc(T_client_index(j, 1)) > Asc(T_client_index(j + 1, 1)) Then
                            var_tampon = T_client_index(j, 1)
                            T_client_index(j, 1) = T_client_index(j + 1, 1)
                            T_client_index(j + 1, 1) = var_tampon
                        End If
                    Next j
                Next i
       
        Close fichier_client_index
        
End Sub


J'ai dans un 1er temps essayé de trier la 1er colonne, mais cela ne marche pas avec mes :
Asc(T_client_index(j, 1)) > Asc(T_client_index(j + 1, 1)

Est une bonne solution pour comparer des chaines de caractéres ?
Ma méthode ne fonctionne pas apparement mais je ne vois pas l'erreur.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Ah !
Et tu crois qu'en passant par l'utilisation (au demeurant bien inutile) de Asc, tu es allé dans le sens que je t'indiquais ?
Je t'ai demandé (sur la base de ce que je t'exposais) : non de changer de code, mais de déplacer à chaque fois (en utilisant le code, tel quel, de tri de la colonne 1) l'article de la colonne 2 correspondant à un déplacement de l'article de la colonne 1.
Relis. Réfléchis ===>> tente, au moins !


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Merci Ucfoutu pour toute ces infos, mais je voudrai dans un 1er temps bouger la colonne 1 , la 2 c'est pas le problème.

Je suis passé par le code Asc pour vérifier les chaines de caractère mais ça n'a pas l'aire de fonctionner : Argument ou appel de procédure incorrecte.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
je voudrai dans un 1er temps bouger la colonne 1

Oui ?
et que fait donc le code montré (si une seule colonne) ?
Et qu'ai-je dit plus haut à propos des tableaux à 2 dimensions ?
Ce sont ces deux dimensions, que je voudrais (et je t'en ai pourtant parlé) de voir utiliser !
Une chose apparaît de plus en plus clairement : tu veux utiliser des tableaux dynamiques, mais sans même prendre la peine de t'y intéresser !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Je ferai simplement :

If String1 > String2 Then
                            var_tampon = T_client_index(j, 1)
                            T_client_index(j, 1) = T_client_index(j + 1, 1)
                            T_client_index(j + 1, 1) = var_tampon
                            
                            var_tampon = T_client_index(j, 2)
                            T_client_index(j, 2) = T_client_index(j + 1, 2)
                            T_client_index(j + 1, 2) = var_tampon
                        End If


Mais pour la 1er colonnes ca ne fonctionne même pas.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Tu vas me faire le plaisir d'ouvrir ton aide VBA à la rubrique
Utilisation des tableaux

la lire
t'attarder à la sous-rubrique :
Utilisation de tableaux multidimensionnels

la lire également
elle est claire et n'apporte aucune remarque de ma part !
Sauf peut-être celle-ci : ton tableau n'ayant que deux colonnes, il n'est pas vraiment nécessaire d'utiliser une seconde boucle pour si peu ===>
A l'article tablo(3,1) de la 1ère colonne correspond l'article (sur la même ligne) tablo(3,2) de la 2ème colonne. Dur dur ? Vraiment ?
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Je viens de lire l'aide, n'ayant vue en cour que le simple tableau, je découvre un peu tout ça. J'essaye bien sur de comprendre le fonctionnement. J'ai modifié un peu mon code qui ne fonctionne toujours pas, j'ai modifié la comparaison des chaines, mais toujours la même erreur dans le StrComp.

For i = 1 To UBound(T_client_index)
                        
                        TestComp = StrComp(T_client_index(j, 1), T_client_index(j + 1, 1))
                        
                        If TestComp = 1 Then
                            var_tampon = T_client_index(j, 1)
                            T_client_index(j, 1) = T_client_index(j + 1, 1)
                            T_client_index(j + 1, 1) = var_tampon
                            
                            var_tampon = T_client_index(j, 2)
                            T_client_index(j, 2) = T_client_index(j + 1, 2)
                            T_client_index(j + 1, 2) = var_tampon
                        End If
                Next
Une erreur modifié, remplacement des j par des i.

TestComp = StrComp(T_client_index(i, 1), T_client_index(i + 1, 1)) :
-l'indice n’appartient pas à la sélection.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
C'est pas vrai ....
Regarde ce petit exemple que je te fait en vitesse.
Il est bâclé et ne fait qu'appliquer ce que je t'ai dit. Rien d'autre ! ===>>

Dim tablo(2, 1) ' tableau exemple à 3 lines et 2 colonnes (puisque indices commençant à 0)
 
  'remplissons-le, pour avoir un exemple à traiter
  tablo(0, 0) "toto": tablo(0, 1) "corr toto"
  tablo(1, 0) "tata": tablo(1, 1) "corr tata"
  tablo(2, 0) "titi": tablo(2, 1) "corr titi"
  
  ' trions-le, maintenant sur la 1ère colonne, par oirdre croissant :
  
  Dim tampon_col1 As String, tampon_col2 As String, i As Integer
  For i = 0 To UBound(tablo, 1) - 1
    If tablo(i, 0) > tablo(i + 1, 0) Then
      tampon_col1 tablo(i, 0): tampon_col2 tablo(i, 1)  ' je mémorise les deux !
      tablo(i, 0) tablo(i + 1, 0): tablo(i, 1) tablo(i + 1, 1) 'je déplace les deux
      tablo(i + 1, 0) tampon_col1: tablo(i + 1, 1) tampon_col2  ' je déplace les deux
     End If
   Next i
 
  ' preuve que ton tableau a été trié sur colonne 1 et sa colonne 2 a suivi ===>>
  For i = 0 To UBound(tablo, 1)
    MsgBox "première ligne : " & tablo(i, 0) & " en sa colonne 1 et &  " & tablo(i, 1) & " en sa colonne 2"
  Next

Alors ???


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Je comprend très bien ce code Ucfoutu, je test sur le miens un truc similaire, et te dit te suite si cela fonctionne.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Non ! Ne viens rien me dire car moi, j'en ai terminé avec ce truc à 4 sous.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
Encore merci ucfoutu pour toute ces infos. Ton dernier exemple était clair, j'ai essayé de l'adapter a mon code mais il reste un souci je pense.

Je joins ma source si quelqu'un y voit quelque chose.
D'avance merci.

Private Sub TRIER_Click()
    
        Erase T_client_index
        
        Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client_index" For Input As fichier_client_index
        
                
                For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    
                    T_client_index(i, 1) = Mid(enreg_clients, 4)
                    T_client_index(i, 2) = Mid(enreg_clients, 1, 3)
                    
                Next
        
       
  
                Dim tampon_col1 As String, tampon_col2 As String
                For i = 1 To UBound(T_client_index, 1) - 1
                    If T_client_index(i, 1) > T_client_index(i + 1, 1) Then
                        tampon_col1 = T_client_index(i, 1)
                        tampon_col2 = T_client_index(i, 2)  ' je mémorise les deux !
                        T_client_index(i, 1) = T_client_index(i + 1, 1)
                        T_client_index(i, 2) = T_client_index(i + 1, 2) 'je déplace les deux
                        T_client_index(i + 1, 1) = tampon_col1
                        T_client_index(i + 1, 2) = tampon_col2  ' je déplace les deux
                    End If
                Next
       
       
                For i = 1 To UBound(T_client_index)
                    ' J'affiche dans ma fenétre Access un résultat pour voir.
                    
                    TEXTETRIER = TEXTETRIER & T_client_index(i, 1) & "|" & T_client_index(i, 2) & Chr(13) & Chr(10)
                    nbrC = nbrC + 1
                     
                Next
        
        
        
        Close fichier_client_index
        
End Sub


Et dans ma fenétre Access :

ASCONE | 2
BENCTEUX | 3
CANNY | 4
CUVILLIER | 5
DUPONCHEL | 6
GODON | 7
.
.(Je n'est pas tout mis.)
.
NJIEDJOUK |132
MACHIN133 |133
FORGET |134
DECOTTIGNIES |135
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WISSOCQ | 1
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

Private Sub BubleSortTable()
 Dim rowword As Integer
 Dim row As Integer
 Dim word1, word2 As String
 row = UBound(table, 1) - 1
For i = 0 To UBound(table, 1) - 1
 
  For iter = 0 To row
   If LCase(table(iter, 0) & table(iter, 1)) > LCase(table(iter + 1, 0) & table(iter + 1, 1)) Then
    word1 = table(iter, 0)
    word2 = table(iter, 1)
    table(iter, 0) = table(iter + 1, 0)
    table(iter, 1) = table(iter + 1, 1)
    table(iter + 1, 0) = word1
    table(iter + 1, 1) = word2
   End If
   Next iter
   row = row - 1
 Next i
End Sub


bon courage
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
Rhoooo...
Quel rapport avec le problème du tri d'un tableau ?
Ce problème a été traité et tu l'as bien adapté à un tableau basé sur l'indice 1 et non 0

Tu n'y tries par contre QUE les articles qu'il contient (ceux dont tu l'as alimenté ! . Il ignore tous les autres (déjà dans ta table, pourtant)
Et tu l'as alimenté par CE code :
Open "H:\Cours\OMGL\OMGL 1\tpfichiers\client_index" For Input As fichier_client_index
        
                
                For i = 1 To UBound(T_client_index)
                    
                    Line Input #fichier_client_index, enreg_clients
                    
                    T_client_index(i, 1) = Mid(enreg_clients, 4)
                    T_client_index(i, 2) =  Mid(enreg_clients, 1, 3)
                    
                Next

où l'on voit bien que le tableau (étrange !!!) était dimensionné à l'avance (comment et à combien, d'ailleurs ?)
Elle est là, ton "erreur"... et n'a rien à voir avec le tri !
Ouvre ton aide VBA sur le mot Preserve (Redim Preserve) et lis
Si tu as encore des difficultés avec cet aspect-là ===>> autre discussion car rien à voir avec le tri, mais avec l'alimentation d'un tableau (à trier ou non !) !
A demain, peut-être (vais au dodo, là ...)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ