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 :

Comment choisir la version d'Excel (2007/2010) que j'ouvre avec VBNet ?


Sujet :

VB.NET

  1. #1
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut Comment choisir la version d'Excel (2007/2010) que j'ouvre avec VBNet ?
    Bonjour,

    J'ai Office 2007 & Office 2010 installés sur mon poste.
    (si vous vous demandez pourquoi: j'ai besoin de maintenir des macros VBA dans les 2 environnement d'Office)

    Dans mon projet codé en VBNet (projet WPF sous environnement Visual Studio Community 2013), j'ai bien fait référence à Microsoft Excel 12.0 Object Library (qui correspond à la version 2007) et pas à Microsoft Excel 15.0 Object Library (qui correspond à la version 2010).

    Pourtant quand j'ouvre Excel,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objExcel = New Microsoft.Office.Interop.Excel.Application
    c'est Excel 2010 qui est utilisé et pas 2007!!!

    Comment faire pour ouvrir une occurrence d'Excel dans la version désirée ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    dans vba il existe une méthode CreateObject qui permet d'ouvrir une session Excel sans préciser sa version.
    il te faut l'écrire en vb.net et là plus besoin des références Excel!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim OngExcel as Object =CreateObject("Excel.Application")
    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
    Edit: a vrai dire j'ai pas bien lue ta question, j'ai répondu pour n'importe quelle version pas de choisir 2007 ou 2010!

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 339
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 339
    Points : 1 955
    Points
    1 955
    Par défaut
    Au lieux de créer une nouvelle instance d'excel, tu peux lancer la version d'Excel qui t'interresse, puis obtenir l'instance existante.

    En VBA cela donne quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim oXl as Object
     
    Call Shell("C:\Program Files\Microsoft Office\Office12\Excel.exe")
        '// GetObject == obtient instance active
        '// CreateObject == crée une nouvelle instance
    set oXl = GetObject("Excel.Application")
    A toi de traduire en .NET

  4. #4
    Invité
    Invité(e)
    Par défaut
    GetObject n'existe pas en VB.net il faut l'implémenter en invoquant marshal!
    Mais la on est largement sorti du cadre de ce forum!
    Code exemple c# : 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
    32
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
     
    namespace WindowsFormsApplication1
    {
        public class CreatGetObject
        {
            public dynamic GetObject(String App)
            {
     
                try
                {
                    return (dynamic)Marshal.GetActiveObject(App);
                }
                catch
                {
                    return (dynamic)CreateObject(App);
                }
     
            }
            public dynamic CreateObject(string app)
            {
                dynamic AppType = Type.GetTypeFromProgID(app);
                dynamic ApplInst = Activator.CreateInstance(AppType);
                return ApplInst;
            }
        }
    }
    Dernière modification par Invité ; 03/02/2015 à 17h51.

  5. #5
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Merci deedolith et rdurupt pour vos réponses, mais je n'ai toujours pas la solution

    Effectivement, CreateObject fonctionne bien sous vbnet, mais pas GetObject.

    Je lance donc Excel 2007 via CreateObject(),
    Puis j'essaye de récupérer l'instance avec Marshal.GetActiveObject().
    Test effectué sur un poste Windows Seven avec Office 2007 & 2013 installés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim objExcel As Microsoft.Office.Interop.Excel.Application
    Call Microsoft.VisualBasic.Interaction.Shell("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe")
    objExcel = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
    Le problème est le suivant:
    CreateObject lance bien une occurrence d'Excel 2007
    Par contre Marshal.GetActiveObject("Excel.Application") recherche impérativement une occurrence d'Excel 2013.

    Conclusion:
    Si Excel 2013 n'est pas lancé, Marshal.GetActiveObject("Excel.Application") génère une erreur
    Si Excel 2013 est lancé, Marshal.GetActiveObject("Excel.Application") récupère l'occurrence Excel 2013
    ==> Je n'arrive jamais à récupérer l'occurrence d'Excel 2007 !!!

    Avez-vous une solution ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Marshal.GetActiveObject("Excel.Application") te récupéré une l'occurrence actuelle et comme tu as exécuté sans doute plusieurs test!!!

    Tu devrais aller sur le forum vb.net car là tu programme en vb6 et pas en dotnet. De plus tu devras implémenter la méthode dispose.

    Marshal ne lance pas Excel mais récupère la version active tu as sans doute plusieurs
    Excel de chargé en mémoire d'ou le dispose!\

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,
    Citation Envoyé par Golard Voir le message
    ...

    Avez-vous une solution ?
    Je ne pense pas que la cohabitation de plusieurs versions d'office sur une même machine soit bien "viable" ... utilise une machine virtuelle par versions d'excel ...

  8. #8
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    (...)Marshal ne lance pas Excel mais récupère la version active (...)
    Oui Marshal.GetActiveObject("Excel.Application") est censé récupérer la version active d'Excel,
    mais si 2 versions d'office sont installées sur le même poste (2007 & 2013), il veut impérativement récupérer la version la plus récente.

    Si la seule instance lancée est en version 2007, Marshal.GetActiveObject("Excel.Application") ne fonctionne pas !

    Citation Envoyé par rdurupt Voir le message
    (...)Tu devrais aller sur le forum vb.net car là tu programme en vb6 et pas en dotnet. (...)
    Je programme bien en vbnet sous Microsoft Visual Studio "Community 2013" !

    Citation Envoyé par bbil Voir le message
    Bonjour,
    Je ne pense pas que la cohabitation de plusieurs versions d'office sur une même machine soit bien "viable" ... utilise une machine virtuelle par versions d'excel ...
    Effectivement, tu as raison, mon problème vient de là !
    Malheureusement, j'ai "bêtement" installé la version 2013 en plus de la version 2007...
    Je suis d'accord de désinstaller la version 2007 pour la réinstaller sur une "machine virtuelle", mais je ne sais pas comment m'y prendre
    Est-ce facile à réaliser ? Peux-tu m'indiquer un lien pour créer le plus simplement possible cette fameuse machine virtuelle ?
    Faudra-t'il que je réinstalle Microsoft Visual Studio et tous mes autres programmes sur la machine virtuelle, juste pour effectuer des tests sous Office 2007 ?

    Merci d'avance pour vos réponses ...

    PS: Un modérateur pourrait-il déplacer mon post dans le forum Vbnet ? Il serait peut-être mieux placé...

  9. #9
    Invité
    Invité(e)
    Par défaut
    ici tu invoque vb6 explicitement!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Microsoft.VisualBasic.Interaction.Shell("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe"

  10. #10
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    ici tu invoque vb6 explicitement!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call Microsoft.VisualBasic.Interaction.Shell("C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe"
    Mon code était initialement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objExcel = New Microsoft.Office.Interop.Excel.Application
    J'ai essayé le code proposé par Deedolith pour essayer de "forcer" mon application à utiliser Excel 2007 au lieu de 2013 ...

    Malgré tout, ce code fait parti d'un module .vb de mon projet WPF-VBnet.

  11. #11
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 167
    Points
    10 167
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je n'ai pas deux versions d'Office pour tester, et je ne promets rien, mais on ne sait jamais.

    Si tu as les Primary Interop Assemblies d'Office 2013 et d'office 2007 sur ta machine, tu peux essayer de mettre ceux de 2007, au lieu de ceux de 2013 dans tes références. Ou bien si, dans l'onglet COM de la boîte de dialogue des références, tu as les 2, celles de 2007, et celles de 2013, (c'est à vérifier, je ne sais pas si l'installation de 2013 enlève les références à 2007) établis tes références à Excel/office directement dans cette boîte à la place des références pré-ajoutées. Ou bien, cliques sur le bouton parcourir et prends l'Excel.exe de 2007, s'il existe toujours. Si tu as de la chance, cela pourrit peut-être marcher. Mais là, tu risques d'avoir besoin de deux solutions différentes.

    Si je me fie à une expérience que j'ai faite dans le passé, les références avec les PIA 2013 devraient fonctionner indifféremment avec 2002, 2003, 2007, 2010 et 2013. Mais l'inverse n'est pas vrai.

  12. #12
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Bonjour clementmarcotte,

    J'ai bien le choix entre les 2 versions d'excel quand j'ajoute la référence au projet.
    J'ai donc fait référence à Microsoft Excel 12.0 Object Library (qui correspond à la version 2007), mais ça n'empêche pas l'appli de créer des instances de la version 2013 ...!!!

    Voici mes références actuelles:
    Nom : 1031-ReferenceNouvelleListe_.png
Affichages : 1641
Taille : 20,9 Ko

    Et le détail de la références à Excel:
    Nom : 1020-ReferenceAjoutExcel12_.png
Affichages : 1606
Taille : 76,0 Ko

    D'autres idées ?
    Ou bien la solution est-elle d'avoir une machine virtuelle pour faire tourner exclusivement 2007 comme le proposait plus haut bbil ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    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
    import System
    Import System.Collections.Generic
    Import System.Linq
    Import System.Text
    Import System.Runtime.InteropServices
     
    Dim crObj as CreaObj=new CreaObj
     
     dim ExcelApp2007 as object=crObj.CreateObject("Excel.Application.12")
     
    Dim ExcelApp2010 as object = crObj.CreateObject("Excel.Application.14")
     
    Dim ExcelApp2013 as object = crObj.CreateObject("Excel.Application.15")
     
     
        public class CreaObj
            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
    End class
    Dernière modification par Invité ; 09/02/2015 à 22h58.

  14. #14
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Merci rdurupt pour cette proposition !

    Ça aurait vraiment été bien de pouvoir préciser en entrée d'une fonction la version d'Excel que l'on souhaite instancier...

    Malheureusement, ça ne fonctionne pas. C'est toujours la version la plus récente du poste qui est créée (dans mon cas, que je précise ".12" pour 2007 ou ".15" pour 2013, c'est toujours la version 2013 qui est instanciée).

    Merci quand même

    Je conclue pour l'instant qu'il n'est pas possible de choisir la version d'excel à ouvrir sous avec VBNet (la discussion n'étant pas propre à VBNet mais à automation sous .Net)

    Pour info, je me dirige donc naturellement vers l'utilisation d'une machine virtuelle dédiée à Office 2007.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'avoue que je n'ai pas installé une version autre que 2007 sur ma machine,car je n'allais pas me tirer une balle dans le pied.

    Avec Excel.application.12 2007 ce lançait bien,avec Excel.application14 ou 15 Excel me disait le contrôle activex n'a pas été créé.

    Je me suis di cool ��. Mais

  16. #16
    Membre actif
    Avatar de Golard
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 288
    Points : 289
    Points
    289
    Par défaut
    Article complet sur le sujet ici: http://golard.developpez.com/tutorie...curence-excel/

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

Discussions similaires

  1. [XL-2010] Comment choisir la version d'Excel (2007/2010) que j'ouvre avec VBNet ?
    Par Golard dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 05/02/2015, 10h28
  2. Réponses: 0
    Dernier message: 24/09/2007, 11h56
  3. Réponses: 1
    Dernier message: 23/05/2006, 17h08
  4. [VB][BO] Comment choisir la version ?
    Par pc75 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 23/05/2006, 17h07
  5. Comment recupérer la version d'Excel avec VBA ?
    Par ikoto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/09/2005, 18h51

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