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

Macros et VBA Excel Discussion :

Supprimer fichier texte [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut Supprimer fichier texte
    Bonjour,
    Je fais des retouches à une appli (dont je ne suis pas l'auteur) qui extrait des données de feuilles XL et produit un fichier texte en utilisant Print #1; comme je suis peu habile en VBA je dois tester régulièrement mes modifications du code. Or, chaque fois que je lance l'appli juste après un test précédent j'ai un message Permission refusée due au fait (je pense) que le fichier texte créé précédemment existe toujours même fermé. Le code s'achève par Close #1. Je dois à chaque fois tout sauvegarder et redémarrer l'ordi = perte de temps. Quelle instruction ajouter pour que le fichier #1 soit éliminé et pas seulement fermé ? J'ai essayé Kill mais j'ai une erreur. Merci d'avance pour tout conseil.
    Cordialement
    touche_a-tout

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Salut, quand tu vas chez le médecin, tu lui dis juste "je suis malade" ou tu précises tes symptômes ?
    Ici c'est pareil, j'ai une erreur ne permet pas vraiment d'aider.
    Le code de la macro et la ligne qui provoque l'erreur, ça serait pas mal.

  3. #3
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Salut,
    Tu as raison et je te remercie de prêter attention à mon souci. Le symptôme, c'est "Permission refusée",
    (qui disparaît après un redémarrage",
    la ligne qui provoque l'erreur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open Nom_Dossier & "\" & Nom_Fichier & ".ged" For Output As #1
    et la macro fait environ 3000 lignes, je ne voudrais pas surcharger.
    J'ai pensé que l'idée de supprimer le fichier #1 était assez explicite. Je suis désolé.
    Merci d'avance si ces détails te permettent d'y voir plus clair.
    Cordialement
    touche_a_tout

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Moi ça ne m'aide pas, la ligne où apparaît l'erreur n'est pas forcément la cause de l'erreur, il faudrait voir ce qui amène l'erreur et pour ça il faut le reste du code.
    3000 lignes pour une macro ? Bonjour la maintenance, tu ne pouvais pas la décliner en plusieurs macros plus petites ?
    Exécute en pas à pas pour voir si le chemin et le fichier attendus sont corrects, c'est tout ce que je peux dire avec le minimum d'information fourni.
    Voici de quoi effacer un fichier, vois si tu peux l'insérer quelque part dans ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub DeleteFile(ByVal FileToDelete As String)
      If FileExists(FileToDelete) Then 'Remplacer FileToDelete par le chemin et nom du fichier à supprimer
        ' Suppression de l'attribut en lecture seule, s'il est défini
        SetAttr FileToDelete, vbNormal
        ' Ensuite, suppression du fichier
        Kill FileToDelete
      End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function FileExists(ByVal FileToTest As String) As Boolean
      FileExists = (Dir(FileToTest) <> "")
    End Function

  5. #5
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Je vois le sac de noeuds. J'ai dit que je n'étais pas l'auteur de l'appli; ça veut dire qu'elle évolue à des niveaux de VBA que mes pauvres connaissances me rendent inaccessibles et je n'y touche qu'en espérant ne pas tout déglinguer. J'ai une idée approximative de sa structure. Elle contient une procédure sub qui définit une partie introductive et lance 6 procédures Function très similaires entre elles (mais pas identiques), qui produisent le fiichier texte, le tout agrémenté par 26 Function qui fournissent des données à toutes les autres procédures. La sub introductive, sub de lancement en quelque sorte, ne compte que 142 lignes et contient la ligne qui passe en jaune quand apparaît le message d'erreur, ligne 82. Est-ce que je cite ces 142 lignes de code dans un post ou je les mets en annexe ?
    J'espère que ces données suffiront et je te remercie d'avance.
    Bien à toi
    touche_a_tout
    P.S. Je cite tout de même une ligne de commentaire (tout au début de la procédure introductive):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'ferme le fichier #1 précédent
    Apparemment le développeur avait prévu le problème de la "Permission refusée" mais il n'a pas introduit le bout de code correspondant.
    PS2: Merci pour tes 2 fragments de code. Le problème est que je n'ai aucune idée de l'endroit où le fichier #1 va se loger, donc pas moyen de fournir un chemin à ta macro.

    PS3 Pour corser le tout, je n'arrive pas à reproduire l'erreur dont il est question ici, donc je ne peux pas retrouver l'explication que donne Microsoft, mais il est question d'un fichier placé sur un disque protégé en écriture ou lui-même protégé en écriture, d'où l'idée de supprimer ce fichier, mais si la procédure exige le chemin, voir ci-dessus !!

  6. #6
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Re,
    J'ai fini par obtenir le message d'erreur (je ne sais pas encore comment). La première explication de Microsft est:

    Vous avez essayé d’ouvrir un fichier protégé en écriture en mode Output ou Append séquentiel. Ouvrez le fichier en mode Input ou modifiez l’attribut de protection en écriture du fichier.
    Je te le donne pour ce que ça vaut.
    Merci
    touche_a_tout

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 946
    Par défaut
    Vu tes explications, je pense qu'on dépasse le cadre de l'aide de ce forum. A priori, il faudrait décortiquer tout le projet pour voir comment ça fonctionne. Vu ton niveau, et ce n'est pas péjoratif, et le fait que tu n'es pas l'auteur, toute aide à l'aveugle risque d'empirer les choses, d'amener de nouvelles erreurs et sérieusement compliquer la maintenance future. Personnellement je n'ai pas autant de temps qu'il faudrait à te consacrer. Si c'est une application qui tourne en entreprise, il faudra probablement faire appel à des professionnels.

  8. #8
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Merci de ta franchise. Pas de souci sur mon niveau, il est meilleur dans d'autres domaines. Cette appli ne tourne que pour moi. J'ai des tas de raisons de ne pas faire appel à son auteur, il ne me reste donc plus qu'à redémarrer autant de fois que nécessaire
    Merci pour tout
    touche_a_tout

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 438
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 438
    Par défaut
    Salut,

    "Permission refusée", ca peut vouloir dire plusieurs choses:
    1) Tu n'as pas les droits suffisants pour interagir avec le fichier, c'est une restriction imposée par le système d'exploitation, il n'y a rien que ton programme puisse faire.
    2) Le fichier est en cours d'utilisation
    2.1) Soit par aune autre application en cours d'exécution ou qui a planté, encore une fois, rien que ton programme puisse faire.
    2.2) Soit par ton programme, il convient alors de rechercher les fonctionnalités qui manipulent le fichier et s'assurer que ces dernières le libèrent une fois qu'elles n'en on plus besoin, soit suite à leur exécution nominale, ou leur exécution dégradée (gestion des erreurs / exceptions).
    Bref, tu as affaire à un bug qui se situe "ailleurs".
    (genre de chose déjà bien pénible à débusquer / corriger).

  10. #10
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Salut deedolith et merci,
    C'est ce que j'avais compris à travers les explications de l'aide Microsoft. Le problème se complique encore un peu plus depuis que j'ai constaté qu'il se produisait de façon sporadique (et pas systématique comme j'avais cru). Mon choix (redémarrer aussi souvent que nécessaire) est donc d'autant plus justifié; de plus, ma correction fonctionne pour l'une des 6 procédures principales, il devrait donc être assez facile de faire de même pour les 5 autres ! Merci à toi et à Franc; la discussion peut être considérée comme résolue, faute de solution
    Cordialement
    touche_a_tout

    P.S. Tout de même une question: si l'on part du point de vue que c'est mon programme qui ne ferme pas correctement le fichier #1, ne peut-on pas passer par freefile (dont je ne connais pas bien la syntaxe) avec quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim intFic As Integer
    intFic = FreeFile
    Open Nom_Dossier & "\" & Nom_Fichier & ".ged" For Output As intfic
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open Nom_Dossier & "\" & Nom_Fichier & ".ged" For Output As #1
    qui provoque l'erreur ?

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 438
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 438
    Par défaut
    FreeFile retourne un identificateur de fichier libre.
    Il est recommandé de l'utiliser pour éviter les conflits.

    Par contre, si ton fichier est verrouillé ou inaccessible, ce ne te sera d'aucune utilité.

    PS: Une solution encore meilleur est de passer, autant que possible par la bibliothèque FSO pour manipuler les fichiers.
    Ca donne plus de sens à ton code, c'est plus facile à utiliser, c'est plus lisible, et c'est RAII.
    (que des avantages).

  12. #12
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Merci, je vais me documenter sur le FSO.
    Cordialement
    touche_a_tout

  13. #13
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour

    quand ça plante, si tu fais passer le curseur sur Nom_Dossier et Nom_Fichier tu sauras quel est le nom du fichier en cause et son emplacement.
    Là (open), la macro est en train d'essayer de l'ouvrir en écriture (en fait est en train de vouloir l'écraser).

    Selon toute probabilité c'est ta macro qui l'a déjà ouvert et qui l'a mal (pas) refermé... Connaissant ce que fait ton programme, ça pourrait t'orienter vers la cause possible ? Selon toute probabilité un open quelque part qui ne seras pas suivi d'un close.

  14. #14
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Merci Tête de chat,
    Je n'avais pas pensé à ça et c'est d'autant plus tarte de ma part que c'est moi qui attribue le nom de dossier et le nom de fichier par le biais d'une Userform !!
    Ton post me sauve, moi qui ne voyais pas comment trouver le path à indiquer à l'instruction de fermeture.
    Donc il suffirait d'écrire, après la ligne Close #1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom_Dossier & "\" & Nom_Fichier & ".ged" = Nothing
    ou est-ce que c'est plus compliqué ?
    Au fait, sur mes 3000 lignes j'ai un seul Open et un seul Close, dans la sub qui commande tout le reste.
    Merci encore et bonne soirée
    Cordialement
    touche_a_tout

  15. #15
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom_Dossier & "\" & Nom_Fichier & ".ged" = Nothing
    Non ça n'a à peu près aucun sens et ça devrait provoquer une erreur d'exécution, voire de compilation.

    J'essaye de comprendre ce qui se passe : tu dis que via un formulaire, tu saisis un nom de fichier (ou des éléments qui permettent de déterminer un nom de fichier). Tu as écrit plus haut que le programme "produit un fichier texte" donc je suppose, le fichier en question.

    Donc quand sa plante, tu devrais quand même avoir une idée de pourquoi le fichier est verrouillé, non ?
    > soit le fichier existe déjà et il est en lecture seule (ça tu peux le vérifier sous Windows indépendamment d'Excel)
    > soit le fichier existe déjà et quelqu'un (d'autre ou toi) l'a ouvert avec un logiciel qui le verrouille (Word...)
    > soit tu viens d'essayer de le générer et ton programme ne l'a pas refermé, il est resté verrouillé, ce qui est un cas particulier du précédent
    > soit d'une façon ou d'une autre ton programme bugge (il essaye de générer le fichier deux fois plus ou moins en parallèle)
    > soit...

    Il vaudrait mieux que ça soit un des trois premiers cas... sinon tu peux aussi nous mettre les 142 lignes que tu évoquais plus haut, histoire qu'on se fasse une idée...

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 438
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 438
    Par défaut
    Le mot clef "Nothing" ne s'applique qu'aux variables "objet", et veux dire: Non instancié.
    Il n'a pas vocation a être utilisé dans des expressions autre que:
    1) Assignation à une variable objet via le mot clef "Set" (ce qui provoque sa destruction).
    2) Comparaison avec l'opérateur "Is" (ce qui permet de savoir si une instance est en vie ou non).

  17. #17
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Bonjour et merci tête de chat,
    Ca m’ennuie que tu passes tout ce temps sur ce problème puisque, comme je l’ai écrit 2 ou 3 fois, il suffit d’un redémarrage pour contourner ledit problème. D’autre part je ne le rencontre que pendant le débogage de mes adjonctions, ensuite il ne se produira plus. Mais enfin puisque tu insistes : Je joins une capture de la userform.
    Nom : accueil_ged..jpg
