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 :

VBA Excel _ processus bloque attachement PJ


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut VBA Excel _ processus bloque attachement PJ
    Bonjour à tous,

    J'ai un problème avec une macro Excel.

    La macro en question traite une feuille de données avec une boucle.
    A chaque tour de la boucle elle génère une page Word, l'enregistre sur le réseau et l'envoie en pièce jointe par mail. L'envoie par mail se fait avec un objet CDO pour éviter les confirmations demandées par Outlook.
    Lorsque j'exécute la macro pas à pas : aucun soucis. Lorsque je lance normalement elle plante au niveau de ma ligne ".AddAttachment (chemin)" de ma fonction d'envoi de mail. Le message d'erreur est : "Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus".

    J'ai "résolu" le problème en mettant une tempo de 10 secondes avant d'envoyer le mail (avec six secondes j'avais encore des erreurs donc j'ai pris une marge). La ça marche, si on peut dire, mais ça n'est pas très satisfaisant je trouve.

    J'ai émis l'hypothèse que le programme bloquant est Word mais c'est plus un feeling, je suis loin d'être un crack en programmation.

    J'espère que c'est à peu près clair comme description de mon problème.

    Si quelqu'un a une méthode pour régler (simplement) le problème, je suis preneur.
    Sinon, est-ce que quelqu'un sait comment je pourrai vérifier que le processus WINWORD.EXE est bien fermé avant d'envoyer mon mail?

    J'ai envisagé de faire une copie du fichier que je souhaite envoyer afin de ne plus dépendre d'un autre processus. Qu'est-ce que vous en pensez?

    Je vous remercie de m'avoir lu, j'espère que quelqu'un pourra m'aider.

    Merci d'avance.

    Yann

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour et bienvenue sur le Forum Office de DVP.

    Si j'ai bien compris tu as pris une tempo par test pour pouvoir détecter la fin du processus de Word.

    Tu dois avoir une insctruction qui fermes le processus de Word, Non ?
    Si c'est le cas, essayes de mettre l'instruction DoEvents à la fin de cette instruction de fermeture.

    Starec

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Bonjour Starec et merci de t'intéresser à mon problème.

    La tempo c'est complètement empirique. Je me suis dit que si un processus verrouillait l'envoi il fallait attendre que le processus le libère sachant qu'en lançant la macro pas à pas ça marchait.

    Je ferme word après avoir sauvé le fichier via la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     DocWord.Application.ActiveDocument.SaveAs (chemin)
                AppWord.Application.Quit
    J'ai essayé la commande doevents. J'avais écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DoEvents AppWord.Application.Quit
    mais ça ne réglait pas mon problème. Est-ce comme ça qu'il faut utiliser la commande DoEvents.

    Merci encore.

    Yann

  4. #4
    Invité
    Invité(e)
    Par défaut
    Re

    Essayes (sans garantie )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DocWord.Application.ActiveDocument.SaveAs (chemin)
    AppWord.Application.Quit
    DoEvents
    Sinon, va jeter un coup d'oeil dans la FAQ Access ou les sources, je ne sais plus où, il doit y avoir un code (qui devrait fonctionner sous Excel) pour détecter la fin d'un processus.

    Starec

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    J'ai essayé ta syntaxe mais toujours le même problème.

    J'ai essayé de faire une copie du fichier et d'envoyer la copie mais je rencontre une erreur au moment de la copie, le fichier est verrouillé. Une piste en moins.

    Je regarde du côté du forum access et je mettrai les infos que je trouve.

    Merci de m'avoir accordé du temps Starec.

    Yann

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    En cherchant du côté d'Access j'ai trouvé ce post qui me semble traiter un peu du même problème que moi.

    J'ai essayé de tester mais la proposition est au delà de mes connaissances malgré les explications

    Citation Envoyé par ClaudeLELOUP Voir le message
    l'idée:
    1° D'abord ajouter la référence "Microsoft Scripting Runtime"
    (Modules/outils/références... et cocher "Microsoft Scripting Runtime"
    Ca j'ai fait.


    Citation Envoyé par ClaudeLELOUP Voir le message
    l'idée:
    2° Ajouter ceci en tête d'un module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    '---------------------------
     '--- Déclaration des API ---
     '---------------------------
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredWord As Long, ByVal bInheritHandle As _
     Long, ByVal dwlProcessID As Long) As Long
    Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
     '-----------------------------
     '--- Déclaration des CONSTANTES ---
     '-----------------------------
    Public Const PROCESS_QUERY_INFORMATION = &H400
    Public Const STATUS_PENDING = &H103&
    La ça bug... Où est-ce que je dois mettre ça?

    Résultat j'ai pas pu tester le reste. Mais je pensais adapter le reste du code comme ça:


    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
    25
    26
    27
    28
    Dim Chemin1erFichier
    Dim fso As FileSystemObject
    Dim lhProcess As Long
    Dim lProcessID As Long
    Dim lpExitCode As Long
    Dim ExPgm
    Chemin1erFichier = "C:\MesDocuments\DOC\Fichier1.doc"
     
    'traiter mes données excel
    '----------------------
     
    'Ouvrir Word et remplir la page
    '-----------------------------------------------
        lProcessID = Shell("WINWORD.EXE " & Chemin1erFichier, vbMaximizedFocus)
    'Ouverture d'un processus sur le programme ouvert + récupération du handle du processus
        'La récupération du handle est nécessaire pour obtenir des informations sur celui-ci
        lhProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, lProcessID)
        'Boucle tant que la variable lpExitCode <> STATUS_PENDING (&H103&)
        Do
            'Récupération du code de sortie du processus
                'Si programme ouvert -> la variable lpExitCode = STATUS_PENDING
                'Sinon -> la variable lpExitCode = 0. Donc fin de la boucle
            Call GetExitCodeProcess(lhProcess, lpExitCode)
            DoEvents 'Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.
        Loop While lpExitCode = STATUS_PENDING
        Call CloseHandle(lhProcess) 'Ferme le handle du processus
     
    'Excel reprend la main et envoie le mail
    [/QUOTE]

    J'aimerai bien un peu d'aide pour décoder tout ce code ainsi qu'un avis sur ma proposition.

    Merci d'avance.

    Yann

Discussions similaires

  1. [XL-2003] [VBA-E] Tuer processus Excel cachés sous Win7
    Par Hindioumax dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 18/04/2012, 13h53
  2. [XL-2003] Fermeture de Processus Word via Macro VBA Excel
    Par ted the Ors dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/10/2009, 19h46
  3. Réponses: 4
    Dernier message: 18/12/2004, 14h29
  4. [VBA EXCEL] Réduire/Agrandir UserForms
    Par Fench dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/11/2003, 16h02
  5. [VBA Excel] Effacer rapidement une feuille
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 24/10/2002, 13h12

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