Import fichier par méthode EOF(1)

Bonsoir.

Je viens aujourd'hui vers vous car je ne m'en sors pas sur une fonction d'import d'EXCEL EOF(1).

Voici brièvement le contexte :

Je possède un document texte contenant plus de 700.000 lignes.

Dans celui-ci, sur chaque ligne des valeur séparées par des TAB. Dans ces lignes, colone G, j'ai la Vitesse. Elle est de temps en temps égale a zero. J'ai aussi des valeurs NaN.

Mon but est donc d'importer chaque ligne ou la vitesse n'est pas nule et ou aucune donnée n'est egale a NaN.

Voici le code qu'on m'a proposé :

Sub Trial_import()
    Dim i As Long
    Dim PasEnregistrement As Boolean

    Open "C:\Users\Fabdu57100\Desktop\File\L3\1.txt" For Input As #1

    Do While Not EOF(1)
        Input #1, Ligne

        PasEnregistrement = False
        tableau = Split(Ligne, vbTab)
        If LBound(tableau) <> UBound(tableau) Then
            For i = LBound(tableau) To UBound(tableau)
                If tableau(i) = "NaN (Niet-een-getal)" Then
                    PasEnregistrement = True
                    Exit For
                End If
            Next i

            If PasEnregistrement = False And tableau(8) <> 0 Then
                NBLigne = NBLigne + 1
                For i = LBound(tableau) To UBound(tableau)
                    Sheets("WORKSHEET").Cells(NBLigne, i + 1) = tableau(i)
                Next i
            End If
        End If
    Loop

    Close #1
End Sub

Au lancement, il affiche l'erreur suivante:

Erreur d'execution '9': L'indice n'appartien pas a la sélection.

Si je clique sur DEBOGAGE, il surligne en jaune ceci: If PasEnregistrement = False And tableau(8) <> 0 Then

Les valeurs de certaines variables:

LBound(tableau) = 0

UBound(tableau) = 1

tableau(8) = <L'indice n'appartien pas a la sélection>

Quelqu'un pourrait-il me donner de l'aide?

Merci d'avance,

Fabrice.

PS: Ci-joint un fichier que j'ai rédui a 100 lignes qui peut servir d'essai de votre cotés.

28sample.zip (6.82 Ko)

Bonsoir

Montyfabr a écrit :

PS: Ci-joint un fichier que j'ai rédui a 100 lignes qui peut servir d'essai de votre cotés.

D'accord mais dans aucun cas il n'y a NaN dans le fichier et la valeur 0 en colonne G ?????????

Ce que j'ai pu en voir

Chaque ligne (en dehors des 2 1ères) est constituée de 21 paquets de 3 données

Fournis un fichier ou on trouve ces conditions, comment peut-on tester sinon ?

A suivre

Bonjour.

Veuillez trouver ci-joint le fichier modifié. j'ai ajouté des 0 dans les vitesses, et des NaN dans quelques colones.

A noter : Pas tous les fichiers contiennent des 0 ou des NaN. Donc si lors de l'import la ligne n'en contiens pas, alors on importe al ligne et ainsi de suite. Le but est pas d'en trouver, mais de suprimmer les lignes les contenant, si il y a.

Bonne journée,

Fab.

28sample.zip (7.22 Ko)

Bonjour

Pour les NaN ok

Pour l'histoire des 0 ce n'est pas gagné

Voilà le fichier que j'obtiens

A toi de dire (surlignes les lignes à supprimer)

La macro est faite pour qu'elle aille chercher le fichier dans le même répertoire que le fichier de récupération

Alors avant de lancer la macro, sauvegardes ce fichier dans le même répertoire que le fichier Sample.txt ou alors changes le chemin dans la macro

A suivre

Bonsoir.

Désolé de ne répondre que maintenant, cependant j'étais assez chargé ces derniers temps.. Malheureusement, le code EOF ne permettait pas comme l'import de ma ligne entière: Il prennait comme séparateur principal la virgule, puis ensuite la tabulation. En regardant l'aide, il est inscrit que c'est normal et non paramétrable.

Voici quelque chose qui fonctionne :

