Open Binary, caractères superflus

Résolu
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011 - 17 avril 2008 à 09:25
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011 - 17 avril 2008 à 14:54
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

Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 09:56
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 ?
3
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 09:58
Petite correction pour la lecture des données. Ce era plutôt ceci :
Buffer = Input(LOF(NumFile), #Numfile)

Ca marchera mieux comme ça ...
3
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 11:03
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
3
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 11:12
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.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 09:43
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 ?
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 09:47
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.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 avril 2008 à 09: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
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 10:00
Bien joué jrivet !!! J'étais tellement focalisé sur le pb de lecture de fichier que j'ai pas regardé tout ça !!
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 10:10
Mon fichier se limite à 50 lignes, merci a vous je vais étudier ca.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 10:12
Alors cela devrait rouler nickel !
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 10:28
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
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
17 avril 2008 à 10:33
La proposition de jrivet semble pourtant convenir très bien ?!
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 10:44
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)
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 10:46
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)
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 11:07
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.
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 11:19
YATTA!!! en effet ca fonctionne.

Encore merci
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 avril 2008 à 11:20
Salut,
Et mon format ilmarche pas??? testé chez moi

<hr size="2" width="100%" />@+: Ju£i?n
Pensez: Réponse
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 11:29
Nan ca fonctionne pas :
le compilateur surligne format et me dit : nombres d'arguments incorrect ou affectation de propriété incorrecte
0
cs_faucheuse Messages postés 308 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 27 octobre 2011
17 avril 2008 à 14:31
J'ai trouvé quelque chose qui fonctionne pour la date et heure :

Record = Now
XD
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
17 avril 2008 à 14:42
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
0
Rejoignez-nous