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

Développement Windows Discussion :

VB.NET et Excel - comment (et où dans le code) fermer correctement excel?


Sujet :

Développement Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    33
    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 : 33
    Par défaut VB.NET et Excel - comment (et où dans le code) fermer correctement excel?
    Bonjour!

    Je suis (assez) débutant en VB.net et, bien que je me sorte plutôt bien des choses les plus simples, j'avais une question à poser et espère que vous pourrez m'aidez!

    Déjà, j'espère avoir posté ma question au bon endroit et espère ne pas faire redite avec de multiples sujets! Voila:
    Je suis en train de programmer une petite appli pour gérer les oublis de matériel de mes élèves (je suis enseignant). Celle-ci s'appuie sur un document excel: une première feuille récapitule les classes et les élèves les composant, puis il y a une feuille par classe où le nom de chaque élève se trouve en tête de colonne.

    Pour faire simple: lorsque l'utilisateur clique un bouton, l'application inscrit une remarque concernant un oubli pour l'élève en question. Bref, ce que je veux dire, c'est que mon appli gère un classeur excel de manière automatique


    J'ai bien compris la base:
    - je déclare la référence à Excel
    - En tête de code je déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'IMPORTS EXCEL
    Imports System.Data.OleDb
    Imports Excel = Microsoft.Office.Interop.Excel
    Le blabla habituel dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim MyExcel As New Excel.Application
        Dim wbExcel As Excel.Workbook 'Classeur Excel
        Dim wsExcel As Excel.Worksheet 'Feuille Excel
    J'ouvre mon classeur et en fais ce que je veux (ici, il récupère l'adresse du fichier dans un fichier texte)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     'Ouverture du fichier excel
    wbExcel = MyExcel.Workbooks.Open(lines(1))
     
    'compte les colonnes de la feuille 1
    Dim NbColonnes = MyExcel.Sheets(1).UsedRange.Columns.count()
    MyExcel.Visible = False
     
    If NbColonnes <> 0 And MyExcel.Application.Sheets(1).Cells(1, 1).value <> "" Then
     
    CheckBox5.Checked = True
    ClasseCréée = 1
    Etc, etc... Tout ça, ça va. Ma question c'est: quel est le meilleur moment pour le fermer??? Cela me mystifie. Cela me mystifie car en général, je ferme avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyExcel.Quit()
    MyExcel = Nothing
    wbExcel = Nothing
    wsExcel = Nothing
    Cela marche, mais comme mon appli est constituée de plusieurs Form, elle switche de l'une à l'autre et je me retrouve souvent avec des erreurs. Exemple: l'utilisateur rentre sur une form (ex: la form "gestion de classe" - qui ouvre le classeur excel pour vérifier le nombre de classes), ressors sans rien changer( et se retrouve sur la "form principale" après fermeture d'excel) et finalement retourne sur la forme "Gestion de classe")...Et la BIM. Une erreur du type wbExcel non déclaré ou ne revoie à rien.

    D'où ma question: quelle est la meilleur façon de fermer? Où demander la fermeture du classeur? Et surtout quoi garder? Je me suis apperçu que lorsque je ne garde que MyExcel.Quit(), cela va souvent mieux. Quelle différence alors avec "MyExcel.Workbooks.close()"? Et quand utiliser MyExcel = Nothing/wbExcel = Nothing/wsExcel = Nothing??? Souvent, je me disais que je pouvais bien utiliser ces lignes là en me disant que si je repassais derrière un peu plus loin où en relançant un évènement dans lequel ma routine repassait par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim MyExcel As New Excel.Application
    Dim wbExcel As Excel.Workbook 'Classeur Excel
    Dim wsExcel As Excel.Worksheet 'Feuille Excel
    maie en fait, cela génère plus d'erreurs qu'autre chose...

    Voila donc ma question... Quoi utiliser exactement, et quand??? Mon code fait si souvent appel à mon classeur excel dans de si nombreuses forms qu'au final je m'étais demandé s'il ne serait pas plus judicieux de l'ouvrir en début de code (genre avec une routine dans un module) pour au final ne le fermer définitivement que quand l'utilisateur ferme l'appli. je n'ai pas essayé, je ne sais même pas si cela marcherait ou non. Ce qui est sûr c'est que cette histoire d'ouverture/fermeture me pose bien des soucis. J'apprends en autodidacte et, bien qu'arrivant toujours à mes fin, je me demandais si quelqu'un pouvait m'expliquer une fois pour toutes comment m'y prendre pour faire les choses proprement. Que dois-je utiliser... Et où

    Désolé pour la longueur de mon post... J'ai essayé d'être le plus clair possible. Merci par avance de votre aide!!

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Pour un début d'élément de réponse, quand tu fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dim MyExcel As New Excel.Application
    Tu créés un objet en mémoire.

    Et quand tu fais ça :

    Tu appelles la méthode Quit() de ton objet.

    En revanche, quand tu fais ça :

    Tu supprimes l'objet en mémoire.

    La mauvaise gestion de la durée de vie de ton objet peut alors te poser problème.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    33
    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 : 33
    Par défaut
    Aaaah d'accord!

    Donc en fait si je fais juste
    , je pourrais toujours le ré-ouvrir par la suite, c'est ça?

    Comme tu dis, je pense que je gère mal la durée de vie de mon objet. De manière imagée, (avec mes mots de semi-profane) c'est un peu comme masquer un Form avec "Hide" et le faire réapparaitre avec "Show", non? Il est fermé mais... encore ici et accessible, prêt à être réouvert en quelques sortes.

    Le "MyExcel = Nothing", il faut l'utiliser mais vraiment en toute fin (en fermeture de l'appli par exemple) si j'ai bien suivi l'idée... Sinon, mon objet part en fumée, non?

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par chimere28 Voir le message
    De manière imagée, (avec mes mots de semi-profane) c'est un peu comme masquer un Form avec "Hide" et le faire réapparaitre avec "Show", non? Il est fermé mais... encore ici et accessible, prêt à être réouvert en quelques sortes.
    C'est exactement ça !

    Citation Envoyé par chimere28 Voir le message
    Le "MyExcel = Nothing", il faut l'utiliser mais vraiment en toute fin (en fermeture de l'appli par exemple) si j'ai bien suivi l'idée... Sinon, mon objet part en fumée, non?
    Là il y a deux possibilités. Soit :
    - Tu créé ton objet (MyExcel = New Excel.Application) à la demande puis tu le détruit (MyExcel = Nothing) dès que tu as fini ton traitement. Autrement dit, tu vas le créer à chaque fois que tu en aura besoin dans ton application, donc plusieurs fois
    -Tu créé ton objet une seule fois et le détruit avant de quitter ton application.

    Pour ma part je préfère la première solution. Grosso modo, tu as une procédure qui déclare ton MyExcel (Dim MyExcel), l'instancie ( = New Excel.Application), l'utilise (le bout de code que tu proposais dans le premier poste) puis tu le détruis.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2018
    Messages
    33
    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 : 33
    Par défaut
    Rho! J'y vois quand même sacrément plus clair d'un seul coup! J'adore la programmation, et ce petit quelque chose sur quoi je bosse va drôlement me simplifier la vie l'an prochain, mais là sur le coup j'ai bien cru que j'allais passer mon PC par la fenêtre!! Merci mille fois! Tu as su m'expliquer clairement en quelques phrases ce après quoi je me battais depuis maintenant plusieurs semaines (et pourtant, j'ai fouillé le net!).

    Je pense que je vais opter comme toi pour la première solution car au vu de ce que j'en fais je pense que ce sera plus simple!

    Merci encore pour tout! Je t'envoie des e-lauriers pour la peine!!

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

Discussions similaires

  1. Erreur de compilation dans le code VBA d'excel
    Par wroom69 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/11/2015, 16h46
  2. [Débutant] Comment utiliser List dans mon code
    Par solaar dans le forum C#
    Réponses: 2
    Dernier message: 02/04/2013, 13h07
  3. comment utiliser engOutputBuffer dans un code C++
    Par DANIA511 dans le forum MATLAB
    Réponses: 0
    Dernier message: 01/01/2013, 23h02
  4. Réponses: 4
    Dernier message: 30/06/2011, 13h12
  5. comment utiliser HASMOREPAGE dans ce code?
    Par peace-to-you dans le forum VB.NET
    Réponses: 7
    Dernier message: 07/03/2010, 09h42

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