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

Excel Discussion :

Pb d'execution de macros entre fichiers


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Pb d'execution de macros entre fichiers
    Bonjour,
    J'ai un manque de connaissance qui ne me permet pas de résoudre mon pb qui est le suivant :

    Dans un fichier XL nommé TEST_ENR_01.xlsm j'ai positionné les routines suivantes :

    Dans Thisworkbook:
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call enregsitre
    End Sub
    Private Sub Workbook_Open()
    Call DefVariable
    End Sub

    Puis dans un module :
    Option Explicit
    Public mywb As Workbook

    Sub DefVariable()
    Set mywb = ActiveWorkbook
    Debug.Print "Proc DefVariable : = " & mywb.Name
    End Sub

    Sub enregsitre()
    mywb.SaveAs "D:\Toto\essai.xlsm"
    Debug.Print "enregsitre : = " & mywb.Name
    End Sub

    Lorsque j'ouvre ce fichier, il m'affiche bien le bon nom de fichier (TEST_ENR_01.xlsm).
    Lorsque je le ferme, il enregistre bien ce fichier sous un autre nom (essai.xlsm )et affiche bien de dernier nom (essai.xlsm).

    MAIS, là où se situe le pb, c'est lorsque j'ouvre ce fichier (TEST_ENR_01.xlsm) à partir d'un autre en vba et que je le ferme à partir de ce même autre toujours en VBA, l'enregistrement ne s’effectue pas.

    J’ai réalisé ces tests pour comprendre et résoudre un pb similaire, mais dans un code plus vaste.
    J’ai chercher à comprendre les subtilités des saveas et autre mais sans succès.

    Merci à celui où celle qui pourrait éclairer ma lanterne.

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

    Informations professionnelles :
    Activité : Retraité

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

    d'après les traces posées par les debug.pring , les procédures ne se lancent pas ou se lancent et ne font pas ce qui est attendu ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,
    En fait les debug.print s'effectuent bien et affichent bien un résultat, mais 2 fois le même. Mais le résultat attendu par le 2eme debug.print lors de l’exécution à partir d'un autre fichier, est 'TEST_ENR_01.xlsm' au lieu d'être 'essai.xlsm' comme cela devrait être. Tout se passe comme si l'objet Workbook 'mywb' n'était pas initialisé ou n'existait pas. Et il n'y a pas d'erreur générée. C'est pour moi un mystère...
    Merci encore pour m'aider à comprendre cette finesse. Cordialement, JohnFox

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

    Informations professionnelles :
    Activité : Retraité

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

    selon toute probabilité le pb est par là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set mywb = ActiveWorkbook
    Au moment où se déclenche le workbook_open, le classeur qui contient la macro n'est pas actif, tu dois toujours récupérer le classeur "appelant".

    Il faut bien distinguer Activeworkbook qui est le classeur au premier plan et ThisWorkbook (sauf si tu changé son CodeName) qui est le classeur qui contient le code en cours d'exécution.

    Du coup une fois que tu utilises ThisWorkbook, tu n'as plus besoin d'intercepter le classeur à l'ouverture, tu peux directement dans le close faire :

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call enregsitre
    End Sub

    Sub enregsitre()
    ThisWorkbook.SaveAs "D:\Toto\essai.xlsm"
    End Sub

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci Tête de chat,

    J'ai essayé ce que tu m'a indiqué. Mais cela ne fonctionne pas non plus.
    J'ai essayé ensuite de définir aussi l'objet mywb avec 'set mywb =thisworkbook', mais cela ne marche pas non plus.

    Impossible de comprendre pourquoi. J'ai toujours le même fonctionnement. Le fichier seul s'ouvre et s'enregistre bien à sa fermeture tel que le code le demande. Mais lorsque je veux le faire faire depuis un autre fichier, la fermeture n'effectue pas le code. L'enregistrement ne s'effectue pas. Et le tout sans erreur ni message...

    Une idée?

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

    Informations professionnelles :
    Activité : Retraité

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

    on manque un peu d'infos sur le contexte...
    Le saveas déjà est suspect ; si tu veux juste enregistrer le fichier un save suffirait. Écrit comme ça si le fichier existe déjà ça va coincer. Après s'il traine un on error resume next dans le coin ça va sauter le saveas sans rien dire.

    Sinon tu as laissé ton debug.print dans le workbook_close ? Tu passes bien dedans ?

    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub enregsitre()
    on error goto 0
    debug.print ThisWorkbook.name
    ThisWorkbook.SaveAs "D:\Toto\essai.xlsm"
    End Sub
    Et dis-nous ce qui se passe...

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Hello Tête de chat,

    Encore merci d'essayer de m'aider.
    Rien n'y fait. J'ai essayé ce que tu m'as proposé. Mais j'ai toujours le même résultat. Le code passe bien par les debug.print, mais n'effectue pas le saveas.
    Incompréhensible. Et pourtant, il doit bien y avoir une explication rationnelle.
    Voici tous les essais que j'ai effectués en 1 fois par le biais d'appels multiples :

    Code dans le fichier TEST_ENR_01.xlsm que je veux fermer et enregistrer sous un autre nom, lors de sa fermeture, fermeture étant lancée à partir d'un autre fichier :

    DANS UN MODULE
    Option Explicit
    Private mywb As Workbook

    Sub DefVariable()
    Set mywb = ThisWorkbook
    Debug.Print "Proc DefVariable : = " & mywb.Name
    End Sub

    Sub enregsitre()
    Set mywb = ThisWorkbook
    mywb.SaveAs "D:\Toto\essai.xlsm"
    Debug.Print "enregsitre : = " & mywb.Name
    End Sub

    Sub enregsitre2()
    ThisWorkbook.SaveAs "D:\Toto\essai.xlsm"
    Debug.Print "enregsitre2 : = " & ThisWorkbook.Name
    End Sub

    Sub enregsitre3()
    On Error GoTo 0
    Debug.Print "enregsitre3 : = " & ThisWorkbook.Name
    ThisWorkbook.SaveAs "D:\Toto\essai.xlsm"
    Debug.Print "enregsitre3bis : = " & ThisWorkbook.Name
    End Sub

    DANS LES DECLARATION DE THIS WORKBOOK DU MEME FICHIER:
    Option Explicit

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call enregsitre
    Call enregsitre2
    Call enregsitre3
    End Sub

    Private Sub Workbook_Open()
    Call DefVariable
    End Sub

    Voilà le résultat lorsque le fichier est fermé à partir de l'autre :
    enregsitre : = TEST_ENR_01.xlsm
    enregsitre2 : = TEST_ENR_01.xlsm
    enregsitre3 : = TEST_ENR_01.xlsm
    enregsitre3bis : = TEST_ENR_01.xlsm

    Voilà le résultat lorsque je ferme manuellement le fichier lui-même : Ici le code est effectué entièrement.
    Proc DefVariable : = TEST_ENR_01.xlsm
    enregsitre : = essai.xlsm
    enregsitre2 : = essai.xlsm
    enregsitre3 : = essai.xlsm
    enregsitre3bis : = essai.xlsm

    Le saveas n'est pas executé. Qu'est ce que je loupe dans mes objets? dans mes déclarations? Une idée de test complémentaire?
    Encore merci pour ton oeil neuf et ton aide.

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai effectué des tests et effectivement il y a un souci avec la méthode SaveAs, lorsque l'on ferme le classeur depuis un autre. L'enregistrement ne semble pas avoir lieu.
    Pourquoi ne faites vous pas l'enregistrement depuis cet autre classeur ?

    Vous pouvez également essayer la méthode SaveAsCopy
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Merci pour l'aide.
    Malheureusement, j'ai toujours le même résultat. A savoir, cela fonctionne avec le fichier lui-même que l'on ouvre puis l'on ferme d'une manière classique.
    Mais cela ne fonctionne pas si on l'ouvre et qu'on le ferme depuis un autre fichier par VBA. Un vrai casse-tête. J'ai beau chercher sur internet, relire les aides des méthodes save, saveas et leurs différents paramètres, je suis comme certains raisins,..., secs secs, secs.

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si vous ouvrez un classeur B depuis un classeur A et que vous le sauver sous un autre nom depuis celui-ci, il n'y a aucun souci.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Bonsoir Philippe,

    Il n'y a effectivement aucune difficulté à enregistrer le fichier A depuis le fichier B.
    Ce n'est toutefois pas ce que je recherche pour une application assez lourde que je développe et que je debuggue par ailleurs. Et lors de ce debuggage, des résultats inattendus m'ont mis le doigt sur le pb que j'essaye de résoudre par le biais de 2 fichiers beaucoup plus simples que mon application elle-même. Et c'est le code de ces 2 fichiers simples que j'ai posté ici.

    J'ai creusé aussi autour des protections d’exécution de macros, des droits de répertoires, mais comme cela fonctionne avec le fichier A ouvert et fermé manuellement, je conclue que ce n'est pas la cause.
    J'ai changé le codename du fichier pour voir si le fait d'avoir 2 fichiers avec le même codename ne créait pas de pb. Négatif.
    Enfin, Je suis passé par le biais d'un objet workbook créé à l'ouverture, que j'ai déclaré public, puis private au niveau du module. Rien n'y fait.

    Je dois dire que je ne sais plus quoi tenter pour comprendre le phénomène dans lequel je bute et qu’il faut pourtant que j'arrive à solutionner. Je ne comprends pourquoi l'objet qui est défini à l'ouverture par la procédure Workbook_Open, n'est pas utilisé dans le save, ni le saveas, ni le savecopyas lancé à partir de la procédure Workbook_BeforeClose.

    Je suis ouvert à toute idée ou test complémentaire à effectuer.

Discussions similaires

  1. [XL-2003] executer une macro entre deux dates
    Par Eric26 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2011, 09h24
  2. [OpenOffice][Texte] executer une macro dans fichier odt sans ouvrir celui-ci
    Par cpf2006 dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/12/2010, 11h32
  3. [XL-2000] Macro entre fichiers
    Par gangstarrr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/06/2010, 21h26
  4. Problème de macro entre fichiers
    Par nicolav dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/07/2009, 14h30
  5. [VBA-E] ouvrir un fichier .xls sans executer les macro
    Par lae_t2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/01/2003, 17h07

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