bonjour
j'utilise un fichier texte comme source de données pour fusinner un document Word
le fichier texte à un enregistrement d'entête et des lignes de données comme suit :
Nom Prenom Date naissance N° facture Montant_en_chiffre Montant_en_lettre
Toto Rémi 12/04/1985 12345 200 ???
Zoro Martin 04/02/1975 65831 300 ???
--- --- ---- --- --- ???
je voudrais faire une lecture séquensiel,
récupérer la position du Montant_en_Chiffre ici colonne 5, données 200 et mettre à jour Montant_en _lettre ici colonne 6, données = deux cent
et ainsi de suite
A noter que les deux colonnes concernées sont dans le cas réél en colonne 60 et 80 à partir le la colonne 1 (Nom)
merci bcp le problème est régle, t'es un crack
finalement je lis le fichier Montant.txt et j'écris dans un autre fichier Montant1.txt
dans montant.txt j'avais
VS01 VS02 VS03
4 E 1235,12
15 D 2580,56
je retrouve dans montant1.txt
VS01 VS02 VS03
4 E mille deux cents trente cinq Euros et douze Centimes
15 D deux mille cinq cents quatre-vingt Euros et cinquante six Centimes
comme suit :
Sub Conversion()
Dim textline
Dim Zone As String
Dim sValueLettre As String
Salut
On suppose que chaque donnée est séparée par des tabulations (ou largeur des données fixe) ?
De toute façon, c'est la même technique que pour lire des fichiers CSV.
Cherche donc CSV parmi les codes du site.
Si les largeurs des données sont fixes, tu peux lire et écrire en mode sequentiel :
- Crée un type propre à la structure de ta ligne :
Private Type monTypeDeLigne
Dim Nom As String * 10
Dim Prénom As String * 10
...
Dim Montant_en_chiffre As String * 10
...
Dim CaractèreDeFinDeLigne As String * 2 ' = le vbCrLf à la fin de la ligne
End Type
Dim maLigne As monTypeDeLigne
- Ensuite, regarde du côté de l'instruction Open en mode d'accès séquentiel :
ff = FreeFile
Open "monFichier.txt" For Random Access Read Write As #ff Len = Len(maLigne)
Do While Not EOF(ff)
Get #ff, NoLigne, maLigne
' ton traitement ici pour modifier maLigne.Montant_en_chiffre
Put #ff, NoLigne, maLigne
Loop
Close #ff
L'avantage des fichiers séquentiels, c'est que tu peux demander à lire ou écrire des 'fiches' dans n'importe quel ordre.
Si tes données ne sont pas structurées, tu ne pourras pas écrire par dessus la donnée.
Il va te falloir lire une ligne du fichier, la traiter (ou pas), puis l'écrire dans un autre fichier.
Après traitement, tu peux supprimer l'original et renommer le nouveau fichier comme l'ancien.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
bonjour
je te remercie tout d'abord pour ta reponse qui est certainement bonne sauf que j'ai un problème par rapport à mon fichier Montant.txt
lorsque le programme exécute la ligne
Get #ff, NoLigne, MyRecord
le NoLigne est vide d'ou plantae erreur 63
A noter que pour ce test j'ai crée manuellement un fichier .xls avec trois zones
VS01, VS02 VS03 ensuite j'ai enregistré ce fichier sous .txt
4 D 200
le séparateur des zones étant la tabulation et pour les enregitrements entrée
Voici mon source
Private Type Record
VS01 As String * 10
VS02 As String * 10
VS03 As String * 10
End Type
Sub Conversion()
Dim MyRecord As Record, NoLigne
Dim sValueLettres As String
Dim CaractèreDeFinDeLigne As String * 2
ff = FreeFile
Open "C:\temp\Montant.txt" For Random Access Read Write As #ff Len = Len(MyRecord)
Do While Not EOF(ff)
Get #ff, NoLigne, MyRecord
' traitement
If VS03 <> "" Then
txt_Nb_Text = VS03
Call ChiffresLettres_F((CDbl(txt_Nb_Text)), sValueLettres)
Merci Bcp pour ton aide, ça avance bien mais désolé de t'ennuyer un peu plus car je récupére bien des données mais elle sont décalées ainsi
mon fichier et comme suit ( séparateur tabulation pour les zones et entrée pour les enregistrements)
VS01 VS02 VS03
4 E 1235,12
15 D 2580,56
lorque j'exécute le source je récupère dans
MyRecord.VS01="VS01VS02"
MyRecord.VS02="VS03 4E"
MyRecord.VS03="1235,12 1"
Alors que je veux récupérer
Enregistrement 1
MyRecord.VS01="VS01"
MyRecord.VS02="VS02"
MyRecord.VS03="VS03"
Enregistrement 2
MyRecord.VS01="4"
MyRecord.VS02="E"
MyRecord.VS03="1235,12"
Enregistrement 3
MyRecord.VS01="15"
MyRecord.VS02="D"
MyRecord.VS03="2580,56"
La méthode Random pour la lecture de fichier est intéressante lorsqu'on a des données ayant des espacements fixes. C'est à ça que sert le Type. Dans ton cas, le Type était de 3 données de 10 caractères de long.
Par contre, le fichier que tu essaies de lire ne doit pas avoir 3 données de 10 caractères. Ce sont simplement 3 variables de longueur non définie. Il serait préférable d'utiliser alors
Open "MonFichier" For Input as #ff
Ensuite utiliser Line Input pour lire une ligne
Puis utiliser Split sur cette ligne avec vbTab comme délimiteur
Le tableau généré par Split contiendra alors les 3 (ou plus) valeurs de chaque ligne
Bonjour
Pour ton information c'est plutôt moi qui suit Charabia et grace à tes informations j'ai pu en tout cas avancer dans la compréhension du traitement de fichier texte et je t'en remercie bcp.
voici ce que j'ai écrit mais je ne sais pas aller plus loin
FF = FreeFile
Open "C:\temp\Montant.txt" For Input As #FF
Do While Not EOF(FF)
Line Input #FF, textline
tabul = Split(textline, vbTab)
quand j'exécute ce source j'ai dans texteline ce qui suit
"VS01*VS02*vs03*VS04" *=correspond ici à la tabulation
"4*E*1235,12*Durand"
"15*D*2580,56*Dupont"
l'idéee est de savoir comment récupérer la position de VS03 entre deux tabulations afin de la traiter.
ce que je sais dire mais pas écrire en VB
J'ai volontairement ajouter une zone dans mon fichier VS04 pour pouvoir avoir VS03entre deux tabulations
L'ajout de VS04 n'est pas nécessaire.
Lorsque tu écris
tabul = Split(textline, vbTab) ' en espérant que tabul est un tableau ... tabul()
celui-ci contiendra
tabul(0) => VS01
tabul(1) => VS02
tabul(2) => VS03
............... tant qu'il y aura des tabulations sur cette ligne
Tu peux donc mettre une condition sur tabul(2)
If CDbl(tabul(2)) > 1500 then ....
ou
If tabul(2) <> "" then