Lecture d'un fichier à accès random

Résolu
dadex85 - 5 déc. 2012 à 12:25
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 11 déc. 2012 à 14:50
Bonjour à tous j'ai besoin de votre aide,
Je veux faire une lecture de fichier en vba d'un fichier TrameRx_IP.DAT. C'est un fichier à accès random et il contient 500 messages. Après 500 messages il supprime les messages précédents et faire une nouvelle sauvegarde . Moi je veux lire et faire une sauvegarde de tous les messages.
j'ai essayé avec ce code mais ça ne marche pas quelqu'un pourrait t-il m'aider.

Function FileTrameInput(mode As Integer, Trame As String) As String

 

Const NbMesRx = 500

 

Dim FileNumber As Integer

Dim BufFile As String * 800

    

    FileNumber = FreeFile

    Open App.Path & "\TrameRx_IP.DAT" For Random As FileNumber Len = Len(BufFile)

    

    ' Lecture des pointeurs

    Get #FileNumber, 1, BufFile

    gintPtReTi = Val(Mid(BufFile, 1, 5))

    gintPtWrTi = Val(Mid(BufFile, 6, 10))

 

 

        ' Lecture trame

        

            ' Test des limites pointeur lecture

            If gintPtReTi > NbMesRx Or gintPtReTi < 2 Then

                gintPtReTi = 2

            Else

                gintPtReTi = gintPtReTi + 1

            End If

            BufFile = Format(gintPtReTi, "00000") _

                           & Format(gintPtWrTi, "00000")

            

            ' Mise à jour Pointeurs

            Put #FileNumber, 1, BufFile

        

            ' Lecture de la trame

            Get #FileNumber, gintPtReTi, BufFile

            FileTrameInput = Trim(BufFile)

            

            ' Effacement de la trame

            BufFile = ""

            Put #FileNumber, gintPtReTi, BufFile

       

    Close #FileNumber

 

End Function

 

 



32 réponses

Bonjour a tous
J'ai pu trouver une solution à mon problème:
je mets le code au cas où ça interresserait quelqu'un

Option Explicit

Dim Arret As Boolean

Sub Depart()
  Application.OnTime Now + TimeValue("00:16:39"), "LectureFichier"
End Sub

Sub ArretLecture()
  Arret = True
End Sub

Sub LectureFichier()
Dim Nom As String
Dim Canal As Integer
Dim InputData As String
Dim Ligne As Long
Dim J As Long
Dim Indice As Integer

  If Arret = True Then Exit Sub
  Application.ScreenUpdating = False
  Nom = ThisWorkbook.Path & "\TrameRx_IP.DAT"
  ' Création de la feuille
  'Indice = 1
  On Error Resume Next
  Do
    'Err.Clear
    Indice = Indice + 1
    Sheets("Enreg " & Indice).Visible = True
  Loop Until Err.Number > 0
  On Error GoTo 0
  Sheets.Add after:=Sheets(Sheets.Count)
  ActiveSheet.Name = "Enreg " & Indice
  Range("A1") = Now
  Ligne = 1
  
  ' Récupération du fichier
  Canal = FreeFile()
  Open Nom For Input As #Canal
  Do While Not EOF(Canal)                   ' Vérifie si la fin du fichier est atteinte.
    Line Input #Canal, InputData            ' Lit les lignes de données (normalement 1 ligne)
    For J = 1 To Len(InputData) Step 800
      Ligne = Ligne + 1
      Range("A" & Ligne) = Trim(Mid(InputData, J, 800))
    Next J
  Loop
  Close #Canal    ' Ferme le fichier.
  Columns("A").AutoFit
  ThisWorkbook.Save
  Application.OnTime Now + TimeValue("00:16:39"), "LectureFichier"
End Sub




TimeValue("00:16:39") est le temps que met le transmetteur pour faire un enregistrement de 500 evenements

Amicalement
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 déc. 2012 à 13:03
Bonjour,
Commence s'il te plait par expliquer le sens de ceci :
C'est un fichier à accès random et il contient 500 messages. Après 500 messages il supprime les messages précédents et faire une nouvelle sauvegarde .

