Initialisation d'une listbox à partir d'un fichier

Bonjour à tous,

j'ai un petit problème pour initialiser une listbox dans une UserForm en vba, le code :

Private Sub UserForm_Initialize()
    Dim tableau() As String
    Dim iFic As Integer
    iFic = FreeFile()
    Dim fic As String
    fic = "M:\ComptaRenee\SoldesBancaires.txt"
    Open fic For Input As iFic
    i = 0
    While Not EOF(iFic)
        Line Input #iFic, don
        If i > 0 Then
            listEcriture.AddItem
        End If
        tableau = Split(don, ";")
        j = 0
        For Each Z In tableau
            If i = 0 Then
            Else
                listEcriture.List(i - 1, j) = Z
            End If
            j = j + 1
            If j > 9 Then
                GoTo suite
            End If
        Next Z
suite:
        If i = 0 Then
            listEcriture.ColumnCount = j
        End If
        i = i + 1
    Wend
fin:
    Close iFic
End Sub

l'enregistrement 1 du fichier contient le nom des colonnes ce qui me permet de connaitre le nombre de colonnes que contiendra ma listbox puis avec les enregistrements suivants je vais renseigner ma listbox.

Après avoir fait mon append pour créer un ligne, je vais donc essayer de compléter cette ligne. Dès le second split pour découper mon enregistrement, je pars en erreur voir image jointe et là, je ne comprends pas pourquoi.

Merci pour votre aide

message

Bonsoir Jouffray,

J'ai eu du mal à trouver, pourtant j'ai l'habitude de ce genre de code et sans fichier ce n'est pas évident. J'ai donc exécuter ton code sur un autre fichier texte et j'ai eu le même résultat que toi, avec l'affichage du code erreur 10, Ce tableau est fixe et temporairement verrouillé.

J'ai réussi à identifier la cause de l'erreur qui me parait "maintenant" évidente :

            j = 0
            For Each z In tableau
                If i = 0 Then
                Else
'                    listEcriture.List(i - 1, j) = z
                End If
                j = j + 1
                If j > 9 Then
                    GoTo suite
                End If
            Next z
suite:

Quand on est dans une boucle, il est de coutume d'utiliser l'instruction Exit For qui est spécialement faite pour sortir "proprement" de la boucle. En soit, le fait de sortir de la boucle par GoTo Suite, n'est pas forcément problématique, par contre quand on utilise une boucle "For Each", le tableau se verrouille jusqu'à ce que la boucle soit terminée ou qu'on en soit sorti avec Exit For. Donc, dans ce cas là, Goto Fin ne permet pas de déverrouiller le tableau !

Si maintenant on change de boucle en utilisant For j = 0 To UBound(tableau)

            For j = 0 To UBound(tableau)
                If i = 0 Then
                Else
'                    listEcriture.List(i - 1, j) = z
                End If
                If j > 9 Then
                  GoTo suite
                End If
            Next j
suite:

le tableau n'est pas verrouillé parce qu'on lit simplement les items du tableau.

Donc dans le premier cas, Z est une variable de type Variant/String et dans le second cas Tableau(z) est un type de variable String, cela veut bien dire que les deux boucles sont, sans en avoir l'air, bien différentes.

Conclusion : banir dans la mesure du possible les GoTo des boucles en les remplaçant systématiquement par l'instruction Exit For qui est spécialement faite pour cela.

Bonjour,

j'ai bien modifié comme indiqué, voici le nouveau code

Private Sub UserForm_Initialize()
    Dim tableau() As String
    Dim iFic As Integer
    iFic = FreeFile()
    Dim fic As String
    fic = "M:\ComptaRenee\SoldesBancaires.txt"
    Open fic For Input As iFic
    i = 0
    While Not EOF(iFic)
        Line Input #iFic, don
        If i > 0 Then
            listEcriture.AddItem
        End If
        tableau() = Split(don, ";")
        j = 0
        For j = 0 To UBound(tableau)
            Z = tableau(j)
            If i = 0 Then
            Else
                listEcriture.List(i - 1, j) = Z
           End If
        Next j
        If i = 0 Then
            listEcriture.ColumnCount = j
        End If
        i = i + 1
    Wend
fin:
    Close iFic
End Sub

Je pensais bien avoir commis une erreur, mais voilà que maintenant lorsque mes enregistrements possèdent plus de 9 champs, lors de l'initialisation, une anomalie se produit voir fichier joint. Je joins également un modèle du fichier.

Merci pour votre aide.

Cordialement.

message 002
24soldesbancaires.txt (620.00 Octets)

Bonsoir,

C'est normal, je n'ai pas toutes des données en ma possession, mais je suppose que tu utilises un UserForm avec au moins un ListBox. Pour ton information, un ListBox peut contenir 10 colonnes maximum (de 0 à 9).

Plusieurs solutions sont possibles, mais certaines plus compliquées que d'autres à mettre en place :

1 - Utiliser une feuille Excel

2 - Filtrer les colonnes pour limiter leur nombre à 10.

3 - Passer chaque ligne du fichier texte sur 2 lignes du ListBox.

4 - Utiliser plusieurs ListBox (je ne l'ai jamais fait, mais pourquoi pas !

5 - Concaténer deux colonnes en une, par exemple IDRel et IDCompte (en mettant un point comme séparateur, tu pourras utiliser Split pour retrouver des colonnes si besoin).

6 - Utiliser un ListBox avec une table de données complémentaire, mais non visible sur le formulaire. Et pourquoi pas avec un système de paramétrage (boutons, cases d'options...) permettant de choisir les 10 colonnes à visualiser, mais cela implique le rechargement du ListBox.

7 - Remplacer le contrôle ListBox par un contrôle ListView, cela nécessite l'utilisation d'un ocx complémentaire et incompatible avec certains ordinateurs (comme le mien) en fonction du type de Windows (32 ou 64 bits) mais aussi de la version d'Excel (32 ou 64 bits).

8 - Utilisation d'une feuille Excel couplée avec un ListBox, ensuite modification de la RowSource pour décaler l'affichage d'une ou plusieurs colonnes.

9 - Je pense qu'il y a encore quelques autres solutions...

Pour moi, dans ton cas j'opterais pour le choix 2 ou 4.

Bonjour,

merci pour ta réponse, je pense que je vais limiter ma liste à 10 colonnes et concaténer si besoin certaines de ces colonnes

Cordialement.

Bonsoir,

Oui, c'est certainement ce qu'il y a de plus raisonnable. Si tu as besoin d'aide, n'hésite pas.

Bonjour,

j'aurai effectivement besoin d'aide mais sur un tout autre problème. Cela concerne la liaison entre Excel et une base mySQL (sujet que j'ai déjà ouvert et qui n'a pas obtenu à ce jour de résultat).

Si tu as une idée, je suis preneur.

Remerciements et cordiales salutations.

Rechercher des sujets similaires à "initialisation listbox partir fichier"