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 SubAu 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.
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.
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 SubCependant, 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...
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 <> Truemê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.