Sub essai_2()
    Const ForReading = 1, ForWriting = 2, ForAppending = 3
    Dim fs, f, tableau, i, j, k
    Dim Ligne As Double
    Dim PasEnregistrement As Boolean

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("C:\Users\Fabdu57100\Desktop\L3\test.txt", ForReading, TristateFalse)
    Application.ScreenUpdating = False

''''''''''''''''''''''''''''''''''''''''''''''
''' DEBUT DE LA BOUCLE D'IMPORT DU FICHIER '''
''''''''''''''''''''''''''''''''''''''''''''''

    Do While f.AtEndOfLine <> True 'Boucle tant que l'on atteint pas la fin du fichier
        PasEnregistrement = False
        tableau = Split(f.Readline, vbTab)
        For i = 0 To UBound(tableau)
            If i = 8 Then
                If tableau(8) = 0 Then
                    PasEnregistrement = True
                    Exit For
                Else:
                End If
            Else:
                If tableau(i) = "NaN (Niet-een-getal)" Or tableau(i) = "QueryInfo" Then
                    PasEnregistrement = True
                    Exit For
                End If
            End If
        Next i

        If PasEnregistrement = False Then
            Ligne = Ligne + 1

                For j = 0 To UBound(tableau)
                    Sheets("WORKSHEET").Cells(Ligne, j + 1) = tableau(j)
                Next j
        Else:
        End If
    Loop

    f.Close 'Fermeture du fichier

''''''''''''''''''''''''''''''''''''''''''''''
'''  FIN DE LA BOUCLE D'IMPORT DU FICHIER  '''
''''''''''''''''''''''''''''''''''''''''''''''
End Sub

Cependant, le temps de chargement est... TRES TRES TRES lent... Une idée du problème? N'irais-je pas plus vite si au lieu d'importer directement sous EXCEL j'écris mes lignes dans un fichier texte que j'importerai en phase finale?

Merci d'avance,

Fabrice.

PS: Ci-joint mon fichier "test" permettant d'essayer. A noter que j'ai suprimmer beaucoup de lignes: Au final 13 lignes restantes sur les 700.000 initiales...

20test.txt (13.64 Ko)

Bonsoir

Je ne suis pas d'accord avec toi

Montyfabr a écrit :

Malheureusement, le code EOF ne permettait pas comme l'import de ma ligne entière: Il prennait comme séparateur principal la virgule, puis ensuite la tabulation. En regardant l'aide, il est inscrit que c'est normal et non paramétrable.

Je ne sais pas où tu as trouver cette définition

Voici un extrait de l'aide

EOF, fonction

Renvoie une valeur de type Integer contenant la valeur Boolean True lorsque la fin d'un fichier ouvert en mode Random ou Input séquentiel est atteinte.

Juste une petite remarque:

Do While f.AtEndOfLine <> True

même chose que

Do While Not EOF(1)

Je ne vois pas ce que tu reproches à la macro

Toujours pas de réponse

Banzai64 a écrit :

Pour les NaN ok

Pour l'histoire des 0 ce n'est pas gagné

Voilà le fichier que j'obtiens

A toi de dire (surlignes les lignes à supprimer)

Montyfabr a écrit :

Cependant, le temps de chargement est... TRES TRES TRES lent... Une idée du problème?

Oui le fait de lire donnée par donnée, contrairement à l'autre macro qui lit ligne par ligne

Tu fais comme tu veux

Bonsoir,

Je dirais que le code importe ou non en ligne celà m'importe peu. Tout ce qu'il faut c'est:

Si la ligne contiens un "NaN..." ou VITESSE (colone 8) = 0 je ne l'importe pas

Attention ! Il faut absolument que l'import mette une valeur par case, et non toute les valeurs sur la même. Si j'ai "130 TAB 140 TAB150", il faut alors que dans A1 j'ai la valeur 130, A2 la valeur 140, A3 la valeur 150.

Je souhaite que l'import soit le plus rapide possible.

Quelle solution me conseilleriez-vous dans ce cas?

Bonsoir,

Malheureusement la méthode ci-joint est risquée: Si demain j'ai des paramètres en plus qui s'ajoutent (des colones), je ne les importerai pas sans modifier. La méthode proposée n'est donc pas possible.

Rechercher des sujets similaires à "import fichier methode eof"