Affichages : 358
Taille : 47,4 Ko

    C’est la troisième de tes hypothèses qui est la bonne je pense, car en toute logique
    1. L’appli crée un fichier #1 qu’elle remplit de texte
    2. Au deuxième lancement l’appli trouve un fichier #1 qui n’a pas été correctement effacé et plante.
    Ca me paraît confirmé par le fait qu’un redémarrage corrige le problème : le redémarrage remet les « compteurs à zéro » et élimine donc le #1 précédemment créé.

    Comme je suis à peu près nul, je ne saisis pas bien le rapport entre un fichier #1 et le fichier suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    E:\3_G_E_N_E_A_L_O_G_I_E\3_Reprise_création_sources_GED\18_HER_10_mar_23_creation\gedcomsHER10mar\Gedcom_dépôt_106C
    , mais une chose est sûre : après un run, je peux ouvrir et consulter le fichier path\filename avec le bloc-note ou même Word, et j’en ai besoin. Il faut donc que le programme efface #1 sans toucher à path\filename.
    Le module correspondant se termine par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Print #1, "0 TRLR"
    Close #1
    '(TRLR est le tag de fin de fichier gedcom)
    A ta place, je laisserais touche-a-tout finir son débogage à coups de redémarrages, sauf que j’aimerais bien savoir pourquoi Close #1 ne ferme pas correctement le fichier texte.
    Merci de ton intérêt
    Cordialement
    Touche_a_tout

  18. #18
    Membre éclairé Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 528
    Par défaut [XL-2016] Supprimer fichier texte
    Bonsoir tête de chat,
    Ton silence m'incite à penser que je peux déclarer cette discussion comme résolue, merci.
    Dont acte
    Merci aussi à Franc et Deedolith
    Cordialement
    touche_a_tout

  19. #19
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 549
    Par défaut
    Bonsoir,
    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
    22
    23
    24
    'Personnellement je préfère utiliser une routine séparé qui refermer le fichier a coup sur !  
    Property Let FichierTxt(Fichier, Optional AutreOption As Boolean = False, TEXT As Variant)
    With CreateObject("Scripting.FileSystemObject")
            With .OpenTextFile(Fichier, Array(2, 8)(Abs(AutreOption)), True)
                .Write TEXT
                .Close
        End With
    End With
    End Property
    Property Get FichierTxt(Fichier, Optional AutreOption As Boolean = False) As Variant
    With CreateObject("Scripting.FileSystemObject")
        With .OpenTextFile(Fichier)
            FichierTxt = .ReadAll
            .Close
        End With
    End With
    If AutreOption Then FichierTxt = Split(FichierTxt, vbCrLf)
    End Property
    Sub test()
    FichierTxt(Environ("temp") & "\toto.txt") = "test1"  'Ecrire dans un fichier texte en supprimant l'existant
    FichierTxt(Environ("temp") & "\toto.txt", True) = vbCrLf & "test2"   'Ajoute du texte dans un ficher existant
    txt = FichierTxt(Environ("temp") & "\toto.txt") 'Lire le contenu d'in fichier
    Table = FichierTxt(Environ("temp") & "\toto.txt", True) 'Lire le contenu d'un fichier texte et retourne chaque ligne sous forme de table !
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2006, 14h38
  2. Supprimer certaines lignes d'un fichier texte
    Par kek_net dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 12h21
  3. Supprimer une ligne dans un fichier texte
    Par @yoyo dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 28/03/2006, 15h19
  4. Supprime une ligne dans un fichier texte
    Par dev7 dans le forum Linux
    Réponses: 4
    Dernier message: 28/03/2006, 02h33
  5. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 17h43

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