Est-ce :
1) ce que tu veux qu'il fasse ?
ou
2) ce qu'il fait ?
Ta question est pour l'instant assez loin d'être à peu près claire
et j'aime encore moins une fonction qui :
Function FileTrameInput(mode As Integer, Trame As String) As String
*
attend donc deux paramètres (mode et Trame)
Mais n'en utilise aucun des deux !!!
Tu as donc "récupéré je ne sais où" un bout de code, sans en comprendre la moindre signification ... et tentes de le "coller" dans ton appli, toujours sans même savoir dans quel but ...
Si je me trompe ===>> Explique donc !!!

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 déc. 2012 à 13:14
Au fait : quelle suite comptes-tu donner à cette discussion :
Tapez le texte de l'url ici.
laissée sans suite à ce jour ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Je veux faire une lecture de fichier en vba d'un fichier TrameRx_IP.DAT, C'est un fichier à accès random. Après un enregistrement de 500 évènements il supprime les évènements et faire un nouvel enregistrement. Moi je veux lire dans le fichier et faire une sauvegarde de tous les évènements .
j'ai essayé avec ce code mais ça ne marche pas quelqu'un pourrait t-il m'aider.
0

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

Posez votre question
Après un enregistrement de 500 évènements dans le fichier Mon transmetteur (Vocalys) supprime les évènements et faire un nouvel enregistrement. Moi je veux lire dans le fichier et faire une sauvegarde de tous les évènements .
je suis un debutant en vba svp aidez moi
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 déc. 2012 à 16:22
Je t'avais pourtant posé une question claire :
Est-ce :
1) ce que tu veux qu'il fasse ?
ou
2) ce qu'il fait ?

Réponds par 1) ou par 2) !
Car l'indicatif ici :
Après un enregistrement de 500 évènements il supprime

laisse penser à la réponse 1) et ni le "je veux" ni le code montré ne laissent penser à la réponse 1), mais à la réponse 2)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonjour à tous
Je vous explique ucfoutu: Le transmetteur Vocalys-ip dès qu'il est connecté au serveur crée un fichier TrameRx-IP.DAT et envoie des évènements dans ce fichier. Mais le hic est qu'il efface le contenu du fichier après 500 évènements. Moi je souhaite faire une lecture de ce fichier 'TrameRx-IP.DAT' et faire une sauvegarde de tous les Evènements dans un autre fichier.

COrdialement
0
ucfoutu, Ce que je veux que ce code fasse est:
Lire dans le fichier TrameRx-IP.DAT récupérer le contenu et le sauvegarder dans un autre fichier.

