Open Binary, caractères superflus

Résolu
Signaler
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011
-
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011
-
Bonjours ami(e)s programmeurs et programmeuzes,

J'utilise le code suivant pour entrer des lignes de texte dans un fichier "journal.txt" :
Sub AjoutJournal()

' Ajoute la date et l'heure ainsi que l'action effectuer dans le journal

Dim Contenu As String
Dim NumFile As Integer
NumFile = FreeFile

' Prend date et heure système
newYear = Year(Now())
newMonth = Month(Now())
newDay = Day(Now())
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now())

' Rajoute un 0 lorsqu'il n'y a qu'un seul chiffre
If (Len(newMonth) 1) Then newMonth "0" & newMonth
If (Len(newDay) 1) Then newDay "0" & newDay
If (Len(newHour) 1) Then newHour "0" & newHour
If (Len(newMinute) 1) Then newMinute "0" & newMinute
If (Len(newSecond) 1) Then newSecond "0" & newSecond

Record = newYear & "/" & newMonth & "/" & newDay & " " & newHour & ":" & newMinute & ":" & newSecond

' Insere une ligne dans un fichier
Open "C:\journal.txt" For Binary As NumFile
Contenu = String(LOF(NumFile), 0)
Get #NumFile, , Contenu
Put #NumFile, 1, Record & " Lecture des données" & vbCrLf & Contenu
Close #NumFile

End Sub

Avec une autre macro je récupère le journal et l'affiche (je vous met le code qui l'affiche) :
Open "C:\journal.txt" For Input As 1
Do While Not EOF(1)
Input #1, textline
Range("G" & temoin).Value = textline
temoin = temoin + 1
Loop
Close #1

Le problème c'est que (probablement à cause de l'ouverture en Binary) j'ai plusieurs caractères qui ne servent pas.
Par exemple si l'information que je veux lire est : 2008/04/16
j'ai : $d2008/04/16

Pour supprimer ces caractères(vu que leur nombre semble rester fixe) j'utilise la fonction mid comme suit :

Do While temoin1 < temoin
a = Range("G" & temoin1).Value
Mid(a, 1, 4) = " "
Range("G" & temoin1).Value = a
temoin1 = temoin1 + 1
Loop

Comme vous pouvez le voir j'utilise 4 espaces.
Premierement ca n'est pas pratique (est ce que j'utilise mal la fonction mid?)
Et deuxiemement si le nombre de caractères n'est pas fixe les 4 espaces ne serviront plus.

Ya t'il une solution plus efficace que la fonction mid?

Merci d'avance

21 réponses

Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
OK, j'avais pas vu que tu écrivais en sens inverse.
Tu peux qd même le faire en ouvrant en mode texte, mais cela risque d'être un peu plus long si le fichier devient très très gros :

Sub AjoutJournal()
Dim Buffer As string

.... 'Tout ton barratin pour préparer la variable Record va içi ...

