Récupération lignes .txt pour .xls [Résolu]

Signaler
Messages postés
8
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
12 mai 2011
-
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
-
Bonjour,

Je suis en train de réaliser un petit projet et j'ai un problème dans le traitement de la conversion d'un .txt en .xls. En effet j'ai un fichier texte qui se compose comme il suit :
Référence
Libellé
Débit
Crédit
Référence
Libellé
Débit
Crédit
...


Et je souhaiterai le mettre en .xls sous la forme
Référence | Libellé | Débit | Crédit
Référence | Libellé | Débit | Crédit
...


Le problème c'est que je n'arrive pas à obtenir un algorithme pour qu'il passe à la ligne suivante lorsqu'il arrive à une nouvelle référence.

Mon code :
Dim filesys, readfile, contents
        Dim j As Integer
        filesys = CreateObject("Scripting.FileSystemObject")
        readfile = filesys.OpenTextFile(fichiertemp, 1, False)
        Do While readfile.AtEndOfStream = False
            For j 0 To j 3 Step 1
                contents = readfile.ReadLine
                xlsfeuille.Cells(???, j).Value = contents 'le problème se situe ici

            Next j
        Loop
        readfile.close()



En vous remerciant par avance.

8 réponses

Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

Je n'avais pas fait attention, mais tu es en .NET, donc pourquoi utiliser un hideux "Scripting.FileSystemObject" au lieu des fonctions intégrées dans le framework ?

De plus, mets dans les propriétés de ton projet Option Explicit et option Strict à On, tu aura beaucoup d'erreur, mais ça rendra ton code plus clair.

Regardes aussi IO.File.ReadAllLines.

Messages postés
8
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
12 mai 2011

Dim fuu() As String
                    Dim j, i As Integer
                    fuu = System.IO.File.ReadAllLines(fichiertemp)'on fait un array de string de façon à pouvoir traiter chaque ligne facilement
                    i = 1
                    j = 1

                    For Each ligne In fuu 'on traite ligne par ligne dans le array

                        xlBook.ActiveSheet.Cells(i, j).Value = ligne
                        If j = 4 Then 'on arrive au bout de la ligne donc on le reinitialise à 1 et on passe à la ligne suivante
                            j = 1
                            i = i + 1
                        Else
                            j = j + 1
                        End If

                    Next

Voilà finalement comment j'ai traité ce cas, si cela peut aider quelqu'un.
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

Fais un compteur de ligne, et à chaque fois que tu sort de ton "For j", tu l'incrémente.

Messages postés
8
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
12 mai 2011

Dim fichiertexte As String = "C:\..."  'chemin complet non affiché pour cet exemple
        fichiertexte = fichiertexte + DataGridView1.CurrentCell.Value
        fichiertexte = fichiertexte + ".txt"
        Dim fichiertemp As String = "C:\...\fichiertemp.txt" 'chemin complet non affiché pour cet exemple

        Using MyReader As New  _
Microsoft.VisualBasic.FileIO.TextFieldParser(fichiertexte)
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            Dim sw As StreamWriter = System.IO.File.AppendText(fichiertemp)
            MyReader.SetDelimiters("  ")
            Dim currentRow As String()
            While Not MyReader.EndOfData
                currentRow = MyReader.ReadFields()
                Dim currentField As String
                For Each currentField In currentRow
                    If (currentField <> (" ")) Then
                        If (currentField <> ("")) Then
                            sw.WriteLine(currentField)
                            'ecrire directement dans la cellule excel (maintenant possible)
                        End If
                    End If
                Next
            End While
        End Using

        Dim xlApp As New Excel.Application
        Dim xlBook As Workbook
        Dim xlsfeuille As Excel.Worksheet
        Dim Nomxls As String
        xlApp = CreateObject("Excel.Application")
        xlBook = xlApp.Workbooks.Add
        xlsfeuille = xlBook.Worksheets(1)
        Nomxls = "C:\..."  'chemin complet non affiché pour cet exemple
        Nomxls = Nomxls + DataGridView1.CurrentRow.Cells(1).Value.ToString()
        Nomxls = Nomxls + ".xlsx"


Dim filesys, readfile, contents
        Dim j, i As Integer
        filesys = CreateObject("Scripting.FileSystemObject")
        readfile = filesys.OpenTextFile(fichiertemp, 1, False)
        i = 1
        Do While readfile.AtEndOfStream = False
            For j 1 To j 4 Step 1
                contents = readfile.ReadLine
                xlsfeuille.Cells(i, j).Value = contents
            Next j
            i = i + 1
        Loop
        readfile.close()
Messages postés
8
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
12 mai 2011

(Petite erreur de manip, je ne voulais pas poster ça en deux fois)

Voici mon code avec l'incrémentation des lignes, le problème c'est que lorsque je lance cette fonction, le programme se bloque et ne fait plus rien, j'ai pourtant attendu voir si ce n'était pas le traitement qui durait trop longtemps.
Comment trouver se qui bloque ?
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

As-tu essayer de faire du pas à pas ou à mettre des points d'arrêts afin de voir la localisation ?

Car en lisant le code, on ne voit pas tout.

Messages postés
8
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
12 mai 2011

il n'y a que le bout de code qui a été posté en premier qui ne fonctionnait pas, la première partie (même si c'est du bricolage fonctionne).
Messages postés
14770
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
27 février 2021
151
Bonjour,

Si ton problème est résolu, pense à mettre "Réponse acceptée" sur le ou les message(s) qui t'ont aidés.
De plus, ça facilitera les recherches des autres membres.

Bonne journée :)