IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Utilisation de la fonction d'écriture dans un fichier "Print"?


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut Utilisation de la fonction d'écriture dans un fichier "Print"?
    Bonjour à tous!

    J'essaie d'avoir une boucle qui écrit dans un fichier créé.
    J'ai essayé de faire le code le plus simple, en m'inspirant des FAQ, mais la fonction Print ne marche pas: le fichier créé (le nº2) reste vide.
    Tout le reste du code marche correctement.

    Y a t-il quelque chose qui ne va pas?
    Est-ce dû à une mauvaise utilisation de "#"?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Dim sRead As String             'Line read from Input file
    Dim sCorrected As String        'Line printed in Output file
    Dim iFileLength As Integer      'Length of Input file
    Dim iLoop As Integer            'For loop variable
    Dim cChar As String             'Character got
     
    Open "U:\PREV_" & i & "_" & k & "_TEMP.txt" For Input As 1
    Open "U:\PREV_" & i & "_" & k & ".txt" For Output As 2
     
    While Not EOF(1)
        Line Input #1, sRead
        For iLoop = 1 To Len(sRead)
            cChar = Mid(sRead, iLoop, 1)
            If (cChar = Chr(9)) Then
                cChar = "/"
            End If
            sCorrected = sCorrected & cChar
        Next
        Print #2, sCorrected
    Wend
    Merci beaucoup!

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    À part
    • la suppression de la boucle de remplacement (replace fait en une instruction tout ce que fait ta boucle :-).
    • le remplacement des constantes numériques par des 'fausses' constantes symboliques (qui rendent le code plus clair)
    • et l'ajout des "close" à la fin (qui ferme proprement les fichiers)

    c'est très semblable à ton code et c'est ainsi que je l'aurai écrit.

    Assures-toi que ta boucle est bien exécutée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Dim sRead As String             'Line read from Input file
    Dim sCorrected As String        'Line printed in Output file
    Dim iFileLength As Integer      'Length of Input file
    Dim iLoop As Integer            'For loop variable
    Dim cChar As String             'Character got
     
     
    dim numFichierEntree as long:numFichierEntree=FreeFile()
    Open "U:\PREV_" & i & "_" & k & "_TEMP.txt" For Input As numFichierEntree 
     
    dim numFichierSortie as long:numFichierSortie=FreeFile()
    Open "U:\PREV_" & i & "_" & k & ".txt" For Output As numFichierSortie 
    While Not EOF(numFichierEntree)
        Line Input #numFichierEntree, sRead
        debug.print sRead:doEvents 'Va afficher la ligne lue dans la fenêtre d'exécution immédiate
        sCorrected =replace(sRead,chr(9),"/")
        Print #numFichierSortie, sCorrected
    Wend
     
    close #numFichierEntree
    close #numFichierSortie
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut
    Salut René,

    Super, l'instruction Replace, merci!
    J'avais bien le code pour fermer les fichiers, mais je voulais copier que ce qui est intéressant: tu fais bien de le rappeler au cas où, en tous cas

    Par contre, j'avais fait avec des variables, au début, mais pas de la même manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iFileRead = FreeFile
    iFileCorrected = FreeFile
    -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Line Input #iFileRead, sRead
    (...)
    Print #iFileCorrected, sCorrected
    Mais les deux variables récupéraient la même valeur. C'est pour ça que j'ai opté pour mettre des numéros moi-même à la place.

    Je viens de tester ce que tu proposes, et ça marche très bien: merci beaucoup


    Je vais en profiter pour poser une autre question.
    Plus loin dans le code, après le traitement que je fais (replace, etc.), je souhaite supprimer le fichier d'Input avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oFSO.DeleteFile "U:\PREV_" & i & "_" & k & "_TEMP.txt", True
    Mais je reçois l'erreur 70, qui me dit que soit il est en lecture, soit il est protégé. Évidemment, le problème vient du fait qu'il est mal fermé dans mon code.

    J'ai utilisé la fonction de fermeture en essayant plusieurs façons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Close numFichierEntree
    Close #numFichierEntree   '<-- qui logiquement ne marche pas
    Close #1 'après avoir repris ma première méthode
    Mais rien à faire: le fichier n'est pas fermé

    Je me suis dit, bêtement: "bon, la fonction oFSO.DeleteFile prend une méthode de Scripting.FileSystemObject, donc je vais ouvrir avec une autre méthode de Scripting.FileSystemObject (en sachant qu'il y aurait deux ouvertures, mais c'est pour voir):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oFl = oFSO.GetFile("U:\PREV_" & i & "_" & k & "_TEMP.txt")
    Rien n'a changé, et je ne comprends pas pourquoi le fichier ne se ferme pas bien. Une idée?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    FreeFile ne change de valeur QUE quand tu ouvres vraiment le fichier.

    Pour ton autre problème, je ne sais pas. Le close normalement écrit les données actuellement en mémoire, ferme le fichier puis libère la mémoire. Il se peut que Windows garde quand même la main un peu de temps après.

    Pour valider qu'il est bien fermé pour VBA, écrit un PRINT #1,"Test" après le close tu devrais avoir un message d'erreur.

    J'essairai de mettre une pause (ex : 1s) entre la commande close et la commande de supprssion.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2011, 18h24
  2. Utilisation d'une fonction d'agregat dans la clause Where
    Par nicolasline dans le forum Designer
    Réponses: 2
    Dernier message: 15/02/2011, 22h56
  3. Réponses: 2
    Dernier message: 29/07/2009, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo