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

C# Discussion :

Gérer une macro VBA dans un projet C#


Sujet :

C#

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Gérer une macro VBA dans un projet C#
    Bonjour à tous,

    Petit nouveau sur ce forum, je suis relativement débutant en C# étant donné que je l'ai découvert cette année en cours.

    Dans un projet, j'ai une macro en VBA contenue dans un fichier excel qu'on m'a fourni que je dois faire tourner à l'ouverture de mon projet C#. Cette macro mouline (traitement de données classique) et le résultat du traitement doit être envoyé dans un table faire pour dans la page principale do projet C#

    J'ai essayé de suivre plusieurs tutoriels , notamment http://msdn.microsoft.com/fr-fr/library/bb608613.aspx et http://msdn.microsoft.com/fr-fr/library/bb608604.aspx sans succès..

    SI quelqu'un a déjà été confronté au problème de faire tourner du code VBA dans un projet C# et de récupérer la sortie du script VBA pour l'injecter dans l'interface graphique C#, ça m'aiderai énormément.

    Merci d'avance de votre aide,

    Bien cordialement,
    Kaijin.

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ces liens concernent le processus inverse : appeler du code .Net depuis VBA.

    Te concernant c'est de l'automation qu'il te faut, ça te permettra de piloter une instance d'Excel : http://support.microsoft.com/kb/302084/fr
    Il me semble que la méthode que tu devras utiliser pour exécuter la macro est Run exposée par l'objet Application.

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Pragmateek, bonjour le forum.

    Avant tout merci pour votre réponse.

    J'ai déjà eu l'occasion l'année dernière de faire de l'automation pour piloter Excel depuis Access, ce n'est pas si loin. Je vais sur le lien que vous m'avez envoyé, fais quelques test, et reviens vers vous si j'ai d'autres questions qui viennent.

    Encore merci de votre aide, je pense être sur la bonne voie.

    Bien à vous,
    Kaijin.

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Re bonjour,

    Le lien que vous m'avez fourni m'a permis d'arriver à mes fins pour les macros Excel.
    Problème, j'ai découvert que la macro Excel qu'on m'a fourni ne peut fonctionner que si les fichiers cible de la macro était au préalable remplis par une autre macro, cette fois sous ACCESS.

    Inspiré de ce que j'ai vu, j'ai donc réalisé ceci:

    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
     
    using Access = Microsoft.Office.Interop.Access;
     
    namespace WpfApplication3
    {
            public MainWindow()
            {
                // Start a new instance of Access for Automation:
                Access._Application oAccess = new Access.Application();
     
                // Open a database in exclusive mode:
                oAccess.OpenAccessProject(
                   "C:\\Users\\15824_000\\Documents\\Supinfo B2\\stage centrale\\capitool mars\\Base de données.mdb");
            }
    }
    Problème, dans l'exécution de la simple ouverture du fichier Access, j'ai la plus déroutante des erreurs que j'ai pu voir jusqu'ici:
    An exception of type 'System.Runtime.InteropServices.COMException' occurred in WpfApplication3.exe but was not handled in user code

    Additional information: Désolé... Cette version d’Access ne prend plus en charge les projets de données Access.

    J'utilise Microsoft Visual Studio ultimate 2013 version 12.0.21005.1

    Auriez-vous une idée du pourquoi du comment?
    Dois-je installer visual studion 2010 ou une version encore antérieure pour dépasser cette erreur?
    Ou au contraire dois-je installer un pack office encore plus récent que celui que j'ai à l'heure actuelle, c'est à dire le pack Office 2013?
    Ou bien y a t-il une solution pour contourner totalement ce problème, en gardant le pack office 2013 et visual studio 2013 (option que je préfèrerai, celà permettra à l'application de continuer à tourner même si l'entreprise décide de changer de pack office pour aller vers du plus récent.)

    Merci d'avance de votre aide.

    Cordialement,
    Kaijin

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sûrement que ce n'est pas la bonne méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Open a database in exclusive mode:
    oAccess.OpenCurrentDatabase("C:\\Users\\15824_000\\Documents\\Supinfo B2\\stage centrale\\capitool mars\\Base de données.mdb");

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    L'appel de cette méthode ne provoque pas d'erreurs, l'interface graphique réalisée en xaml s'affiche correctement.
    Pour autant, access ne se lance pas. J'ai vérifié le chemin, il est correct.
    Auriez-vous une idée d'où pourrais provenir ce problème? Peut-être dois-je avoir access déjà lancé pour pouvoir appeler OpenCurrentDatabase?

    Merci encore.
    Kaijin

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sûrement lancé mais non visible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oAccess.Visible = true;

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je vois access qui se lance, puis instantanément après il se referme. Mon code est désormais comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Access._Application oAccess = new Access.Application();
     
                // Open a database in exclusive mode:
                oAccess.OpenCurrentDatabase("C:\\Users\\15824_000\\Documents\\Supinfo B2\\stage centrale\\capitool mars\\Base de données.mdb");
                oAccess.Visible = true;
    J'ai essayé de placer le oAccess.Visible = true juste après le Access._Application oAccess = new Access.Application(); sans changement.

    connaissez-vous le moyen de forcer le maintien ouvert d'access?
    Au passage, j'ai regardé dans l'explorateur de tâches, j'ai au bas mot 7 processus microsoft access qui tournent en ce moment même, certainement dus aux manipulations que j'effectue depuis ce matin.

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Concernant les processus Access qui tournent c'est sans aucun doute lié.

    Pour le problème de fermeture immédiate essaye de débugger pas à pas pour voir à quel moment il se ferme, sûrement à l'ouverture de la base.
    Si c'est le cas essaye d'ouvrir la base depuis une instance lancée manuellement.

    Je pense que c'est dû au fait que la base est lockée par un des autres processus Access.
    Donc kill les tous via le gestionnaire des tâches et relance ton traitement...

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Pragmateek, bonjour le forum.

    Je suis finalement arrivé à un résultat convenable. On arrive donc à ceci:

    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
    public MainWindow()
            {
                /*  Excel.Application eAPP = new Excel.Application();
                  Excel._Workbook eWB;
                  Excel._Worksheet eSheet;
                  Excel.Range eRng;
      */
     
                // Start a new instance of Access for Automation:
                Access._Application oAccess = new Access.Application();
                oAccess.Visible = true;
                // Open a database in exclusive mode:
                oAccess.OpenCurrentDatabase("C:\\Users\\15824_000\\Documents\\Supinfo B2\\stage centrale\\capitool mars\\Base de données.mdb");
                RunMacro(oAccess, new object[] {"test"});
     
                //on ouvre le fichier excel contenant la macro
                //eAPP.Workbooks.Open("C:\\Users\\15824_000\\Documents\\Supinfo B2\\stage centrale\\capitool mars\\modele.xlsb");
                //on lance la macro
                //eAPP.Run("GenereFichiers");
            }
     
            private void RunMacro(object oApp, object[] oRunArgs)
            {
                oApp.GetType().InvokeMember("Run",
                    System.Reflection.BindingFlags.Default |
                    System.Reflection.BindingFlags.InvokeMethod,
                    null, oApp, oRunArgs);
            }
        }
    Désormais ça tourne parfaitement et laisse place à l'interface graphique une fois ce code balayé.

    Encore merci pour votre aide.

    Cordialement,
    kaijin

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/04/2014, 15h04
  2. Executer une macro vba depuis un projet vb.net ?
    Par spookyz dans le forum VB.NET
    Réponses: 3
    Dernier message: 18/12/2010, 10h00
  3. Réponses: 10
    Dernier message: 18/04/2007, 17h17
  4. [VBA-E] Lancement d'une macro située dans un autre fichier
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/09/2006, 16h48
  5. [VBA] utiliser une macro contenue dans un autre classeur
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 01/02/2006, 18h46

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