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

Visual Studio Discussion :

Fermer un classeur Excel proprement via VB.net


Sujet :

Visual Studio

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2018
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Fermer un classeur Excel proprement via VB.net
    Bonjour, j'ai une question toute bête mais qui me trotte en tête depuis un moment. Voila:

    j'ai développé une appli qui fait pas mal appel à un classeur Excel. A chaque fois que j'ai besoin de mon classeur: j'utilise:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim MyExcel As New Excel.Application
    Dim wbExcel As Excel.Workbook
     
    wbExcel = MyExcel.Workbooks.Open(MonChemin)

    pour l'ouvrir. Pour la fermeture, j'utilise:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    wbExcel.Close()
    MyExcel.Quit()
    MyExcel = Nothing
    wbExcel = Nothing

    Et pourtant, il n'est pas rare que, lorsque je ferme mon programme et que je regarde le gestionnaire de tâches, certaines fenêtres Excel restent manifestement actives, parfois un bout de temps, parfois définitivement, mangeant ainsi de la ressource...

    Du coup je n'y comprends plus rien, d'où mes questions:

    1) Est-ce que je m'y prends mal pour fermer mon classeur? Y-a-t'il quelque chose à rajouter?
    2) J'avais pensé opter pour un kill du processus. Mais est-ce aussi propre? Quel est le plus propre des 2?

    En fait j'ai essayé ça avant l'ouverture de mon classeur (en utilisant une liste appelée ListeProc déclarée en début de script):

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ListProc.Clear()
    For Each p As Process In process.GetProcesses
       If p.ProcessName.Contains("EXCEL") = True Then
            Dim ProcPId = p.Id
            ListProc.Add(ProcPId)
       End If
    Next

    puis ça après la fermeture:

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each p As Process In process.GetProcesses
          If p.ProcessName.Contains("EXCEL") = True Then
                    Dim ProcPId = p.Id
               If ListProc.Contains(ProcPId) = False Then
               p.Kill()
               End If
          End If
    Next

    C'est super efficace mais... Est-ce propre? Et lorsqu'une écriture dans le code survient avant la fermeture, est-ce que c'est risqué (genre perte de données si je brusque un peu trop la fermeture de la fenêtre)?
    Pour info, tout se fait en arrière plan, sinon je les fermerais moi-même.

    3) Dernière question... Y-a-t'il un moyen de connaitre le PPID d'un processus via vb.net? C'est pour fermer ce qui reste d'ouvert en fin de programme... J'avais pensé implémenter un bout de code en début de programme, et un bout de code en fin de programme, mais je risque de kill un document excel que j'aurais moi-même ouvert entre temps

    En espérant que ceci inspire quelqu'un! Merci par avance pour vos réponses!
    Bonne journée!

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2012
    Messages
    4 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2012
    Messages : 4 905
    Points : 10 173
    Points
    10 173
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par chimere28 Voir le message
    Bonjour, j'ai une question toute bête mais qui me trotte en tête depuis un moment. Voila:


    Et pourtant, il n'est pas rare que, lorsque je ferme mon programme et que je regarde le gestionnaire de tâches, certaines fenêtres Excel restent manifestement actives, parfois un bout de temps, parfois définitivement, mangeant ainsi de la ressource...
    Tuer Excel après une opération de pilotage peut être un parcours du combattant.


    1) Est-ce que je m'y prends mal pour fermer mon classeur? Y-a-t'il quelque chose à rajouter?
    À première vue c'est la bonne méthode

    2) J'avais pensé opter pour un kill du processus. Mais est-ce aussi propre? Quel est le plus propre des 2?
    En fait, ce sont plutôt deux opérations complémentaires

    Quand tu disposes de tes objets dans ton code, tu libères des ressources dont tu n'as plus besoin et Windows devrait théoriquement terminer le processus Excel comme un grand. Mais, pour une raison que j'ignore, Excel, c'est une tête de cochon et il a souvent besoin de piqures de rappel


    C'est super efficace mais... Est-ce propre? Et lorsqu'une écriture dans le code survient avant la fermeture, est-ce que c'est risqué (genre perte de données si je brusque un peu trop la fermeture de la fenêtre)?
    Pour info, tout se fait en arrière plan, sinon je les fermerais moi-même.
    Tu peux toujours ajouter un délai avec un Timer.

    Directement dans ton classeur Excel, tu peux utiliser l'événement worksheet_beforeClose :

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
       ActiveWorkbook.Save
    End Sub

    Mais, comme je n'ai jamais essayé ce que cela donne en tuant Excel dans le gestionnaire de tâches, je peux juste dire que je pense que cela devrait marcher
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2018
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2018
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Aaah génial!

    Merci pour ta réponse! Désolé pour le retard de la mienne, la semaine a été un peu mouvementée, et je me retrouve avec un peu de retard dans ma réponse!

    Merci pour tes conseils, ça me rassure, je me demandais effectivement ce que je pouvais bien faire de travers! Donc d'autres que moi retrouvent ce côté "tête de cochon" comme tu l'as appelé. je vais essayer d'implémenter le timer + évènement, ça semble une super idée une bonne idée! Si ça tarde un peu trop, au moins ça lui coupera la chique!

    Merci mille fois! j'essaie ça, et du coup je fais le retour dans la foulée!

    Désolé pour mon retard

Discussions similaires

  1. [SP-2007] Ouvrir classeur Excel Service via Infopath
    Par HttpPointCom dans le forum SharePoint
    Réponses: 0
    Dernier message: 28/05/2009, 10h55
  2. Fermer un classeur Excel à la fin d'une macro
    Par alex830001 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2008, 19h29
  3. [OLE Excel] Fermer un classeur Excel
    Par Shuret dans le forum C++
    Réponses: 1
    Dernier message: 26/05/2008, 10h09
  4. Fermer le classeur Excel BD pour la fusion word
    Par sailor lvcv dans le forum VBA Word
    Réponses: 4
    Dernier message: 28/03/2007, 16h29
  5. Fermer les classeurs excel sauf celui actif
    Par Balian1412 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/10/2006, 10h35

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