importer une partie d'un fichier txt

panpan16

XLDnaute Nouveau
Bonjour,

Je suis totalement novice en VBA, cependant, je cherche à importer la fin d'un fichier txt à partir d'une expression spécifique et comme le fichier txt est régulièrement mis à jour, il faudrait que l'importation se mette à jour à chaque clic ou à intervalle régulier.

En pratique, mon fichier txt ressemble à :

"22/02/2011

G1
blabla
blabla
G2
blabla
G3
blabla
blabla




23/02/2011
blabla

G1
blabla
blabla
G2
blabla
G3
blabla
blabla
25/02/2011
blabla
blabla

25/02/2011
blabla
blabla

G1
blabla

G2
blabla
G3
blabla

28/02/2011
blabla
blabla"


Je cherche à importer le texte à partir de la dernière occurrence de G3. Au final, dans ma feuille excel, je cherche à n'importer dans ce cas que le 5 dernières lignes, soit

"G3
blabla

28/02/2011
blabla
blabla"

Si quelqun à la solution, je suis preneur. En attendant, en parcourant le forum et quelques autres sites, j'ai trouvé une solution qui pourrait me convenir consistant à importer les X derniers caractères du fichier txt :

Dim file_name As String
Dim file_length As Long
Dim fnum As Integer
Dim bytes() As Byte
Dim txt As String
Dim i As Integer



file_name = ThisWorkbook.Path & "C:\fichier.txt"
file_length = FileLen(file_name)
f2 = 150 'nb de caractères à lire en fin de fichier
f1 = file_length - f2
fnum = FreeFile
Open file_name For Binary As #fnum
ReDim bytes(1 To f2)
Get #fnum, f1 + 1, bytes
Close fnum
' Transfert dans un tableau
For i = 1 To f2
txt = txt & Chr(Format$(bytes(i)))
Next i
a = Split(txt, Chr(10))
For i = 1 To UBound(a)

MsgBox a(i)

Mais je suis incapable d'adapter cet exemple pour afficher les lignes dans ma feuille excel au lieu de la message box. Je pense que cela ne doit pas être trop compliqué mais pour moi c'est mission impossible

Merci, pour votre aide

-panpan
EXCEL 2002 XP
 

Staple1600

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

Bonjour


Si tu cherches à importer les 5 dernières lignes de ton fichier.
Importes tout le fichier
Comptes le nombre de lignes - > nblignes
Ensuite supprimes nblignes - 5

Un exemple ci-dessous
Code:
Sub test()
Dim nblignes&
nblignes = [A65536].End(3).Row
Rows(1).Resize(nblignes - 5).Delete
End Sub
 

gilbert_RGI

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

Bonjour

remplacer les dernières lignes du code par ceci

Code:
    For i = 1 To UBound(a)
        Cells(i, 1).Value = a(i)
    Next

ce qui donne ceci pour le code complet aidé de celui de staple1600

Code:
Sub test()
    Dim file_name As String
    Dim file_length As Long
    Dim fnum As Integer
    Dim bytes() As Byte
    Dim txt As String
    Dim i As Integer
    Dim nblignes&
 
    file_name = "C:\fichier.txt"
    file_length = FileLen(file_name)
    f2 = 150    'nb de caractères à lire en fin de fichier
    f1 = file_length - f2
    fnum = FreeFile
    Open file_name For Binary As #fnum
    ReDim bytes(1 To f2)
    Get #fnum, f1 + 1, bytes
    Close fnum
    ' Transfert dans un tableau
    For i = 1 To f2
        txt = txt & Chr(Format$(bytes(i)))
    Next i
    a = Split(txt, Chr(10))
    For i = 1 To UBound(a)
        Cells(i, 1).Value = a(i)
    Next
    nblignes = [A65536].End(3).Row
    Rows(1).Resize(nblignes - 5).Delete
End Sub
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

Bonjour le fil :),
Une autre proposition via un tableau qui a l'avantage de prendre le dernier G3 comme base, car notre ami parle de 5 lignes, mais son exemple en comprend 6 :rolleyes:...
Code:
Sub Test()
Dim InputData As String, Tableau(), I As Integer, J As Integer, K As Integer
Open "C:\temp\Test.txt" For Input As #1
Do While Not EOF(1)
    Line Input #1, InputData
    ReDim Preserve Tableau(I)
    Tableau(I) = InputData
    I = I + 1
Loop
Close #1
For J = UBound(Tableau) To LBound(Tableau) Step -1
    If Tableau(J) = "G3" Then Exit For
Next J
If J = -1 Then Exit Sub
For K = J To I - 1
    Cells(K - J + 1, 1) = Tableau(K)
Next K
End Sub
Bon dimanche :cool:
 

panpan16

XLDnaute Nouveau
Re : importer une partie d'un fichier txt

Merci à tous et surtout à JNP, c'est exactement ce dont j'avais besoin.
J'espère pouvoir un jour fournir aux nouveaux membres des réponses aussi rapides et utiles que celles que vous m'avez apportées.

-panpan16
 

panpan16

XLDnaute Nouveau
Re : importer une partie d'un fichier txt

Après quelques essais, je suis face à un nouveau pb
SI lors du premier clic s'affiche dans ma colonne A:

G3
blabla

28/02/2011
blabla
blabla

mais que lors du second clic, le fichier txt a été mis à jour, je voudrais que s'affiche

G3
blabla

29/02/2011
blabla

En réalité, sera affiché dans excel:
G3
blabla

29/02/2011
blabla
blabla <-- ce dernier "blabla" est issu du premier clic mais n'a pas été supprimé au second clic car il y a une ligne de moins après le dernier G3. Bref, je voudrais qu'à chaque clic la colonne soit "vidée" avant l'import.

