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 :

Ajout de formules dans Excel via un Add-In C#


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut Ajout de formules dans Excel via un Add-In C#
    Bonjour à tous,

    J'aimerai développer un Add-In pour Excel qui ajoute de nouvelles formules à ma feuille de calcul. Par exemple, j'aurai besoin que l'utilisateur puisse taper, depuis n'importe quelle cellule Excel : =maFonction(param1, param2), et que maFonction soit exécutée.

    Je l'ai déjà fait facilement avec des scripts VBA, mais là j'aurai besoin de le faire impérativement depuis un Add-In programmé en C#. Quelqu'un sait-il comment faire ? Mes recherches Google ayant été infructueuses, je me tourne vers vous ...


    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range cells = workSheet.Range[CHOISIR LA CELL COURANTE];
    cells.FormulaR1C1 = "=FORMULA...";

  3. #3
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par alavoler Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range cells = workSheet.Range[CHOISIR LA CELL COURANTE];
    cells.FormulaR1C1 = "=FORMULA...";
    Apparemment le code doit etre fait avec Visual Studio.

    Connais-tu VSTO? (a moins que ce soit ce que tu appelle AddIn): http://msdn.microsoft.com/en-us/office/hh133430.aspx
    C'est le seul outils a ma connaissance qui puisse faire ce genre de chose.
    Si personne ne répond pose ta question sur le forum MSDN section VSTO, tu auras ta réponse rapidement.

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour vos réponses, mais j'ai fini par m'en sortir en procédant autrement.

    J'ai utilisé un .dbml pour appeler facilement ma procédure stockée via un DataClassesDataContext.
    Puis j'ai transformé ma variable var en dataTable en utilisant : http://www.c-sharpcorner.com/uploadf...o-a-datatable/
    Enfin j'ai affiché le contenu du dataTable dans Excel en adaptant : http://faqvbnet.developpez.com/?page...dgrid_to_excel

    Si ça peut servir à d'autres

  5. #5
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Ikki_2504 Voir le message
    Bonjour,

    Merci pour vos réponses, mais j'ai fini par m'en sortir en procédant autrement.

    J'ai utilisé un .dbml pour appeler facilement ma procédure stockée via un DataClassesDataContext.
    Puis j'ai transformé ma variable var en dataTable en utilisant : http://www.c-sharpcorner.com/uploadf...o-a-datatable/
    Enfin j'ai affiché le contenu du dataTable dans Excel en adaptant : http://faqvbnet.developpez.com/?page...dgrid_to_excel

    Si ça peut servir à d'autres
    Merci de ne pas etre parti comme un voleur apres avoir trouvé ta solution

    Mais si c'est juste ca pourquoi ne fait tu pas simplement une "Connexion a une base de données" dans Excel, tu n'a rien a faire a part 2 ou 3 clics. Cela ne correspond pas a tes besoins?

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    En effet, il existe une fonctionnalité native dans Excel qui permet de faire exactement ce que je veux.

    Mais pour ça, l'utilisateur a quelques clics à faire. En plus, mon client n'a pas la moindre idée de ce qu'est une procédure stockée, ni de comment rajouter / remplacer des paramètres. Disons qu'on voulait faire quelque chose qui soit vraiment le plus simple possible pour l'end-user.

    Quand on veut faire de la qualité jusqu'au bout ... On en bave, mais c'est instructif =)

  7. #7
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Ikki_2504 Voir le message
    Mais pour ça, l'utilisateur a quelques clics à faire.
    Non pas besoin, tu ouvres un document Excel, tu fait ta connexion et tu peux spécifier a Excel:
    - Actualiser toutes les données a l'ouverture du classeur.
    - Mettre a jour la base de données en temps réel.

    A l'époque j'avais du fait des tas de statistique graphique sur une base de données.
    Pour ne pas passer 10 ans a faire cela et pour permettre aux utilisateurs d'extraire, mettre a jour les données ou changer la mise en forme du graphique (presque tout le monde sait le faire ca), j'avais utilisé un document type sous Excel.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Ce que tu as fait est exactement ce que je dois faire aujourd'hui.

    Le problème, c'est que l'objectif est que l'utilisateur puisse appeler des procédures stockées sur mon SQLserver et qu'il puisse les appeler depuis une cellule bien précise (qui devient la cellule "en haut à gauche" du resultset qui va s'afficher dans Excel et à partir desquels on pourra faire des graph).

    Or ici, même avec ma solution, les données sont "en dur" dans ma feuille Excel, donc j'ai pas de refresh à l'ouverture du classeur (ce qui me manque cruellement d'ailleurs...)

    Je suis en train de regarder pour une autre solution avec des QueryTable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Microsoft.Office.Interop.Excel.QueryTable qt = ws.QueryTables.Add(cxString, ws.Range["A4"]); // A4 = 1ère cellule de mon resultset
     
    Parameter parameter = qt.Parameters.Add("IdArea"); //Le parametre entré par l'utilisateur
    parameter.SetParam(XlParameterType.xlRange, ws.Range["A1"]); //La valeur du paramètre est en cellule A1 pour le test
    parameter.RefreshOnChange = true;
     
                qt.Parameters.Add("IdArea").SetParam(Microsoft.Office.Interop.Excel.XlParameterType.xlConstant, ws.get_Range("A1").Value2); //Ajout du paramètre, qui, pour le test, se trouve dans la cellule A1
                qt.CommandText = sql; // Ma requête SQL, qui se termine par : WHERE myField = ?
                qt.FieldNames = false;
                qt.SavePassword = true; //Pas très secure, mais c'est pour le test
                qt.RefreshOnFileOpen = true; // Refresh à l'ouverture du classeur
                qt.RefreshPeriod = 1; // Refresh toute les minutes
                qt.Refresh(); // Affichage sur mon Excel
    Sur le Net, j'ai trouvé plusieurs personnes qui ont fait un truc similaire et qui fonctionne (d'après eux).

    Mais parameter.SetParam(XlParameterType.xlRange, ws.Range["A1"]); me renvoie
    Aucune valeur donnée pour un ou plusieurs paramètres requis.
    En passant ça au debugger, mon paramètre "IdArea") a la valeur attendue.

    ...

    'fin bref. D'ici ce soir j'aurai peut-être trouvé. J'ai un bon matelas d'avance sur le timing du projet, j'aimerai bien le garder

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Ok, apparement OLEDB ne gère pas les requêtes avec paramètres oO
    Mais avec une connexion ODBC, ça passe tout seul...

    Ou comment perdre 4h alors que ça se faisait en 2 minutes...

  10. #10
    Membre émérite

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Ikki_2504 Voir le message
    Ok, apparement OLEDB ne gère pas les requêtes avec paramètres oO
    Mais avec une connexion ODBC, ça passe tout seul...

    Ou comment perdre 4h alors que ça se faisait en 2 minutes...
    Encore mieux utiliser la connexion native SQLServer au lieu d'ODBC.

    Sinon il me semble que ce que tu as écrit ne fonctionne pas car c'est un objet et non une valeur:
    Il me semble de mémoire qu'avec Excel il faille utiliser:

  11. #11
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    En effet, il faut bien utiliser le .Value (ou .Value2)

    Pour info, si quelqu'un tombe un jour sur ce post, voilà comme utiliser une QueryTable paramétrée qui récupère et affiche dans Excel les résultats d'une procédure stockée depuis la cellule cliquée, en l'appelant comme une formule

    A vous d'adapter

    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
     
     
    string queryToExecute = "EXEC " + sp_name + "?, ?"; //SP sp_name a 2 paramètres
    Excel.Worksheet currentWorkSheet = _application.ActiveSheet;
     
                Excel.QueryTable qt = currentWorkSheet.QueryTables.Add(CX_STRING, _application.ActiveCell, queryToExecute);
                qt.MaintainConnection = false;
                qt.BackgroundQuery = false;
                qt.CommandType = Excel.XlCmdType.xlCmdSql;
                qt.SavePassword = true;
     
                //Ajout des paramètres
                if (param1 != null)
                {
                    Excel.Parameter p1 = qt.Parameters.Add("p1");
                    p1.SetParam(Excel.XlParameterType.xlRange, param1);
                    p1.RefreshOnChange = true;
                }
     
                if (param2 != null)
                {
                    Excel.Parameter p2 = qt.Parameters.Add("p2");
                    p2.SetParam(Excel.XlParameterType.xlRange, param2);
                    p2.RefreshOnChange = true;
                }
                #endregion
     
                //Affichage dans Excel
                qt.Refresh();
    Merci alex_vino pour l'aide

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

Discussions similaires

  1. [Débutant] Gérer des champs Dates dans Excel via un Add-in C#
    Par Ender75 dans le forum C#
    Réponses: 3
    Dernier message: 20/11/2014, 16h20
  2. formule dans Excel
    Par magictom42 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/10/2006, 14h00
  3. PRoblème de formule dans Excel
    Par jbidou88 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 11/05/2006, 09h35
  4. Volume de données maximum à passer dans Excel via delphi?
    Par batounet dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/03/2006, 20h37
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18

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