Frage

Was ist der beste Weg wäre, bestimmte Funktionen in einem Dotnet VSTO Excel-Add-in VBA zu belichten, ohne dass der Benutzer ein lokaler Administrator sein (dh keine COM-Registrierung, kein Httplistener )? Wäre es möglich, Microsoft Message Queues von VBA zu benutzen?

War es hilfreich?

Lösung

Wenn ich Ihre Frage interpretieren kann so breit wie „Wie kann ich aussetzen Funktionalität in einer .NET-Assembly zu Excel ohne COM-Registrierung“, dann eine ausgezeichnete Lösung ist Excel XLL-Schnittstelle zu verwenden. Grundsätzlich setzt man eine xll shim und einen zugehörigen NET-DLL. Wenn die xll geladen wird die dll reflektiert über und setzt in Excel die Funktionen darin.

Eine Open-Source-Implementierung finden Sie hier http: //exceldna.typepad .com / blog / 2006/01 / introducing_exc.html

Ein kommerziell Closed-Source, aber reich an Funktionen eines hier http://www.managedxll.com/

Andere Tipps

Sie können nicht einfach als COM-Objekte instanziiert, wie VSTO nicht in der Standardanwendungsdomäne ausgeführt werden.

Hier ist, wie ich es getan habe, was zugegebenermaßen ein bisschen gewunden ist. Dies war mit einer VSTO Arbeitsmappe als XLA-Datei gespeichert, die in gewisser Weise ist flexibler als ein reiner VSTO-Add-In.

  • Sie brauchen eine Typbibliothek mit regasm.exe zu erzeugen, die von Ihrem VBA-Code verwiesen wird.

  • ein Root-Factory-Klasse in .NET-Objektmodell erstellen, die von der Instanziierung eine der Klassen kann man in VBA (so etwas wie die „Application“ Klasse in den Office-Objektmodellen) konsumieren wollen.

  • Sie brauchen dann einen Weg zu finden, einen Verweis auf eine Instanz dieser Fabrik Klasse VBA zu übergeben. Sobald VBA einen Verweis auf eine Instanz dieser Klasse Fabrik hat, kann er seine Methoden aufrufen, alle anderen Objekte in Ihrem .NET-Objektmodell instanziieren.

  • Um eine Instanz zu VBA übergibt, einen Makro in Ihrem VBA-Code wie folgt definieren

Beispielcode:

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
  • Nun fügen Sie Code zum VSTO ThisWorkbook_Open Ereignishandler, das Objekt Ihrer Fabrik instanziiert und ruft die oben Makro einen Verweis auf das Factory-Objekt übergeben.

Beispielcode:

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());
     }
}

Es gibt noch ein paar Probleme dieser robusten Arbeits kennen zu berücksichtigen -., Wenn Sie in im Anschluss an diese interessiert sind bis lassen Sie mich wissen und ich werde mehr Details veröffentlichen

Sie können in Excel4Net interessiert sein (es ist ähnlich wie ExcelDNA und ManagedXLL, aber einfacher zu benutzen):

Webseite: http://www.excel4net.com

Blog: http://excel4net.blogspot.com

Gerade als Referenz für zukünftige Leser: Sie können auch einen Blick auf diese Frage haben wollen:

Zugriff auf einen VSTO-Anwendung-Addin Typen von VBA (Excel )

und vor allem auf den Blog, die dort verwiesen wird:

VSTO Add-In, COMAddIns und RequestComAddInAutomationService

Durch das Überschreiben RequestComAddInAutomationService () Sie können aussetzen, was Funktionen, die Sie möchten, indem eine Fassadenklasse definiert, die Eintrittspunkte für alle diese Funktionen bereitstellt, und das Aussetzen dieser Klasse zu VBA.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top