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 :

Processus Excel encore actif à la fermeture. [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 71
    Points
    71
    Par défaut Processus Excel encore actif à la fermeture.
    bonjour,

    Depuis une application access, j'ouvre un fichier Excel pour le remplir, puis je le ferme ensuite.

    Un processus excel reste actif dans le gestionnaire de tache, ce qui engendre des problemes lors d'une seconde execution

    je mets bien après la fermeture de mon fichier.

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 371
    Points
    34 371
    Par défaut
    Salut,

    as-tu mis avant ce Set la ligne suivante ?


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Je viens de le faire et le problème persiste.

    j'ai remarqué que lorsque je ferme toute l'application acces, le processus se ferme.

    petite precision:

    Mon objet Xls est du type Excel.application et elle est déclararer en global, car je l'utilise pour le remplissage dans une fonction (dans un module).

    et mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Xls = createobject("excel.application")
    se trouve dans l'ouverture du formulaire

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    voila le message d'erreur que j'ai si je relance une seconde fois ma macro

    Nom : erreur.jpg
Affichages : 1401
Taille : 12,8 Ko

    Dans la macro je fais la copie d'un onglet et c'est sur le collage de cette onglet que le programme bug.

    nb : quand je ne fais pas de copier/coller et juste un remplissage, je n'ai pas le problème

    Merci d'avance

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Le problème vient certainement du fait que ton code manipulant Excel comprend des expressions implicites, qui le plus souvent ne sont adaptées à l'automation.

    Par exemple ActiveSheet.Range("A1") = "Colonne 1" ne fonctionnera pas en automation s'il y a plus d'un processus EXCEL.EXE en mémoire, alors que cela fonctionnera si la même expression est exécutée dans un module de code Excel.
    En automation, il faudra plutôt écrire Xls.ActiveSheet.Range("A1") = "Colonne 1", car Xls désigne explicitement à quel Excel.Application on fait référence.

    La règle que j'applique en automation, c'est de toujours commencer une expression s'appliquant au modèle objet que je manipule, par une variable objet de ce même modèle objet.
    Précision: 'Modèle objet' veut dire Excel, Word ou Outlook, si depuis Access je manipule des objets Excel, Word ou Outlook.

    A+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Voila sur quel code il bug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Xls.Sheets("model " & CbIlot.Value).Copy before:=Sheets("model " & CbIlot.Value)
    en sachant que xls est un objet excel.application

    Ce que je ne comprend pas c'est pourquoi mon processus excel reste ouvert.

    A la fin de l'automatisation depuis access, je le laisse ouvert et visible. Ensuite je le ferme excel et il est toujours actif (sauf si je ferme access).
    J'ai essayé de le fermé aussi depuis acces et j'ai toujours le même problème.

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    Dans ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Xls.Sheets("model " & CbIlot.Value).Copy before:=Sheets("model " & CbIlot.Value)
    Cette expression est implicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("model " & CbIlot.Value)
    car elle n'est pas précédée de Xls. C'est elle qui à mon avis lève l'erreur lorsqu'il y a plus d'un processus EXCEL.EXE en mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Xls.Sheets("model " & CbIlot.Value).Copy before:=Xls.Sheets("model " & CbIlot.Value)
    serait plus approprié au contexte automation.

    Autre remarque:
    Avec Xls.Sheets tu ne désignes pas explicitement le classeur auquel la collection Sheets fait référence.
    Moi, je préfère passer par une variable objet intermédiaire de type Excel.Workbook.
    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
    Dim Xls as Excel.Application
    Dim XlWbk as Excel.Workbook
     
    ' Initialisation de la variable objet Xls
    Set Xls = ... 
     
    ' Ouverture du classeur
    Set XlWbk = Xls.Workbooks.Open("C:\Chemin\Classeur.xlsx")
     
    ' Xls.Sheets("model " & CbIlot.Value).Copy before:=Xls.Sheets("model " & CbIlot.Value)
    ' devient (si tout se passe dans le même classeur)
    XlWbk.Sheets("model " & CbIlot.Value).Copy before:=XlWbk.Sheets("model " & CbIlot.Value)
     
    ' Libération des variables objets Excel sans fermer Excel
    Set XlWbk = Nothing
    Set Xls = Nothing
    De cette façon il n'y a aucune ambiguïté du fait que le code est explicite.
    Cela permet une meilleure libération des références (liaisons COM) à l'objet Excel.Application.
    Dans le cas contraire on risque de créer involontairement des références supplémentaires à l'objet Excel.Application, ce qui empêche la fermeture d'Excel, car cela ne peut s'effectuer que si le nombre de références tombe à zéro.
    C'est ce qui se produit en principe lorsque tu fermes Access. Cela fait tomber le nombre de références et la fermeture du processus EXCEL.EXE devient possible (approuvée par le gestionnaire de liaisons COM).

    Je ne sais pas si c'est très clair, mais c'est le principe.

    A+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 95
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup, ca marche.

    Je vais par contre me forcer a travailler comme tu l'as expliqué plus haut.

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

Discussions similaires

  1. [XL-2007] Processus Excel.exe qui reste actif
    Par Neowile dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 16/02/2012, 15h50
  2. Processus Excel.exe qui reste actif
    Par siuol dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 18/04/2011, 19h26
  3. [xlsread/xlswrite] Fermeture processus Excel
    Par lfournie dans le forum MATLAB
    Réponses: 10
    Dernier message: 02/09/2008, 11h32
  4. Automation Excel - Processus Xl reste actif
    Par cooldidi dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/03/2008, 15h38
  5. Processus EXCEL;exe actif apres fermeture
    Par jamescook dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/10/2007, 11h49

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