Trier par ordre alphabétique un tableau.

Nohlan - 27 nov. 2012 à 22:23
 Nohlan - 29 nov. 2012 à 22:31
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

cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
28 nov. 2012 à 01:22
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)
0
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 11:12
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
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 12:55
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
0
cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
20
28 nov. 2012 à 15:04
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
0
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 20:51
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
0
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 21:21
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
0
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 21:32
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
0
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
0
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.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 22:07
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
0
Je comprend très bien ce code Ucfoutu, je test sur le miens un truc similaire, et te dit te suite si cela fonctionne.
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 22:19
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
0
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
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
28 nov. 2012 à 22: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
0
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
28 nov. 2012 à 23:20
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
0