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 :

Creer un Add-in ou une .dll pour Excel/VBA


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut Creer un Add-in ou une .dll pour Excel/VBA
    Bonjour a tous,

    J'ai une question toute simple, mais que je n'arrive pas a resoudre:
    Je souhaiterais "interfacer" du code C# et du Excel/VBA. Ceci semble clairement possible, et j'ai trouvé quelques pistes:



    Cependant, je n'arrive pas a faire fonctionner ces solutions, car j'utilise Visual Studio Express 2013, et je n'arrive pas a compiler les solutions proposées.
    Connaissez vous une solution?


    Merci d'avance pour votre aide!

  2. #2
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    Pour ceux que ca intéresse, tout est expliqué ici: http://www.geeksengine.com/article/create-dll.html
    Ainsi, la dll sera utilisable directement via VBA comme tout autre librairie!

  3. #3
    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
    <disclaimer>Je suis l'auteur du 2ème article (CodeProject).</disclaimer>

    C'est devenu l'article de référence pour ce genre de développement et de tous les feedbacks qui m'ont été remontés on ne m'a pas signalé de problèmes bloquants.
    Je suis donc curieux de savoir quelle difficulté tu as rencontrée afin d'améliorer l'article et que cela profite à tout le monde.

    Quant à l'article que tu as finalement utilisé je l'ai rapidement parcouru et j'ai remarqué que la TLB était copiée dans le dossier system32
    En plus d'être inutile c'est une très mauvaise pratique la TLB doit rester où elle est, d'où elle peut être référencée.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 52
    Points : 50
    Points
    50
    Par défaut
    Bonjour!

    Honnêtement, je ne me rappelle plus vraiment pourquoi je n'avais pas réussi à faire fonctionner ta méthode...
    Mais très clairement, il y a beaucoup, beaucoup plus simple!!! Et surtout il n'y a pas besoin d'avoir à appeler les "regasm" soi-même: Visual Studio sait très bien le faire tout seul.

    Il suffit de:
    • Lancer Visual Studio (2013) en administrateur, afin qu'il ait le droit de faire lui même les modifs
    • Créer un nouveau projet de type "Class Libray"
    • Aller dans Project > <Nom de votre Projet> Properties, et tout en bas dans la page Build, cocher la case Register for COM Interop
    • Toujours dans les propriétés, aller dans la page Application, ouvrir Assembly Information, et cocher Make Assembly COM-Visible
    • Écrire son code (le plus facile, of course )
    • Personnellement, j'ai eu un gros problème de compilaton: mon Excel est en x86, alors que par défaut Visual Studio compilait en x64 pour mon proco. De fait, quand j'essayais d'instancier un objet en VBA de ma librairie C#, j'avais un bien gros méchant message d'erreur: Run-time Error 429 ActiveX component can't create object. Pour résoudre cela, il "suffit" de compiler dans la version qui va bien. Pour cela, cliquer sur la liste déroulant "Any CPU" dans Visual Studio > Configuration Manager > dans Plateform choisir <New...>, et dans la fenêtre qui s'affiche, pour New Plateform, choisir x86, et pour l'autre laisser Any CPU.
    • Faire Compiler son Code (ne pas hésiter a faire Rebuild Solution)
    • Lancer Excel > Alt F11 > Tools > References > Cocher le nom de sa bibliothèque.


    L'avantage, c'est que quand on modifie sa .dll, il n'y a plus qu'à la décocher dans les References VBA, faire un rebuild, puis la recocher dans VBA.
    (Et donc non, pas besoin de faire de Copier/Coller dans System32 comme je m'en suis aperçu par la suite!)

    Et en bonus, j'ai aussi trouvé comment debugger sa .dll: Il faut aller dans le menu DEBUG > Attach to Process, et de choisir Excel dans la liste des applcations.
    Puis en mettant des points d'arrêt dans son code C#, on peut suivre l'avancement.

    En espérant que tout cela pourra servir à d'autres personnes!


    Du coup, les questions que j'aurais maintenant, c'est:
    • Comment supprimer de la liste VBA ses .dll (les déréférencer?)? Ayant fait pas mal de test avant d'en arriver là, ma liste est assez polluée!
    • Comment faire pour que VBA connaisse les attributs et méthodes associées aux classes afin de faire de l'autocomplétion?
    • Est-il possible d'utiliser un constructeur avec des arguments? Il semble possible de n'utiliser que le constructeur par défaut... Pire, si celui-ci n'existe pas, les objets semblent ne pas être instanciables en VBA.


    Voila voilà!
    J'avoue avoir passé énormément de temps sur le problème de compatibilité x86 et x64, surtout que le message et les posts trouvés sur internet ne poussent absolument pas dans ce sens la...
    En fait je viens juste de trouver grâce à un add-in Excel que j'ai malencontreusement installé en x64 au lieu de x86, et qui m'a sorti exactement la même erreur en lançant Excel

  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
    Mon article n'utilise pas VS volontairement pour montrer comment les choses se passent "from-scratch".
    Mais j'y avais mis un petit encart vert pour la procédure d'enregistrement automatique depuis VS car bien sûr en prod on travaille avec VS.

    Pour ton souci de plateforme c'est normal et ce n'est pas exactement ce que tu crois : AnyCPU indique de compiler en marquant l'assembly comme "neutre" (ni x86 ni x64).
    Le type de processus (32 ou 64-bit) sera déterminé sur la plateforme cible : si tu es sous un système 64 c'est la CLR 64-bit qui est choisie d'où ton problème car un processus 32-bit (Excel) ne peut pas charger de composants 64-bit (et vice-versa).
    En mettant x86 au contraire tu force l'affinité binaire de ton assembly en 32-bit => quelque soit l'hôte c'est la CLR 32-bit qui est utilisée.

    Comment supprimer de la liste VBA ses .dll (les déréférencer?)? Ayant fait pas mal de test avant d'en arriver là, ma liste est assez polluée!
    A ma connaissance toutes ces références sont persistées dans le registre Windows (avec le reste de la tuyauterie COM d'ailleurs) donc c'est là qu'il va te falloir faire le ménage.

    Comment faire pour que VBA connaisse les attributs et méthodes associées aux classes afin de faire de l'autocomplétion?
    La bonne pratique est de définir explicitement une interface COM et de l'implémenter d'où ma IYahooAPICS ; ce qui n'est pas fait dans l'article que tu as utilisé d'où sans doute ton problème.

    Est-il possible d'utiliser un constructeur avec des arguments? Il semble possible de n'utiliser que le constructeur par défaut... Pire, si celui-ci n'existe pas, les objets semblent ne pas être instanciables en VBA.
    Tu ne peux définir de constructeur avec paramètres tout simplement parce que COM (la tuyauterie utilisée pour la communication entre VBA et .Net) ne le supporte pas.
    La solution est de mettre à disposition une méthode "Init" à laquelle tu passeras les paramètres que tu aurais transmis à ton constructeur paramétré.

    Si tu as d'autres erreurs tu peux checker le guide de résolution que j'ai fait également : Excel addins troubleshooting guide
    C'est le résultat de mon expérience de dev commando que j'ai appris à la dure.
    Je l'ai fait parce qu'avoir ce type de guide m'aurait bien aidé et économisé du temps et du stress.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. Compiler une dll pour Excel VBA
    Par ANOVA dans le forum Code::Blocks
    Réponses: 4
    Dernier message: 15/07/2014, 22h54
  2. Creer une DLL pour Delphi
    Par Santalyn dans le forum C#
    Réponses: 1
    Dernier message: 05/05/2010, 09h30
  3. creer une dll pour programme etranger
    Par lez-j dans le forum C++
    Réponses: 1
    Dernier message: 28/02/2010, 07h41
  4. Réponses: 4
    Dernier message: 02/09/2005, 10h24
  5. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20

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