Open "..." For Input As NumFile
Buffer = Input(NumFile, Lof(NumFile)
Close #Numfile
Buffer = Record & " Lecture des données" & vbCrLf & Buffer
Open "..." For Output As NumFile
Print #NumFile, Buffer
Close #Numfile
End Sub

A tester ... J'ai pas accès à VBA pour vérifier, mais ca doit ête OK comme ça ?
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Petite correction pour la lecture des données. Ce era plutôt ceci :
Buffer = Input(LOF(NumFile), #Numfile)

Ca marchera mieux comme ça ...
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Sub AjoutJournal()

' Ajoute la date et l'heure ainsi que l'action effectuer dans le journal

Dim Contenu As String
Dim NumFile As Integer
NumFile = FreeFile
buffer1 = ""

' Prend date et heure système
newYear = Year(Now())
newMonth = Month(Now())
newDay = Day(Now())
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now())

' Rajoute un 0 lorsqu'il n'y a qu'un seul chiffre
If (Len(newMonth) 1) Then newMonth "0" & newMonth
If (Len(newDay) 1) Then newDay "0" & newDay
If (Len(newHour) 1) Then newHour "0" & newHour
If (Len(newMinute) 1) Then newMinute "0" & newMinute
If (Len(newSecond) 1) Then newSecond "0" & newSecond

Record = newYear & "/" & newMonth & "/" & newDay & " " & newHour & ":" & newMinute & ":" & newSecond

Open "C:\journal.txt" For Input As NumFile
Do While Not EOF(NumFile)
Line Input #NumFile, buffer
buffer1 = buffer1 & vbCrLf & buffer
Loop
Close #NumFile

buffer1 = Record & " Lecture des données" & buffer1

Open "C:\journal.txt" For Output As NumFile
Print #NumFile, buffer1
Close #NumFile

End Sub
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Input(LOF(NumFile), NumFile) doit fonctionner sans aucune erreur, pour peu que ton fichier soit bien un fichier texte ! Si tu travailles avec un fichier créer par tes précédent essai (ouvert en binary), ca va effectivement planter.
a noter que la méthode de lecture ligne par ligne est plus lente et moins judicieuxe dans ton cas !
Ressaye Input(LOF(NumFile), NumFile) avec unfichier texte bien propre. Ca devrait le faire ensuite.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
tu as un $d en trop car tu a écris une donnée de type Date, et, le Put, en plus de mettre les données ds le fichier, il colle aussi ce qui va bien pour retrouver le type des données qui suivent ...
Comme tu relis ton fichier caractère par caractère, tu chopes ces caractères 'de controle' !
Ne pourrais tu pas tout simplement écrire dans ton fichier en mode texte ? Ce serait tout de même bcp plus simple, non ?
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Non c'est ce que je faisais avant, le probleme de cette méthode c'est que les ligne s'ecrive en sens inverse, il me faut les dates les plus récentes en haut, ce qui n'est possible apperement que en mode Binary.
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Sans parler de ton problème, vite fait en passant,

il me semble que ceci record = Format(Now, "yyyy/mm/dd HH:NN:SS" ) equivaut à TOUT CE QUI SUIT

' Ajoute la date et l'heure ainsi que l'action effectuer dans le journal

  Dim Contenu As String
  Dim NumFile As Integer
  NumFile = FreeFile
 
  ' Prend date et heure système
  newYear = Year(Now())
  newMonth = Month(Now())
  newDay = Day(Now())
  newHour = Hour(Now())
  newMinute = Minute(Now())
  newSecond = Second(Now())
 
  ' Rajoute un 0 lorsqu'il n'y a qu'un seul chiffre  If (Len(newMonth) 1) Then newMonth "0" & newMonth  If (Len(newDay) 1) Then newDay "0" & newDay  If (Len(newHour) 1) Then newHour "0" & newHour  If (Len(newMinute) 1) Then newMinute "0" & newMinute  If (Len(newSecond) 1) Then newSecond "0" & newSecond
 
     record = newYear & "/" & newMonth & "/" & newDay & " " & newHour & ":" & newMinute & ":" & newSecond

, ----
[code.aspx?ID=41455 By Renfield]

<hr size ="2" width="100%" />@+: Ju£i?n
Pensez: Réponse
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Bien joué jrivet !!! J'étais tellement focalisé sur le pb de lecture de fichier que j'ai pas regardé tout ça !!
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Mon fichier se limite à 50 lignes, merci a vous je vais étudier ca.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Alors cela devrait rouler nickel !
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Pour l'heure et date, j'ai une erreur, : le compilateur surligne format et me dit : nombres d'arguments incorrect ou affectation de propriété incorrecte
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
La proposition de jrivet semble pourtant convenir très bien ?!
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Et pour cette ligne :
Buffer = Input(LOF(NumFile), #NumFile)

il me dit : "l'entrée depasse la fin du fichier"(pourtant ya pas plus de 50 ligne j'ai vérifier)
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

d'apres ce que je viens de trouver sur google en tapant l'erreur que j'ai trouvé ca :
il faut mettre :
Do While Not EOF(NumFile) ' Check for end of file.
Line Input #NumFile, Temp ' Read line of data.
loop

a la place de :
txtFichier.Text = Input(LOF(NumFile), NumFile)
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Euh desolé, suis crevé j'ai pas fait attention que j'avais pas copier ce qu'il fallait.
Bref de toute facon on voit le code qui nous interesse, avec votre aide, celle que j'ai trouvée sur internet (citée plus haut) et mes rectifs j'en suis arrivé à ce code qui fonctionne tres bien.

Par contre je ne comprend toujours pas pourquoi le code de jrivet ne fonctionne pas.
Mais bon ya pu de caractères Zarbis^^.

Merci a vous.
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

YATTA!!! en effet ca fonctionne.

Encore merci
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Et mon format ilmarche pas??? testé chez moi

<hr size="2" width="100%" />@+: Ju£i?n
Pensez: Réponse
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

Nan ca fonctionne pas :
le compilateur surligne format et me dit : nombres d'arguments incorrect ou affectation de propriété incorrecte
Messages postés
308
Date d'inscription
jeudi 10 janvier 2008
Statut
Membre
Dernière intervention
27 octobre 2011

J'ai trouvé quelque chose qui fonctionne pour la date et heure :

Record = Now
XD
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,
Bah oui d'accord mais cela de formate pas ton REcord comme tu le faisais avant

<hr size="2" width="100%" />@+: Ju£i?n
Pensez: Réponse