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-E]Relancer une instance excel : shellexecute ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut [VBA-E]Relancer une instance excel : shellexecute ?
    Bonjour à tous,

    En cette grise journée, je cale sur une saloperie

    En fait, je voudrais pouvoir fermer mon instance excel et la relancer directement après cette fermeture.
    Evidemment, le fichier test.xls doit se rouvrir également.

    J'avais pensé à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           Application.Quit
           ShellExecute 0, "open", "Excel.exe", cPath, "", 1
    Mais ca ne fonctionne pas.
    Il m'ouvre une nouvelle instance excel avec le bon fichier mais ne ferme pas la première. Il skip le application.quit

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Sans doute le système ne suit-il pas
    Après fermeture du fichier, place un DoEvents ainsi qu'avant la nouvlle ouverture d'Excel. Sinon, tu peux utiliser Sleep 10 ou 20 ou 30...

    Tu dis

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ouskel'n'or
    Sans doute le système ne suit-il pas
    Après fermeture du fichier, place un DoEvents ainsi qu'avant la nouvlle ouverture d'Excel. Sinon, tu peux utiliser Sleep 10 ou 20 ou 30...

    Tu dis

    A+
    Heu comment ca marche tout ca ?
    Désolé

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    salut
    tu ecris ton code dans vba ou vb?

  5. #5
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut Re: Relancer une instance excel : shellexecute ?
    valval >>
    Citation Envoyé par boosty
    En fait, je voudrais pouvoir fermer mon instance excel et la relancer directement après cette fermeture.
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut Re: Relancer une instance excel : shellexecute ?
    Citation Envoyé par Thierry AIM
    valval >>
    Citation Envoyé par boosty
    En fait, je voudrais pouvoir fermer mon instance excel et la relancer directement après cette fermeture.
    Effectivement, VBA

  7. #7
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut...

    Je suis perplexe, comme Thierry, car je suppose que application représente Excel, et donc que ton code est lancé à partir d'excel...

    Au lancement de la procédure, Excel tente de se fermer. Comme il ne peut laisser vba tout seul, il termine sa procédure, et donc ouvre le fichier, puis se ferme. Il te reste donc forcément une instance d'Excel ouverte...
    Donc, je ne vois pas comment tu peux dire que l'instance ne se ferme pas...

    Cela étant, si tu nous expliquais le but de cette manoeuvre, car moi, je ne vois pas pourquoi tu dois fermer un fichier puis l'application pour l'ouvrir directement sur ce même fichier...

    A bientôt pour la suite?

    Pierre Fauconnier
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Pierre Fauconnier
    Salut...

    Je suis perplexe, comme Thierry, car je suppose que application représente Excel, et donc que ton code est lancé à partir d'excel...

    Au lancement de la procédure, Excel tente de se fermer. Comme il ne peut laisser vba tout seul, il termine sa procédure, et donc ouvre le fichier, puis se ferme. Il te reste donc forcément une instance d'Excel ouverte...
    Donc, je ne vois pas comment tu peux dire que l'instance ne se ferme pas...

    Cela étant, si tu nous expliquais le but de cette manoeuvre, car moi, je ne vois pas pourquoi tu dois fermer un fichier puis l'application pour l'ouvrir directement sur ce même fichier...

    A bientôt pour la suite?

    Pierre Fauconnier
    Ben voilà, je fais une install et j'enregistre des dll lors du premier lancement du fichier.
    J'affiche une msgbox qui dit qu'excel va redémarrer (sinon les dll posent un petit problème) et voilà.

    Je veux simplement que :
    - Ca ferme excel
    - Ca rouvre excel


  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 25
    Points : 30
    Points
    30
    Par défaut
    salut

    si tu programmes dans le vba excel, tu ne pourras fermer que le(s) classeur(s) ouvert(s) mais pas excel lui-même. vba excel est dépendant d'excel. par consequent, l'opération que tu essayes d'effectuer n'est possible qu'en dehors du vba d'excel. n'utilise surtout pas de shellexecute.
    si tu le veux, je peux te donner du code permettant d'ouvrir et fermer un classeur directement dans excel.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut
    Ouvrir un nouveau classeur ca devrait fonctionner aussi.
    Le problème c'est que vu que je ferme l'activeworkbook, il n'ouvre pas le suivant..

    ActiveWorkbook.Close savechanges:=False
    Workbooks.Open (cPath)

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ActiveWorkbook.Close savechanges:=False
    DoEvents
    Workbooks.Open (cPath)
    Le doEvents (s'il doit faire quelque chose) c'est là qu'il faut le mettre

    Comment ça marche ?
    Extrait non "Totalité de l'aide"

    Arrête momentanément l'exécution afin que le système d'exploitation puisse traiter d'autres événements.

    Syntaxe

    DoEvents( )

    Remarques

    La fonction DoEvents renvoie une valeur de type Integer représentant le nombre de feuilles ouvertes dans les versions autonomes de Visual Basic (Visual Basic Édition Standard, par exemple). DoEvents renvoie un zéro dans toutes les autres applications.

    DoEvents passe la main au système d'exploitation jusqu'à ce que ce dernier ait terminé de traiter les événements de sa file d'attente et que tous les codes de la file d'attente SendKeys aient été transmis.

    La fonction DoEvents est particulièrement indiquée pour les opérations simples que l'utilisateur veut annuler juste après les avoir lancées, comme par exemple la recherche d'un fichier. Pour les opérations nécessitant une exécution plus longue, l'opérateur pourra plus aisément rendre la main au processeur s'il a recours à un contrôle Timer ou à un composant EXE ActiveX. Dans ce cas, la tâche s'effectue de manière complètement indépendante, hors de votre application, le système d'exploitation gérant à la fois le multitâche et le partage du temps.

    Avertissement Lorsque vous rendez la main de manière temporaire à votre processeur dans une procédure d'événement, veillez à ce que la procédure ne soit pas exécutée à nouveau par une autre portion de votre programme, avant que le résultat du premier appel ne soit renvoyé ; cette situation peut avoir des conséquences inattendues. En outre, n'utilisez pas DoEvents s'il existe un risque d'interaction imprévisible entre d'autres applications et votre procédure pendant que l'exécution est suspendue.
    A+

    NB - La syntaxe est bien DoEvents. Je n'ai jamais essayé avec un paramètre ()

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    En ce moment, j'ai un truc qui a beaucoup de succés pour remplacer un DoEvents... Gracieusement offert par DarkVader un jour de janvier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
     
    Sub machin()
    ActiveWorkbook.Close savechanges:=False 
        Sleep 100 'en millisecondes 
    Workbooks.Open (cPath)
    End sub
    A+

    Edit
    On m'a même dit que c'était génial ! Aaaah ! ce DarkVader !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ouskel'n'or
    En ce moment, j'ai un truc qui a beaucoup de succés pour remplacer un DoEvents... Gracieusement offert par DarkVader un jour de janvier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 
     
    Sub machin()
    ActiveWorkbook.Close savechanges:=False 
        Sleep 100 'en millisecondes 
    Workbooks.Open (cPath)
    End sub
    A+

    Edit
    On m'a même dit que c'était génial ! Aaaah ! ce DarkVader !
    Mon Workbook ne s'ouvre toujours pas.
    Logique si je comprends bien la fonction sleep retarde l'exécution mais vu que l'activeworkbook est fermé, il ne sait pas ouvrir le deuxieme.

    Qqun peut me mettre sur une piste de solution?

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Là, je suis comme Pierre Fauconnier, dans l'espectative... cf- son message

    Explique-nous mieux

    A+

  15. #15
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    et pourquoi tu ne ferais pas ton install avec autre chose ?
    InnoSetup, par exemple
    Vous vous posez une question, la réponse est peut-être ici :
    Toutes les FAQs VB
    Les Cours et Tutoriels VB6/VBScript
    Les Sources VB6


    Je ne réponds pas aux questions techniques par MP. Utilisez les forums. Merci de votre compréhension

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, j'ai tout relus et je crois avoir compris.
    Si ta macro est dans le fichier que tu fermes, alors il est normal qu'après la fermeture, son exécution s'interrompe.
    Donc, nous sommes en présence de deux hypothèse. L'hypothèse 1 et l'hypothèse 2.
    Examinons l'hypothèse 1
    - Ta macro est dans le fichier que tu fermes avant qu'elle ait fini son travail et il est normal que ça marche pas
    Examinons à présent l'hypothèse 2
    - Ta macro est dans un autre fichier et là ça devrait marcher.

    Conclusion : On peut conclure que la bonne hypothèse est l'hypothèse 1

    Donc, pour que ton intéressant projet de fermeture/ouverture consécutifs de fichier Excel, en VBA aboutisse, il paraît nécessaire après examen de la situation, de mettre la macro dans un .XLA. Ainsi tu auras tout le loisir de la lancer depuis le fichier qui se ferme, et son exécution se poursuivra une fois le fichier fermé. Pas le xla, le xls...

    Ouf !

    A+

    Si t'as bobo, tu dis "Bobo !"

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 39
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ouskel'n'or
    Bon, j'ai tout relus et je crois avoir compris.
    Si ta macro est dans le fichier que tu fermes, alors il est normal qu'après la fermeture, son exécution s'interrompe.
    Donc, nous sommes en présence de deux hypothèse. L'hypothèse 1 et l'hypothèse 2.
    Examinons l'hypothèse 1
    - Ta macro est dans le fichier que tu fermes avant qu'elle ait fini son travail et il est normal que ça marche pas
    Examinons à présent l'hypothèse 2
    - Ta macro est dans un autre fichier et là ça devrait marcher.

    Conclusion : On peut conclure que la bonne hypothèse est l'hypothèse 1

    Donc, pour que ton intéressant projet de fermeture/ouverture consécutifs de fichier Excel, en VBA aboutisse, il paraît nécessaire après examen de la situation, de mettre la macro dans un .XLA. Ainsi tu auras tout le loisir de la lancer depuis le fichier qui se ferme, et son exécution se poursuivra une fois le fichier fermé. Pas le xla, le xls...

    Ouf !

    A+

    Si t'as bobo, tu dis "Bobo !"
    Effectivement, c'était l'hypothèse 1

    Merci beaucoup de votre aide, je vais me tourner vers un xla alors

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

Discussions similaires

  1. [VBA-E] Exporter une page Excel vers un Fichier Txt
    Par mamantins dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/06/2006, 11h09
  2. [VBA-E] Afficher une feuille excel pour la modifier
    Par z980x dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/05/2006, 22h21
  3. [VBA-E] Récupérer une macro excel 97
    Par sammy39 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/05/2006, 11h04
  4. [vb6] Soucis avec une instance excel
    Par Little-Freud dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/04/2006, 16h08
  5. [VBA-A] Ajouter une feuille Excel
    Par kissmytoe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/02/2006, 15h54

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