2008-09-23 14 views

Répondre

3

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 une cale xll et une DLL .Net associée. Lorsque le xll est chargé, il reflète sur la DLL et expose les fonctions à Excel.

Une implémentation open source se trouve ici http://exceldna.typepad.com/blog/2006/01/introducing_exc.html

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

1

Vous ne pouvez pas simplement les instancier comme des objets COM, comme VSTO ne sera pas être exécuté dans le domaine d'application par défaut.

Voici comment je l'ai fait, ce qui est un peu compliqué. C'était avec un classeur VSTO enregistré en tant que fichier XLA, qui d'une certaine manière est plus flexible qu'un complément VSTO pur.

  • Vous devez générer une bibliothèque de types en utilisant 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, qui est capable d'instancier l'une des classes que vous voulez consommer dans VBA (quelque chose comme la classe "Application" dans les modèles d'objet Office).

  • Vous devez ensuite trouver un moyen de transmettre une référence à une instance de cette classe de fabrique à VBA. Une fois que VBA a une 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 d'objet .NET.

  • Pour passer une instance de VBA, définir une macro dans votre code VBA comme suit

code Exemple:

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 
  • maintenant ajouter du code au gestionnaire d'événements VSTO ThisWorkbook_Open, qui instancie votre objet factory et appelle la macro ci-dessus en lui passant une référence à l'objet factory.

code Exemple:

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 quelques points à considérer pour obtenir ce travail avec vigueur - si vous êtes intéressés à suivre ce haut laissez-moi savoir et je posterai plus de détails.

0

Juste pour référence pour l'avenir lecteurs: Vous pouvez également jeter un oeil à cette question:

Accessing a VSTO application-addin types from VBA (Excel)

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

VSTO Add-ins, COMAddIns and RequestComAddInAutomationService

En redéfinissant RequestComAddInAutomationService() vous pouvez exposer toutes les fonctionnalités que vous voulez, en définissant une classe de façade qui fournit des points d'entrée pour toutes ces fonctionnalités, et exposant cette classe à VBA.