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

VB.NET Discussion :

VB.NET Problème pour fermer un fichier Excel déja ouvert


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut VB.NET Problème pour fermer un fichier Excel déja ouvert
    Bonjour,


    J'ai créer une petite application VB.NET qui ouvre un fichier Excel (Listing.xlsx) qui sert de modèle.

    Je travaille avec VisualStudio 2010 et Excel version 2108 Microsoft 365.

    C'est un tableau avec uniquement des titres dans la première ligne.

    Comme je ne souhaite pas modifier ce fichier, j'utilise une boite de dialogue pour enregistrer une copie de celui-ci avec un nouveau nom (New_Listing.xlsx) en laissant également la possibilité de choisir l'emplacement.

    Mon script rempli le tableau et lorsqu'il est terminé, celui-ci s'affiche.

    Tout fonctionne sauf dans un cas, c'est si jamais l'utilisateur a lancé une première fois le script, que le fichier "New_Listing.xlsx" reste ouvert et qu'on relance le script.

    Comme le fichier est ouvert, je ne parviens pas à l'écraser.

    Donc juste avant de faire le "save as", j'ai ajouté une ligne pour fermer un eventuel fichier "New_Listing.xlsx" qui serait toujours ouvert.

    J'ai rajouté un Try au cas où ce fichier doublon n'existerait pas mais j'ai une erreur sur cette nouvelle ligne où je tente de fermer le fichier ouvert.

    Sur un forum, j'avais trouvé une idée intéressante, c'est d'utiliser la fonction kill, mais çà ne marche pas, je suppose que le kill efface le fichier uniquement si il n'est pas ouvert.

    J'ai l'impression que le MsExcel est uniquement associé au fichier de départ "Listing.xlsx" et que l'utiliser pour aller lire un autre fichier n'est pas possible mais je ne comprends pas comment faire.


    Voici mon code :

    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
    29
    30
    31
     
     
            MsExcel = CreateObject("Excel.Application")
            MsExcel.DisplayAlerts = False
            Using sfd As SaveFileDialog = New SaveFileDialog() With {.InitialDirectory = "c:\users\" & Environment.UserName & "\Documents\", .FileName = "New_Listing", .Filter = "Excel Workbook|*.xlsx"}
     
                If sfd.ShowDialog() = DialogResult.OK Then
     
                    Try
                        MsExcel.Workbooks(sfd.FileName).close(False)  'Bug sur cette ligne
                    Catch ex As Exception
                    End Try
     
                    MsExcel.workbooks.Open(Application.StartupPath & "\Listing.xlsx")
                    MsExcel.Workbooks(1).SaveAs(sfd.FileName)
     
                Else
     
                    MsExcel.quit()
                    Exit Sub
     
                End If
     
            End Using
            MsExcel.DisplayAlerts = True
     
    '
    ' Remplissage du tableau
    '
     
            MsExcel.visible = True

    Quelqu'un peut-il m'aider ?
    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    CreateObject va créer une nouvelle instance sur laquelle le document que tu essaies de fermer n'existe pas.
    Pour récupérer l'instance existante, il faut utiliser GetObject

    Sauf que ce n'est pas aussi simple car GetObject va renvoyer la première instance qui a été lancée.
    Ce qui signifie que si plusieurs instances sont lancées tu n'est pas certain de tomber sur celle qui t'intéresse.
    Il faut donc fermer l'instance et refaire un GetObject et répéter ces deux opérations tant que tu n'es pas sur la bonne instance.

    Et là encore, ce n'est pas aussi simple car GetObject va planter s'il n'y a pas (ou plus) d'instance d'Excel déjà lancée.
    Il faut donc encapsuler le GetObject dans une gestion d'exception et réaliser un CreateObject en cas d'erreur.

    EDIT :
    Ceci devrait t'aider (notamment l'exemple à la fin)
    https://docs.microsoft.com/fr-fr/off...bject-function

  3. #3
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut VB.NET Problème pour fermer un fichier Excel déja ouvert
    Bonjour Popo et un grand merci pour ces explications.

    En effet, il peut y avoir d'autres fichiers ouverts que je ne dois pas fermer.

    J'étais en train d'essayer le paramètre "shell" mais pour l'instant sans succés.

    Je n'ai pas encore tenté la fonction GetObject, je vais donc déja faire une boucle pour essayer d'identifier toutes les instances ouvertes.

    Par contre, je ne comprends pas pourquoi repasser par un CreateObject en cas d'erreur, un try si on ne trouve rien ne marchera pas ?

    Comme mon problème c'est de fermer un fichier Excel ouvert pourquoi devoir recréer une nouvelle instance ?

    Merci d'avance.

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    GetObject te renverra toujours la première instance d'excel.
    Si ce n'est pas cette instance qui contient ton fichier, tu ne pourras pas le fermer.

    Il faut repasser par un CreateObject dans le cas où GetObject renvoie une erreur sinon, tu ne pourras pas faire ton SaveAs...

    Regarde l'exemple à la fin de cette page.
    https://docs.microsoft.com/fr-fr/off...bject-function

  5. #5
    Membre averti
    Homme Profil pro
    Technicien d'essai
    Inscrit en
    Avril 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien d'essai
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 61
    Par défaut VB.NET Problème pour fermer un fichier Excel déja ouvert
    Merci pour cet exemple très complet, je vais m'en inspirer pour mon problème de fichier ouvert !

Discussions similaires

  1. [XL-2016] Problème pour fermer un fichier Excel
    Par Bemirdor dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/04/2019, 10h06
  2. Réponses: 5
    Dernier message: 23/04/2016, 22h55
  3. Réponses: 3
    Dernier message: 05/02/2010, 16h09
  4. Problème pour lire un fichier EXCEL
    Par baloo81 dans le forum Modules
    Réponses: 12
    Dernier message: 17/07/2008, 15h21
  5. [VB.NET] problème pour piloter une appli. excel 2003
    Par Pynuch dans le forum Windows Forms
    Réponses: 13
    Dernier message: 16/11/2005, 13h02

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