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 et Excel - Eviter des instances multiples [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut VB.net et Excel - Eviter des instances multiples
    Bonjour, je travaille depuis peu sous VB 2010 Express et j'essaye de l'utiliser pour manipuler des données dans des classeurs Excel.

    Je cherche actuellement, à partir d'un exécutable créé en VB.net, à ouvrir un fichier Excel (non visible), pour copier les informations dont l'utilisateur a besoin dans un nouveau fichier (visible ensuite).

    Après quelques recherches, j'arrive donc :
    - A ouvrir le classeur contenant les données en le gardant invisible,
    - A créer un nouveau classeur puis à y coller les informations nécessaires,
    - A refermer le classeur contenant les données,
    - A rendre visible le nouveau classeur.

    Tout fontionne à la perfection, mais le soucis survient lorsque j'essaye de faire la même chose lorsqu'un classeur Excel est déjà ouvert (même un n'ayant rien à voir avec ceux concerné).

    Car en effet, pour ouvrir le classeur de données, il me semble que je suis obligé de créer une nouvelle instance d'Excel.

    Si aucun classeur n'était ouvert auparavant, refermer le nouveau classeur termine cette instance. Mais si une instance existait déjà (suite à l'ouverture au préalable d'un classeur), une deuxième instance est créée, et c'est cette deuxième qui est terminée lorsque l'on ferme tous les fichiers ouverts.

    Il reste donc une instance non fermée...

    L'un de vous aurait une idée de comment résoudre ce problème? (tout en sachant que je ne souhaite pas sauvegarder le nouveau classeur créé)

    En espérant avoir été clair dans mes explications. ^^

  2. #2
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Bonjour,
    Tu trouvera un tuto microsoft sur le site pour exporter des données excel sans avoir à ouvrir le fichier , en te connectant tel une Base de donnée.
    https://support.microsoft.com/fr-fr/kb/257819/fr
    un modèle sur le blog suivant

    http://blog.developpez.com/lilroma/p...lle_excel_vers

    cdt

  3. #3
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Tout d'abord, merci pour ta réponse!

    Mais je ne pense pas que le datagridView soit une solution adéquate pour ce que je veux faire.

    Le but est de récupérer des informations se trouvant sur une feuille Excel pour ensuite en donner certaines à l'utilisateur via une autre feuille Excel.

    Ceci pour qu'il puisse faire ensuite ce qu'il veut avec les données.

    Or, même si j'utilisais donc l'option décrite pour récupérer les données, il me faudrait ensuite tout de même créer la nouvelle feuille Excel, ce qui ouvrirait quand même une nouvelle instance Excel.

  4. #4
    Membre éclairé
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 479
    Par défaut
    Re,
    Rien ne t'oblige de faire afficher dans une datagridview une fois importée les données de la feuille seront stockés de toute manière dans la table 0 du dataset.

    Après tu peux créer une feuille excel et redistribuer ces données comme bon il te semble comme une BDD.


    Cdt

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut que tu libère la session (dispose)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AppXls.quitte 
    GC.SuppressFinalize(AppXls)
    AppXls = nothing

  6. #6
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Ashireon, ce que je veux dire, c'est que le problème d'instances Excel sera donc le même car dans les deux cas (en utilisant le dataset ou non) j'aurai une nouvelle instance vu que je dois créer une feuille Excel.

    rdurupt, merci également pour ta réponse. Je ne pourrai faire le test que mardi, de retour au travail.
    Mais une question me vient d'emblée : Est-ce que le "AppXls.quit" ne va pas fermer mon nouveau classeur (voir même des classeurs ouverts par l'utilisateur) ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'ai sens doute pas bien compris la question!
    Si tu as ouvert une session Excel tu peux l'utiliser pour ouvrir autant de casseur que te veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Classeur1 = AppExls.workboocks.add
    Classeur2 = AppExls.workboocks.add
    Classeur3 = AppExls.workboocks.add
    Tu peux créer ta session Excel pour ton traitement et utiliser en masqué sens gêner l'utilisateur!

    Si tu veux utiliser la session ouverte par utilisateur il faut regarder Marshal (interopérabilité)!

  8. #8
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Je vais essayer d'être plus clair car je vois bien que je n'ai pas réussi. ^^

    Ce que j'aimerai, c'est qu'une fois que le nouveau classeur (créé en vb.net) est fermé par l'utilisateur, il ne reste pas une instance d'Excel d'ouverte.
    Ou, si on prends dans l'autre sens, j'aimerai savoir s'il est possible de créer un classeur Excel en vb.net en ne créant pas une nouvelle instance Excel si il y en a déjà une qui existe.

    Car j'ai l'impression que même si une instance est déjà ouverte antérieurement au lancement du programme vb.net, celui ci est obligé de créer une nouvelle instance.
    Ce qui fait qu'il y a deux instances d'ouvertes, et je ne peux pas en fermer une dans le code car le classeur Excel doit rester ouvert.

    Qu'est-ce que Marshal? Je n'en n'ai jamais entendu parler.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Quand tu créé une instance d'objet tu dois informer .net il peut en disposer et décharger l'instance de la mémoire c'est la méthode dispose dont j'ai parlé plus haut!

    En vb6 il existe la méthode getobject qui permet de référencer un variable sur un objet Excel par exemple.
    Et la méthode creatobject qui permet créer une novelle instance d'Excel.

    Ces deux méthodes n'existe pas en vb.net mais il est fort possible de les implémenter et la c'est la méthode marshal de vb.net qui s'en charge!

    Je suis sur un téléphone portable et difficile implémenter et de tester!

  10. #10
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Bonjour tout le monde. Je reviens donc vers ce sujet!

    J'ai regardé un peu "Marshal" et, à moins que je sois passé à côté de quelque chose, je ne pense pas qu'il puisse me permettre de résoudre mon problème. (c'est à dire de créer un classeur Excel en utilisant une instance Excel déjà ouverte s'il y en a une, ou en en créant une nouvelle dans le cas contraire)

    Quelqu'un voit si je suis passé à côté de quelque chose d'évident? Ou si vous avez une autre solution!

    Merci d'avance.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Une piste, pour savoir si Excel est lancé :
    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
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            MsgBox(ExceOuvert("Excel.exe"))
     
        End Sub
     
        Function ExceOuvert(ByVal NomProg As String) As Boolean
     
            Dim Win As Object
            Dim P As Object
     
            Win = GetObject("winmgmts:root\cimv2")
     
            For Each P In Win.ExecQuery("SELECT * FROM win32_process")
     
                If UCase(P.Name) = UCase(NomProg) Then Return True
     
            Next
     
            Win = Nothing
     
        End Function
    Hervé.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    avec la loie Marshal!

    ça te retourne la session Excel si ouverte si non en ouvre une!
    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
    Imports System.Runtime.InteropServices
    public sub Test
    dim Xls as object = GetObject("Excel.Application")
    end sub 
     Public Function GetObject(ByVal App As String) As Object
            Try
                Return Marshal.GetActiveObject(App)
            Catch ex As Exception
                Return CreateObject(App)
            End Try
     
        End Function
     
        Public Function CreateObject(ByVal app As String) As Object
            Dim AppType As Object = Type.GetTypeFromProgID(app)
            Dim ApplInst As Object = Activator.CreateInstance(AppType)
            Return ApplInst
        End Function
    attention si les méthode GetObject et CreatObject fonctionnent dans ton application, c'est que les librairies VB6 sont cochées! Car elles n'existent pas en.net!

    C'est pour cela que je les ai implémenter.
    Dernière modification par Invité ; 24/03/2015 à 17h53.

  13. #13
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Merci à vous!

    Je teste puis je reviens vers vous indiquer si tout fonctionne (et mettre ainsi le sujet comme résolu).

  14. #14
    Membre averti
    Homme Profil pro
    Employé
    Inscrit en
    Juillet 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Employé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 38
    Par défaut
    Tout marche impeccablement!!

    Encore merci pour l'aide.

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

Discussions similaires

  1. Recherche à travers des instances multiples de Word
    Par Akisax dans le forum Général VBA
    Réponses: 4
    Dernier message: 07/02/2014, 11h34
  2. Réponses: 0
    Dernier message: 20/07/2009, 11h57
  3. [VB.NET] [VS 2003] Liste des objets instanciés
    Par Mouse dans le forum VB.NET
    Réponses: 4
    Dernier message: 23/10/2006, 19h15
  4. Réponses: 5
    Dernier message: 17/07/2006, 18h34
  5. [VB.NET][Excel] utiliser des fonction Excel comme xlToRight
    Par Alexj51 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2006, 12h10

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