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

VBA Word Discussion :

Tri element listbox


Sujet :

VBA Word

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 18
    Points
    18
    Par défaut Tri element listbox
    Bonjour,

    Dans une listbox, je fais afficher la liste des fichiers d'un répertoire.

    Ce répertoire contient les fichiers suivants : data.txt, Exo1.docx, Exo2.docx, Exo3.docx, ....., Exo10.docx, ....

    La listbox affiche alors : Exo1, Exo10, Exo11, .., Exo19, Exo2, ..... ( je ne prends pas en compte le data.txt et j'ai fait supprimer le .docx dans l'affichage par un split ).

    Comment puis-je faire pour afficher l'ordre suivant dans la listbox : Exo1, Exo2, Exo3, ... , Exo9, Exo10, ...?

    Voici une partie de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Set Fso = CreateObject("Scripting.FileSystemObject")
    With Fso.GetFolder(Chemin) 'Liste les fichiers du répertoire
        For Each NomFich In .Files
            If NomFich.Name <> "data.txt" Then
            Nomdemonfichier = Split(NomFich.Name, ".")(0)
            ListBox1.AddItem Nomdemonfichier
            End If
     
        Next
    End With
    Merci.

    Lionel.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par yoyo781 Voir le message
    Bonjour,

    Essayez :
    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
     
    Sub ImporterEtTrier()
     
    Dim I As Integer, J As Integer
    Dim StrTemp As Variant
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        With Fso.GetFolder(Chemin) 'Liste les fichiers du répertoire
             For Each NomFich In .Files
                 If NomFich.Name <> "data.txt" Then
                    Nomdemonfichier = Split(NomFich.Name, ".")(0)
                    ListBox1.AddItem Nomdemonfichier
                 End If
             Next
        End With
        Set Fso = Nothing
     
        With ListBox1
             For CtrI = 0 To .ListCount - 1
                 For CtrJ = 0 To .ListCount - 1
                     If .List(I) < .List(J) Then
                        StrTemp = .List(I)
                        .List(I) = .List(J)
                        .List(J) = StrTemp
                     End If
                 Next J
             Next I
       End With
     
    End Sub

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Bonjour Eric,

    Je te remercie de t' être penché sur mon problème. Malheureusement, ta solution ne fonctionne pas et les fichiers restent dans le même ordre qu'au départ.

    Comme j'avais déjà envisagé ta solution, j'ai creusé un peu plus.

    J'ai réussi à résoudre mon problème en

    créant 2 listbox ( listbox 1 non visible et listbox2 visible ) :

    extrayant les numéros 1, 2, 3, ... de exo1, ex2, exo3, ... puis je les ai mis dans listbox1.

    comparant et triant ces valeurs 1,2,3 en les prenant comme des integer et toujours à l'intérieur de la listbox1.

    La listbox contient 1,2,3... de manière triée.

    J'ai créé une listbox2 recréant le nom Exo1, Exo2, .... où 1,2,3 sont repris de la listbox1.

    Du coup, j'obtiens dans listbox2 : Exo1, Exo2, ..., Exo9, Exo10, Exo11, .. dans cet ordre.

    Je mets mon 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
    ListBox1.Clear
    ListBox1.Visible = False ' Cache la listbox1
     
    Chemin = "F:\Lionel\Travail\Gestion_Base_Exercices\Base Exercices"
     
    Dim I As Integer, J As Integer
    Dim StrTemp As Variant
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        With Fso.GetFolder(Chemin) 'Liste les fichiers du répertoire
             For Each NomFich In .Files
                 If NomFich.Name <> "data.txt" Then
                    Nomdemonfichier = Split(NomFich.Name, ".")(0)
                    Numerodexercice = Mid(Nomdemonfichier, 4) ' Extraction à partir du Nomdemonfichier du numero de l'exercice
                    ListBox1.AddItem (Numerodexercice) ' Création de la listbox1 à partir du numerodexercice
                 End If
             Next
        End With
        Set Fso = Nothing
     
        With ListBox1
             For I = 0 To .ListCount - 1
                 For J = I To .ListCount - 1
                     If CInt(.List(I)) > CInt(.List(J)) Then ' comparaison des valeurs entrées dans listbox1 considérées comme entières de la liste
                        StrTemp = .List(I)
                        .List(I) = .List(J)
                        .List(J) = StrTemp
                     End If
                 Next J
             Next I ' la listbox1 est maintenant triée par ordre croissant
       For I = 0 To ListBox1.ListCount - 1 'Création de la listbox2
            affichnom = "Exo" & ListBox1.List(I)
            ListBox2.AddItem affichnom
       Next I
     
     End With
     
     
    End Sub

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par yoyo781 Voir le message
    Bonjour,

    Désolé, je n'ai pas fait attention en recopiant le code, les deux lignes suivantes sont à remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            For CtrI = 0 To .ListCount - 1
                 For CtrJ = 0 To .ListCount - 1
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            For I = 0 To .ListCount - 1
                 For J = 0 To .ListCount - 1
    Le code complet avec les variables qui manquaient dans votre 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
     
    Sub ImporterEtTrier()
     
    Dim Fso As Object
    Dim I As Integer, J As Integer
    Dim StrTemp As Variant
    Dim NomFich As File
    Dim Chemin As String
    Dim Nomdemonfichier As Variant
     
        Chemin = "C:\Users\......\"                                                  'A adapter
        Set Fso = CreateObject("Scripting.FileSystemObject")
        With Fso.GetFolder(Chemin) 'Liste les fichiers du répertoire
             For Each NomFich In .Files
                 If NomFich.Name <> "data.txt" Then
                    Nomdemonfichier = Split(NomFich.Name, ".")(0)
                    UserForm1.ListBox1.AddItem Nomdemonfichier
                 End If
             Next
        End With
        Set Fso = Nothing
     
        With UserForm1
          With .ListBox1
             For I = 0 To .ListCount - 1
                 For J = 0 To .ListCount - 1
                     If .List(I) < .List(J) Then
                        StrTemp = .List(I)
                        .List(I) = .List(J)
                        .List(J) = StrTemp
                     End If
                 Next J
             Next I
          End With
     
          .Show
     
       End With
     
    End Sub
    Un fichier exemple Excel : Pièce jointe 308529

    Un fichier exemple Word : Pièce jointe 308549
    Dernière modification par Invité ; 02/09/2017 à 13h05.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2017
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    J'avais vu les erreurs et je les avais corrigées.

    Votre script ne fonctionne pas pour le résultat que je veux obtenir. Je vous ai mis une capture d'écran du résultat :
    Nom : 2017-09-02 12_55_30-UserForm6.png