J'ai essayé de modifier la proposition de JPN en ajoutant

For K = J To I - 1
Columns("A:A").Delete Shift:=xlToLeft

Cells(K - J + 1, 1) = Tableau(K)

mais cela ne fait qu'empecher l'affichage des nouvelles valeurs, tout en laissant les anciennes si le nouvel import comporte moins de ligne que le premier

je suis un peu perdu

-panpan16
 

gilbert_RGI

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

tester ceci

Code:
Sub Testjnp()
 Dim InputData As String, Tableau(), I As Integer, J As Integer, K As Integer
 Open "C:\fichier.txt" For Input As #1
 Do While Not EOF(1)
     Line Input #1, InputData
     ReDim Preserve Tableau(I)
     Tableau(I) = InputData
     I = I + 1
 Loop
 Close #1
 For J = UBound(Tableau) To LBound(Tableau) Step -1
     If Tableau(J) = "G3" Then Exit For
 Next J
 If J = -1 Then MsgBox "Pas trouvé": Exit Sub
 For K = J To I - 1
    Sheets(2).Cells(K - J + 1, 1) = Tableau(K)
 Next K
     Columns("A:A").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
 End Sub
 

panpan16

XLDnaute Nouveau
Re : importer une partie d'un fichier txt

Tout fonctionne bien grace à vous. En attendant de recevoir VBA pour les nuls, J'ai bien du mal à progresser seul. Dans mon apprentissage, je part toujours de mon exemple. J'ai réussi tout seul comme un grand à afficher le bouton sur une feuille et les résultats sur une autre.

En ce moment je butte sur :

If Tableau(J) = "G3" Then Exit For

En effet, si en cas d'erreur dans le fichier texte est écrit

G3blabla

au lieu de

G3
blabla

alors rien ne va plus, j'ai essayé au petit bonheur la chance en écrivant If Tableau(J) <> "G3" Then Exit For ou "*G3*" mais je n'arrive toujours à traduire If Tableau(J) = "G3" Then Exit For en si contient G3 au lieu de si égal G3
 

panpan16

XLDnaute Nouveau
Re : importer une partie d'un fichier txt

Re bonjour,

Pour automatiser mon projet, je souhaitai remplacer

Open "C:\groupes\fichier.txt" For Input As #1

par une formule qui importe directement le fichier le plus récent du dossier groupes.

N'ayant trouvé solution directe, j'ai cherché une autre méthode. J'ai réussi à importer la liste des fichiers du dossier dans une feuille avec l'adresse complete du fichier le plus récent en A1.
Mais maintenant, je n'arrive pas à utiliser le contenu de la cellule A1 en tant qu'adresse du fichier malgré de vaines tentatives comme par exemple

Open " .Range("A1")" For Input As #1

J'espère que quelqu'un saura corriger mes erreurs et éventuellement me proposer une solution plus directe (mais assez simple pour le débutant que je suis)

merci

-panpan
 

JNP

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

Re :),
Ce serait
Code:
Open Range("A1").value For Input As #1
Maintenant, ton fichier a-t-il la date dans son libellé ?
Si oui, on peux faire une boucle en partant d'aujourd'hui à l'envers jusqu'à ce qu'il trouve le fichier :).
Si non, il est possible en passant par la méthode Application.FileDialog(msoFileDialogFilePicker) d'ouvrir une boite de dialogue pour sélectionner le fichier à la main :rolleyes:.
Enfin, il est possible avec CreateObject("Scripting.FileSystemObject") d'aller chercher un dossier avec .GetFolder("Chemin") pour consulter la propriété .DateCreated ou .DateLastModified des fichiers à l'intérieur (sous réserve qu'il n'y ait que des fichiers qui correspondent à ton besoin dans le dossier ou qu'il y ait une partie du nom constante pour les différencier) :p...
Choisi ton camp, camarade ;) !
Bon courage :cool:
 

panpan16

XLDnaute Nouveau
Re : importer une partie d'un fichier txt

Re

la date est dans le nom du fichier sous la forme 20110509 mais parfois il y a plusieur fichiers le même jour, donc finalement ma solution du fichier le plus récent est la plus adaptée à mes besoin.

Open Range("A1").value For Input As #1 ne donne pas grand chose. Peut être est-ce parce que ma liste de fichier est en feuille 2 et mon bouton en feuille 3.

J'ai donc essayé :

Open Worksheets("Feuil2").Range("A1").Value For Input As #1

ça ne fonctionne pas mais cela doit être une erreur de débutant

Bonne soirée
 

JNP

XLDnaute Barbatruc
Re : importer une partie d'un fichier txt

Re :),
la date est dans le nom du fichier sous la forme 20110509 mais parfois il y a plusieur fichiers le même jour, donc finalement ma solution du fichier le plus récent est la plus adaptée à mes besoin.
Soit le fichier à le même nom et il s'écrase, soit il porte un N° de version que l'on devrait pouvoir utiliser :p...
Essaie plutôt de donner les noms complets des fichiers créés sur plusieurs jour pour pouvoir en faire l'analyse ;).
Ce n'est pas que je ne veuille pas développer sur CreateObject, mais j'ai peur que ça ne devienne du chinois que tu utiliseras sans comprendre :rolleyes:...

Open Worksheets("Feuil2").Range("A1").Value For Input As #1
La syntaxe est bonne, maintenant as-tu bien mis le chemin complet du fichier dans la cellule :rolleyes:...
Code:
C:\fichier.txt
sans les doubles cotes :p...
Bonne soirée :cool:
 

Discussions similaires

Réponses
2
Affichages
240

Statistiques des forums

Discussions
312 215
Messages
2 086 330
Membres
103 187
dernier inscrit
ebenhamel