Question

Quel serait le meilleur moyen d'exposer certaines fonctionnalités d'un complément Dotnet VSTO Excel à VBA, sans exiger que l'utilisateur soit un administrateur local (c'est-à-dire sans enregistrement COM, aucun HttpListener )? Serait-il possible d'utiliser Microsoft Message Queues de VBA?

Était-ce utile?

La solution

Si je peux interpréter votre question aussi largement que "Comment exposer les fonctionnalités d'un assemblage .Net à Excel sans enregistrement COM" alors une excellente solution consiste à utiliser l'interface XLL d'Excel. Fondamentalement, on déploie un shim xll et une dll .Net associée. Lorsque la xll est chargée, elle se reflète sur la dll et expose ses fonctions à Excel.

Une implémentation open source est disponible ici http: //exceldna.typepad .com / blog / 2006/01 / introduction_exc.html

Une source commerciale, fermée, mais plus riche en fonctionnalités ici http://www.managedxll.com/

Autres conseils

Vous ne pouvez pas simplement les instancier en tant qu'objets COM, car VSTO ne fonctionnera pas dans le domaine d'application par défaut.

Voici comment je l'ai fait, ce qui est certes un peu compliqué. C’était avec un classeur VSTO enregistré en tant que fichier XLA, ce qui, à certains égards, est plus souple qu’un complément VSTO pur.

  • Vous devez générer une bibliothèque de types à l'aide de regasm.exe qui sera référencée par votre code VBA.

  • Créez une classe de fabrique racine dans votre modèle d'objet .NET, capable d'instancier n'importe laquelle des classes que vous souhaitez consommer dans VBA (similaire à la classe "Application" dans les modèles d'objet Office).

  • Vous devez ensuite trouver un moyen de passer une référence à une instance de cette classe de fabrique à VBA. Une fois que VBA a fait référence à une instance de cette classe de fabrique, il peut appeler ses méthodes pour instancier d’autres objets dans votre modèle objet .NET.

  • Pour passer une instance à VBA, définissez une macro dans votre code VBA comme suit

Exemple de code:

Private m_objMyFactory As Object

Public Sub RegisterFactory(MyFactory As Object)

    On Error GoTo ErrHandler
    Set m_objMyFactory = MyFactory
    Exit Sub
ErrHandler:
    MsgBox "An unexpected error occurred when registering the Factory component: " & Err.Description
    Exit Sub
End Sub
  • Ajoutez maintenant du code au gestionnaire d'événements VSTO ThisWorkbook_Open, qui instancie votre objet fabrique et appelle la macro ci-dessus en transmettant une référence à l'objet fabrique.

Exemple de code:

void ThisWorkbook_Open()
{
     try
     {
         ThisApplication.Run("RegisterFactory",
             new MyNamespace.MyFactory(),
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     }
     catch (Exception ex)
     {
         MessageBox.Show("Load error: " + ex.ToString());
     }
}

Il y a encore quelques points à prendre en compte pour que cela fonctionne correctement - si cela vous intéresse, faites-le-moi savoir et je posterai plus de détails.

Vous pouvez être intéressé par Excel4Net (similaire à ExcelDNA et ManagedXll, mais plus facile à utiliser):

site web: http://www.excel4net.com

blog: http://excel4net.blogspot.com

Juste pour référence pour les futurs lecteurs: Vous voudrez peut-être aussi jeter un coup d’œil à cette question:

Accéder à un type de complément d'application VSTO à partir de VBA (Excel )

et en particulier sur le blog qui y est référencé:

Compléments VSTO, COMAddIns et RequestComAddInAutomationService

En remplaçant RequestComAddInAutomationService () , vous pouvez exposer les fonctionnalités de votre choix, en définissant une classe Facade fournissant des points d'entrée pour toutes ces fonctionnalités et en exposant cette classe à VBA.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top