Affichages : 109
Taille : 2,2 Ko

    Le problème est lorsque le programme liste les fichiers présents dans le dossiers, il rencontre dans cet ordre Exo1, Exo10, Exo11, ..., Exo19,Exo2, Exo20, .....
    ( Je m'en suis rendu compte en mettant une MsgBox dans la procédure.)
    Du coup, lorsqu'on ajoute les noms des fichiers dans la listbox, cet ordre est conservé.

    Alors que moi je veux cet ordre : Exo1, Exo2,..., Exo9, Exo10, Exo11, ... .

    En faisant un essai sur un autre répertoire avec des noms de fichiers différents, on peut croire que votre procédure fonctionne mais pas si le répertoire en question contient des fichiers aux noms identiques et numérotés à la fin comme dans mon cas.
    Dans ce cas, il classera d'abord par exemple nom10 avant nom2.
    Nom : 2017-09-02 13_21_41-UserForm6.png
Affichages : 120
Taille : 1,6 Ko

    Ce que je ne veux pas puisque je veux nom2 puis nom10.

    J'ai résolu mon problème ( voir message précédent ).

    Lionel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tri dans listbox
    Par Basicnav dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/11/2009, 15h20
  2. probleme avec fusion de 2 llc trié element par element !
    Par Tshik3StyLe dans le forum Débuter
    Réponses: 1
    Dernier message: 03/05/2009, 04h10
  3. Tri Alphabétique Listbox avec Boutons Radios
    Par ljuboja78 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 01/05/2008, 09h55
  4. couleurs sur des elements ListBox
    Par ophel dans le forum Visual C++
    Réponses: 4
    Dernier message: 26/03/2007, 20h33
  5. [C#] tri de listbox
    Par mod_pello dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/04/2006, 18h50

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