COrdialement
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 11:05
Je vais faire exprès de répondre rigoureusement (sans aller deviner ce que tu n'exprimes pas) à :
ucfoutu, Ce que je veux que ce code fasse est:
Lire dans le fichier TrameRx-IP.DAT récupérer le contenu et le sauvegarder dans un autre fichier.

utilise alors filecopy (ton aide VBA)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
j'ai vu la fonction 'filecopy' met cette fonction faire une copie du fichier.

je vous explique svp: la taille de mon fichier TrameRx-IP.DAT est définie à 500 messages(avant la rotation du pointeur). je vous explique par un exple
j'ai un fichier qui reçoit:

1MSG
2MSG
..MSG
..MSG
....
500MSG

Après 500MSG le transmetteur supprime le contenu du fichier TrameRx-IP.DAT c'est à dire supprime les 1MSG....500MSG et faire un nouvel enregistrement de MSG dans le fichier TrameRx-IP.DAT .
Moi je souhaite lire dans TrameRx-IP.DAT et sauvegarder dans un autre fichier les 1MSG....500MSG et le nouvel enregistrement avant la suppression par le transmetteur
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 13:04
Je m'y attendais
D'où l'absolue nécessité de ne pas attendre le nième message pour exprimer un besoin.
On va alors attendre que tu saches exprimer ce besoin de manière purement technique. (C'est fort simple à exprimer et j'attends que tu fasses cet effort).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu, a vrai dit je suis un débutant en vb.


tes cool
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 13:46
Bon ...
Je veux bien que tu sois un "débutant" en développement...
Ce que je te demande, toutefois, n'a absolument rien à voir avec des connaissances en développement : t'exprimer de manière concise, précise et technique
Di tu n'y parviens pas en langage naturel, que sera-ce donc en langage informatique ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
-Créer un fichier Backup qui sera relier en permanence au fichier TrameRx_IP.DAT

-Lire le contenu du fichier TrameRx_IP.DAT et le mettre dans notre fichier Backup

- Le fichier Backup doit récupérer tout nouvel enregistrement de message dans TrameRx_IP.DAT de sorte qu'on ne perde pas de données même si le transmetteur efface tous les premiers messages du fichier TrameRx_IP.DAT.

tes cool
0
je viens d'essayer avec ce code après avoir lu quelques cours ça ne marche pas et ma machine se plante
option explicit 

Private Sub lire()

Dim intfic As Integer
Dim strligne As String
intfic = FreeFile
Const NbMesrx = 500
Dim gintPtReti As integer
Dim gintPtWrti As integer
Dim FileTrameInput  as string
 
Dim bufFile As String * 800

Path = App.path & "\TrameRx_IP.DAT"

Open path For Random As intfic len =len(bufFile)


Do while Not EOF (1) = True

Get #intfic, 1, bufFile

    gintPtReti = Val(Mid(bufFile, 1, 5))

    gintPtWrti = Val(Mid(bufFile, 6, 10))

    ' Lecture trame
    ' Test des limites pointeur lecture

            If gintPtReti > NbMesrx Or gintPtReti < 2 Then

                gintPtReti = 2

            Else

                gintPtReti = gintPtReti + 1

            End If

            bufFile = Format(gintPtReti, "00000") & Format(gintPtWrti, "00000")


            Get #intfic, gintPtReti, bufFile

            FileTrameInput = Trim(bufFile)
           

      loop

    Close #intfic
 
End Sub




Voici un exemple de message de mon fichier TrameRx_IP.DAT
30/11/2012 10:51:3312340000002138008003
30/11/2012 10:53:1412340000002138008003
30/11/2012 10:54:5912340000002138008003
30/11/2012 10:56:4412340000002138008003
30/11/2012 10:58:3012340000002138008003
30/11/2012 11:00:1312340000002138008003
30/11/2012 11:01:5512340000002138008003
30/11/2012 11:03:3812340000002138008003
30/11/2012 11:05:2112340000002138008003
30/11/2012 11:07:0712340000002138008003
30/11/2012 11:08:5212340000002138008003
30/11/2012 11:10:3812340000002138008003
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
6 déc. 2012 à 16:34
Regarde la méthode Open... For Append...
Ça te permettrait d'écrire à la suite d'un fichier déjà créé, sans effacer les données déjà inscrites.

Le problème est de savoir si les données à inscrire sont déjà inscrites ou non.
Il te faudrait alors lire ligne par ligne (Line Input) et vérifier l'existence de l'enregistrement avant de l'inscrire dans le fichier de sauvegarde.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
0
ok je regarde la méthode et je vous faire signe

tes cool
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 17:53
Bonjour,
Cela n'est possible que si :
- l'écriture du fichier à traiter se fait indépendamment de ton appli
- l'appli de "surveillance/retraitement" utilise un timer pour aller lire et traiter périodiquement les données du fichier créé
Avec le risque inévitable suivant :
- si j'ai bien compris, le programme qui écrit le fichier efface tout et recommence tout à la 500ème ligne d'écriture.
- or rien ne garantira jamais que ton appli/timer interviendra pile-poil et à tous coups entre le 500ème et le 501ème enregistrement.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 18:03
Maintenant : quelle appli crée le fichier TrameRx-IP.DAT ?
Si tu en as le code source, tout est alors plus simple et c'est sur lui, qu'il faut agir. Et là : sans aucun risque


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
6 déc. 2012 à 18:13
Et quand j'écris ceci :
- or rien ne garantira jamais que ton appli/timer interviendra pile-poil et à tous coups entre le 500ème et le 501ème enregistrement.

Je ne dis nullement pas qu'il faille "sauvegarder" uniquement si 500 enregistrements, hein ...
Je dis que si, ton autre programme vient d'écrire le 500ème enregistrement et que ton appli le "rate" entre ce moment-là et le moment où l'enregistrement suivant est écrit par l'autre programme, ta sauvegarde aura "raté" le 500ème enregistrement et ne trouvera que les 1ers enregistrements de la "série" suivante .

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Rejoignez-nous