Tri alphabétique

Bonjour,

j'aimerais être capable d'effectuer un tri par ordre alphabétique dans mon fichier résultat avec ce code-ci. Mon tri doit se faire selon la variable MyArray(13) (liste de prénoms). J,ai bien beau chercher depuis 2-3 jours déjà, je ne trouve rien qui m,aide vraiment pour le moment. Je ne sais pas si quelqu'un peut me donner un coup de main. Tout le code est fonctionnel, il manque juste ce petit bout là pour considérer le tout comme 100% fonctionnel.

strSourceFile = "C:\...txt"
strResultat = "C:\....HTML"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.openTextFile(strSourceFile, 1,true)
Set objResultat = objFSO.openTextFile(strResultat, 8,true)

dim Myarray (20)
objResultat.writeline "<table ALIGN=CENTER><tr><td><big><b><span><font size=60> Addresse et Téléphone </FONT></span><br><br></td></tr></table>"
x=0

Do until objTextFile.AtEndOfStream
MyArray(x) = objTextFile.ReadLine
straddresse = Mid(MyArray(1),8,2)
strtelephone = Mid(MyArray(1),11,2)

If x = 19 Then
x=0
objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>"&" "&MyArray(13)&"</font></span></td><td align=center width=40><span><font size=5>"&straddresse&"</font></span></td><td align=center width=20><span><font size=5>"&"/"&"</font></span></td><td align=center width=40><font size=5><span>"&strtelephone&"</span></font></td></tr></table>"
Else
x=x+1
End If
Loop
objTextFile.close
objResultat.close
wscript.quit

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Bonjour,

    oeut-être une piste (je n'en suis pas l'auteur):
    T est ton array
    senstri ctrie dans l'ordre croissant ( de mémoire: true) ou décroissant

    Sub TriaBulle(T, Optional SensTri As Boolean = True)
        Dim Test As Boolean, I&, Temp
         Do
           Test = False
           For I = LBound(T) To UBound(T) - 1
             If (T(I) > T(I + 1) And SensTri) Or (T(I) < T(I + 1) And Not SensTri) Then
               Temp = T(I)
               T(I) = T(I + 1)
               T(I + 1) = Temp
               Test = True
             End If
           Next I
         Loop Until Not Test
      End Sub


    1. Personne? Est-ce que c'est possible à la base? Vers quoi je devrais chercher? Est-ce que je me suis mal exprimé et j'en deviens incompréhensible?

      Toute l'aide apporté sera très apprécié. Je suis vraiment blocké à ce point.

      Merci

      Nick
      1. Merci

        Malheureusement, j'obtiens un message d'erreur sur la 1ere ligne.

        Merci quand même du coup de main. Je vais continuer ma recherche.
        1. Contributeur
          Bonjour,

          Curieux, je viens d'essayer et c'est OK ...(essai sur l'éditeur VBA Ms office)

          peut-^tre parce qu'il s'agit d'une sub paramétrée avec une syntaxe particulière d'appel

          le code ;
          Sub Test()
          tablo = Array("Pierre", "Annie", "Paul", "Jean", "Alain", "Léone")
          TriaBulle tablo
          End Sub
          
          Sub TriaBulle(T, Optional SensTri As Boolean = True)
              Dim Test As Boolean, I&, Temp
               Do
                 Test = False
                 For I = LBound(T) To UBound(T) - 1
                   If (T(I) > T(I + 1) And SensTri) Or (T(I) < T(I + 1) And Not SensTri) Then
                     Temp = T(I)
                     T(I) = T(I + 1)
                     T(I + 1) = Temp
                     Test = True
                   End If
                 Next I
               Loop Until Not Test
            End Sub


          Je ferai un essai en Vbscript et te dirai le résultat
        2. Contributeur
          Voici la version en Vbscript sans macro paramétrée et c'est OK aussi
          T = Array("Pierre", "Annie", "paul", "Jean", "Alain", "Léon")
               Do
                 Test = False
                 For I = LBound(T) To UBound(T) - 1
                   If (T(I) > T(I + 1)) Then
                     Temp = T(I)
                     T(I) = T(I + 1)
                     T(I + 1) = Temp
                     Test = True
                   End If
                 Next
               Loop Until Not Test
               ordre = Join(T, ", ")
               Wscript.Echo ordre
      2. Merci beaucoup Michel de me donner un coup de main. C'est vraiment apprécié. Je ne travaille pas dans le milieu et je n'ai pas non plus de mentor pour m'aider. Je dois apprendre sur le tas et quelques fois ce n'est pas évident. Effectivement, ton code marche parfaitement et c'est exactement ce que je veux faire. Le seul hic que je rencontre, c'est que je n'ai aucune idée où l'insérer dans mon code pour que mon strResultat soit trié de façon alphabétique lorsque je double click sur mon fichier html (strResultat) créé par mon code. Donc en gros, j'aimerais que mon code s'effectue, puisque celui-ci isole certaines variables de mes Arrays et j'aimerais ensuite que les résultats soient triés en ordre alphabétique. J'espère m'être bien exprimé pour que tu comprennes bien ce que je veux faire.

        Voici un exemple d'un de mes Arrays:

        78 38 45 18 24 22 61 59 68 32
        48 48 71 26 119 14 10 0 5 1 0
        2003 16 5 100 0 0 0 0 99
        0 0 0 0
        0 0 0 0
        0 0 0 0 0 1
        10 1 0 0 0 0
        0 0 0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0 0 0
        0 0 0 0 2 219 10 6
        0 0 0 0 0
        0 0 2 58 116
        Jacques Beauchand
        70 80 83 74 86 83 7 1 5 1 0
        1985 16 5 6 2 2003 1 1 1
        9 1 3 0
        1 0 2 0
        50 49 98 1 0 108
        0 108 0 0 0 8

        Au total dans mon fichier, j'ai 3500 Arrays de 20 lignes chacun. La variable à trier alphabétiquement est la ligne 14 de chaque array (MyArray(13)= Nom de personnes).

        strSourceFile = "C:\...txt"
        strResultat = "C:\....HTML"
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        Set objTextFile = objFSO.openTextFile(strSourceFile, 1,true)
        Set objResultat = objFSO.openTextFile(strResultat, 8,true)
        dim Myarray (20)
        objResultat.writeline "<table ALIGN=CENTER><tr><td><big><b><span><font size=60> Addresse et Téléphone </FONT></span><br><br></td></tr></table>"
        x=0
        Do until objTextFile.AtEndOfStream
        MyArray(x) = objTextFile.ReadLine
        straddresse = Mid(MyArray(1),8,2)
        strtelephone = Mid(MyArray(1),11,2)
        If x = 19 Then
        x=0
        objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>"&" "&MyArray(13)&"</font></span></td><td align=center width=40><span><font size=5>"&straddresse&"</font></span></td><td align=center width=20><span><font size=5>"&"/"&"</font></span></td><td align=center width=40><font size=5><span>"&strtelephone&"</span></font></td></tr></table>"
        Else
        x=x+1
        End If
        Loop
        objTextFile.close
        objResultat.close
        wscript.quit

        APRÈS JE NE VOUS ACHALE PLUS :P !!!!! MERCI
        1. Contributeur
          Bonjour,

          Difficile de s'y retrouver dans tes explications...

          tu extrais de ton HTLM une variable tableau StrResultat(3500,20)
          ou as tu 3500 array de 20 données (soit 3500 strResultats) si oui comment passe tu d'un strresultat au suivant ?

          as tu des risques de doublons dans les noms-prénoms ?
        2. Contributeur
          au lieu de StrResultats lire Strsourcefile....
          annule mon post précédent
          en fait, chaque strfiletext envoie des données dans un array dont l'indice 13 renvoie le nom, 1 l'adresse et le tél, et ces 3 données seront retranscrites dans strResuliats dans l'ordre nom, adresse,tél
          C'est bien çà ?

          edit: 11:00
          STP, merci de mettre un fichier source en piece jointe
          pour joindre une pièce
          mettre le fichier sans données confidentielles en pièce jointe sur
          https://www.cjoint.com/
          puis copier l'adresse du lien et la coller dans le message de réponse


          Enfin, le + important:
          quès aco "Achale" ? :o)
        3. [quote="michel_m"] en fait, chaque strfiletext envoie des données dans un array dont l'indice 13 renvoie le nom, 1 l'adresse et le tél, et ces 3 données seront retranscrites dans strResuliats dans l'ordre nom, adresse,tél. C'est bien çà ?  [/quote]  
          
          Oui c'est exactement ça.  
          
          Voici un échantillon de mon fichier source. Je n'ai pas pu le mettre de façon intégral, puisqu'il contient énormément d'informations personnelles. J'ai modifier le texte pour éliminer ces informations, mais dans le fichier en pièces jointes, j'ai seulement mis 6 exemples de arrays présent dans mon fichier et non les 3500 comme j'ai actuellement dans le vrai fichier source. J,espère que ça sera correcte pour les fins de l'exercise.  
          
          https://www.cjoint.com/?0KopgZ4kYSr   
          
          [quote="michel_m"]quès aco "Achale" ? :o)[/quote]  

          Ça veut dire embêté..... Je ne vous embêterai plus ensuite :P
        4. Contributeur
          Bonjour,
          ma question: chaque strfiletext envoie des données dans un array ?
          ta réponse:
          Oui c'est exactement ça.
          + loin
          j'ai seulement mis 6 exemples de arrays présent dans mon fichier et non les 3500

          ????

          D'autre part, tu indiques que la présentation de ton array est vertical (ton document joint) et tu écris dans ton code
          MyArray(x) = objTextFile.ReadLine

          ???

          Bon le principe serait de boucler sur tout les arrays en créant une variable tableau de N lignes (3500) et 3 colonnes identité, adresse, téléphone
          on trierait ce tableau sur l'identité ( par le nom ou le prénom ?)
          on déviderait alors les 3500 lignes sous la forme du fichier text que tu as fait
          mais je commence à douter....
        5. Contributeur
          Le principe mais je renonce à comprendre comment tu extrais tes 3500 arrays
          a toi de voir quel style de boucle tu veux utiliser

          on boucle sur les 3500 arrays  
          ReDim T_tri(2, 0)  
          For cptr = 0 To 3500 ' 3500 à confirmer ou calculer ou autre style de boucle (do loop..., for each array... avec implémention de cptr avant redim preserve)  
               ReDim Preserve T_tri(2, cptr)  
               Tri(0, cptr) = arrayencours(13) 'identité  
               Tri(1, cptr) = Mid(arrayencours(1), 8, 2) 'adresse  
               Tri(2, cptr) = Mid(arrayencours(1), 11, 2) 'téléphone  
          Next  
          
          
          'Pour trier le tableau T_tri avec les 3500 arrays (technique des quicksort pour >1000 lignes)  
          
               Tablo = T_tri  
               Col = 0 'identité  
               Min = LBound(T_tri)  
               Max = UBound(T_tri)  
          
               'Tri rapide  
              Dim I&, J&, K&, M, Chaine  
               I = Min  
               J = Max  
               M = Tablo((Min + Max) / 2, Col)  
               While (I <= J)  
                 While (Tablo(I, Col) < M And I < Max)  
                   I = I + 1  
                 Wend  
                 While (M < Tablo(J, Col) And J > Min)  
                   J = J - 1  
                 Wend  
                 If (I <= J) Then  
                   For K = LBound(Tablo, 2) To UBound(Tablo, 2)  
                     Chaine = Tablo(I, K)  
                     Tablo(I, K) = Tablo(J, K)  
                     Tablo(J, K) = Chaine  
                   Next K  
                   I = I + 1  
                   J = J - 1  
                 End If  
               Wend  
               If (Min < J) Then TriMulti Tablo, Col, Min, J  
               If (I < Max) Then TriMulti Tablo, Col, I, Max  
            End Sub


          'écriture du fihier résultat
          fin = cptr
          For cptr = 0 To fin
          objResultat.writeline "<table border=1 ALIGN=CENTER valign=middle cellspacing=0 cellpadding=0><tr><td align=left width=300><span><font size=5>" & " " & T_tri(0, cptr) & "</font></span></td><td align=center width=40><span><font size=5>" & T_tri(1, cptr) & "</font></span></td><td align=center width=20><span><font size=5>" & "/" & "</font></span></td><td align=center width=40><font size=5><span>" & T_tri(2, cptr) & "</span></font></td></tr></table>"
          'aller à la ligne
          Next

          Voilà, je ne peux plus faire grand chose, hélas (eextraction des arrays mystérieuses pour moi)

          Enfin Chalade: quel langue ou dialecte ?
          dans mon coin, c'est plutôt "escagasser" mais c'est vulgaire ....:oD