Frage

Die Beschreibung

Ich bin ein paar Excel benutzerdefinierte Funktionen in COM-Server zu schreiben. Ich möchte die Standard-Hilfe erhalten ( Funktion einfügen Dialog), die Sie erhalten, wenn Sie die Taste fx . Ja, ich kann mein COM-Server aufgelistet in unter der Kategorie fällt nach unten, aber

siehe
  • Ich sehe Equals auch, GetHashCode, GetType und ToString (die ziemlich unerwünscht sind in der Excel-Benutzer zu belichten)
  • mein COM-Server die Auswahl nach oben bringt die * Funktionsargumente * [1] Dialog ohne Argument Informationen und keine Beschreibung der Funktion.

Hier ist die Lahmheit, dass ich bekommen:

Funktion einfügen Dialog http://www.iwebthereforeiam.com/files/ Insert% 20function% 20dialog.gif

Excel Funktionsargumente Dialog http://www.iwebthereforeiam.com/files /Function%20Arguments%20dialog.gif

Die Frage

Gibt es .NET-Attribute ich auf die Methoden setzen könnte dies durch Excel zu übergeben?

  • Kann ich Ihnen eine Beschreibung der Funktion?
  • Kann ich Sie eine Beschreibung der Parameter?
  • Kann ich biete einen Kategorienamen für meine Funktionen, so dass ich etwas besser als nur die ProgID?

(ich sehe, dass es leider einfach aussieht, ist in ExcelDNA zu tun, aber ich bin nicht diesen Weg gehen. Emulieren govert Code [benutzerdefinierte Attribute, einen Lader von einer Art, etc.] sieht aus wie es wäre ziemlich hart sein.)


Zusätzlicher Hintergrund

Wenn Sie nicht getan Arbeit mit Excel + COM-Server vor haben, sind hier einige nützliche Ressourcen zu Geschwindigkeit aufstehen:

Zurück Stackoverflow Fragen:
Wie COM-Server für Excel geschrieben in VB.NET erhalten installiert und in Automation Server-Liste registriert?
Wie ein COM-Add -Exposed .NET-Projekt auf die VB6 (oder VBA) References Dialog?

Weitere Informationen:
Schreiben Benutzerfunktionen für Excel in .NET definiert < br> Erstellen und Bereitstellen von a .NET COM Assembly
Schreiben von benutzerdefinierten Excel-Tabellenfunktionen in C #


Bearbeiten 2009-10-20 14.10

habe ich versucht, in einem Application.MacroOptions Aufruf Sub New() aus.

  1. Keine Sub New ()
    Halb akzeptabel. Die Funktion ist zu finden unter Kategorie ProgID
  2. Shared Sub New ()
    Nicht akzeptabel. Build Zeitfehler
    Cannot register assembly "...\Foo.dll".
    Exception has been thrown by the target of an invocation.
  3. Sub New ()
    Nicht akzeptabel:. Kategorie ist nicht aufgelistet in Funktion einfügen dialog

Ich vermute, dass dies ein Problem ist sowohl für Macro und für die mehr beteiligt Route von Charles empfohlen.


Bearbeiten 2009-10-20 14.55

Auf der positiven Seite, Mike Empfehlung eine Schnittstelle zu schaffen machte abzutöten die lästigen zusätzlichen Methoden zu implementieren, die ausgesetzt wurden.


Bearbeiten 2009-10-20 15.00 Uhr

Dieser Microsoft-Artikel von Anfang 2007 (über Mike Link ) scheint eine ziemlich vollständige Antwort auf das Thema:

  

Automation Add-In und die Funktion   Wizard

     

Jede Automatisierungs-Add-in hat seine eigene   Kategorie in dem Excel-Funktions-Assistenten.   Der Kategoriename ist die Programm-ID für   das Add-in; Sie können nicht angeben, ein   verschiedene Kategorienamen für Automation   Add-In-Funktionen. Zusätzlich gibt   ist keine Art und Weise Funktion zu spezifizieren   Beschreibungen, Argument Beschreibungen,   oder Hilfe für Automatisierungs-Add-in   Funktionen im Funktions-Assistenten.


1 Huh, ein Stackoverflow-Fehler. Es sieht aus wie Sie können nicht Kursiv eine Zeichenfolge innerhalb einer expliziten HTML ul-Liste?

War es hilfreich?

Lösung

Ein Teil davon ist leicht zu korrigieren, andere Teile es ziemlich hart ist. obwohl es ist machbar, wenn Sie bereit sind, in die Zeit zu setzen.

Sie schrieb:

  

Ich sehe auch, Equals, GetHashCode,   GetType und ToString (die   ziemlich unerwünscht die belichten   Excel-Benutzer)

Ja, vereinbart, dies auf jeden Fall wünschenswert, aber es kann verhindert werden. Dies geschieht, weil die Klasse von ‚System.Object‘ erbt, da alle .NET-Klassen zu tun, und Ihre Standard-Schnittstelle, die für COM verfügbar gemacht wird, einschließlich dieser Elemente. Dies geschieht zum Beispiel, wenn Sie den ‚ClassInterfaceAttribute‘ verwenden, mit der Einstellung ‚ClassInterfaceType.AutoDual‘.

z. in C #:

[ClassInterface(ClassInterfaceType.AutoDual)]

In VB.NET:

<ClassInterface(ClassInterfaceType.AutoDual)>

Die Verwendung von ‚ClassInterfaceType.AutoDual‘ vermieden werden sollte jedoch, um die Mitglieder von ‚System.Object‘ von freigelegt (wie auch zu verhindern, dass mögliche Versionierung Probleme in der Zukunft) geerbt zu verhindern. Stattdessen Ihre eigene Schnittstelle definieren, die Schnittstelle in der Klasse implementieren, und dann mit einem Wert von ‚ClassInterfaceType.None‘ Ihre Klasse mit dem ‚Class‘ Attribute markiert.

Z. B, C #:.

[ComVisible(true)]
[Guid("5B88B8D0-8AF1-4741-A645-3D362A31BD37")]
public interface IClassName
{
    double AddTwo(double x, double y);
}

[ComVisible(true)]
[Guid("010B0245-55BB-4485-ABAF-46DF4356DB7B")]
[ProgId("ProjectName.ClassName")]
[ComDefaultInterface(typeof(IClassName))]
[ClassInterface(ClassInterfaceType.None)]
public class ClassName : IClassName
{
    public double AddTwo(double x, double y)
    {
        return x + y;
    }
}

Mit VB.NET:

<ComVisible(True)> _
<Guid("5B88B8D0-8AF1-4741-A645-3D362A31BD37")> _
Public Interface IClassName
    Function AddTwo(ByVal x As Double, ByVal y As Double) As Double
End Interface

<ComVisible(True)> _
<Guid("010B0245-55BB-4485-ABAF-46DF4356DB7B")> _
<ProgId("ProjectName.ClassName")> _
<ComDefaultInterface(GetType(IClassName))> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class ClassName
    Implements IClassName

    Public Function AddTwo(ByVal x As Double, ByVal y As Double) As Double _
        Implements IClassName.AddTwo
        Return x + y
    End Function
End Class

Verwendung des ‚ClassInterfaceAtribute‘ mit einem Wert von ‚ClassInterfaceType.None‘ Indem, die geerbte ‚System.Object‘ memebers sind ausgeschlossen, weil die Schnittstelle der Klasse ist nicht COM-sichtbar gemacht. Stattdessen werden nur die implementierte Schnittstelle ( ‚iClassName‘ in diesem Beispiel) zu COM exportiert wird.

Das oben ist auch die Nutzung der ‚ComDefaultInterfaceAttribute‘. Dies ist nicht sehr wichtig, und tut nichts, wenn Sie nur eine Schnittstelle implementieren - wie in diesem Beispiel -. Aber es ist eine gute Idee, wenn Sie später eine Schnittstelle hinzufügen, wie IDTExtensibility2

Für weitere Details zu diesem Thema finden Sie unter:

(1) Managed Automation Add -ins von Andrew Whitechapel.

(2) Schreiben von benutzerdefinierten Excel-Tabellenfunktionen in C # von Gabhan Berry.

Ok, jetzt auf den harten Teil. Sie schrieb:

  

mein COM-Server auswählen bringt die    Funktionsargumente [1] Dialog ohne Argument Informationen und keine   Beschreibung der Funktion.

     

liefern kann ich eine Beschreibung des   Funktion?

     

liefern kann ich eine Beschreibung des   Parameter?

     

Kann ich biete einen Kategorienamen für meine   Funktionen, so dass ich etwas bekommen   besser als nur die ProgID?

Der einfachste Ansatz hier ist die Verwendung des Application.MacroOptions Methode. Mit dieser Methode können Sie eine Beschreibung der Funktion zur Verfügung zu stellen und angeben, welche Kategorie, unter der Sie wollen, dass es angezeigt wird. Dieser Ansatz ermöglicht es Ihnen nicht alle Informationen für die Funktionen Parameter angeben, leider, aber Techniken, die Ihnen erlauben, dies zu tun sind sehr kompliziert, was ich später zu bekommen. [Korrektur: Die ‚Application.MacroOptions‘ Methode funktioniert nur für UDF über VBA erstellt und kann nicht für die Automatisierung Add-In verwendet werden. Lesen Sie weiter für komplexere Ansätze zur Griff Registrierung von UDF containe in einem Automatisierungs-Add-In - Mike Rosenblum 2009.10.20]

Beachten Sie, dass die Hilfedateien für Excel 2003 und Hilfedateien für Excel 2007 Zustand, dass ein String kann zur Verfügung gestellt werden die Kategorie Argument, um eine benutzerdefinierte Kategorie Namen Ihrer Wahl zu bieten. Bedenken Sie jedoch, dass die Hilfedateien für Excel 2002 nicht. Ich weiß nicht, ob dies eine Lücke in den Hilfedateien Excel 2002 ist, oder ob dies eine neue Fähigkeit ab Excel 2003 ist ich das letzteres bin zu raten, aber Sie würden zu testen sicher zu sein.

Der einzige Weg, um Ihre Parameterinformationen in die Funktion zu erhalten Wizard ist eine ziemlich komplexe Technik zu verwenden, die ‚Excel.Application.ExecuteExcel4Macro‘ Methode beteiligt ist. Seien Sie gewarnt, aber: viele Excel MVPs mit diesem Ansatz zu kämpfen haben und es versäumt, ein Ergebnis zu erzeugen, die zuverlässig ist. In jüngerer Zeit scheint es aber, dass Jan Karel Pieterse (JKP) es hat geklappt bekommen hat und die Details hier veröffentlicht: a href = „http://www.jkp-ads.com/articles/RegisterUDF00.asp“ rel < = "noreferrer"> eine benutzerdefinierte Funktion mit Excel registrieren.

Skimming dieser Artikel Sie werden sehen, dass es nicht für schwache Nerven ist. Ein Teil des Problems ist, dass er es für VBA / VB 6.0 geschrieben und so alles, was Code müßte VB.NET oder C # übersetzt werden. Der Tastaturbefehl ist jedoch die Methode ‚Excel.Application.ExecuteExcel4Macro‘, die auf .NET ausgesetzt ist, so sollte alles funktionieren.

In der Praxis jedoch, ziehe ich es in beträchtlichem Ausmaß mit dem Ansatz ‚Excel.Application.MacroOptions‘, weil es einfach und zuverlässig ist. Dabei spielt es keine Parameterinformationen zur Verfügung stellen, aber ich habe noch nicht hatte ein starkes Bedürfnis, mich zu motivieren, auf dem ‚ExecuteExcel4Macro‘ Ansatz.

Also, viel Glück mit diesem, aber mein Rat wäre, die ‚Macro‘ zu verwenden, es sei denn, Sie nach Stunden bezahlt werden. ; -)

- Mike

Follow-up zu Hughs Antworten

  

Ich habe versucht, aus anrufen   Application.MacroOptions in einem Sub   Neu ().

     

Nein Sub New () Halb akzeptabel: Funktion   aufgeführt wird unter der Kategorie ProgID.

     

Shared Sub New () Nicht akzeptabel:   Build-Zeitfehler. Kann nicht registrieren   Montage "... \ Foo.dll". Ausnahme hat   wurde durch das Ziel ein geworfen   Aufruf.

     

Sub New () Nicht akzeptabel: Kategorie   nicht in Funktion einfügen Dialog aufgelistet.   Ich vermute, dass dies ein Problem ist sowohl für   Macro und für die mehr beteiligt   Route empfohlen von Charles.

Sie können nicht mit anderen geteilt verwenden (auch bekannt als „statisch“) Klassen oder Konstrukteuren, wenn Ihre Klassen COM auszusetzen, da COM keine Kenntnis von diesem Konzept hat und so kann es nicht kompilieren - wie Sie herausgefunden! Sie könnten in der Lage, ein ‚ComVisibleAttribute‘ mit einem Wert von ‚False‘ auf den freigegebenen Konstruktor anzuwenden, um zumindest erlauben, es zu kompilieren. Aber das würden Sie nicht ohnehin in diesem Fall helfen ...

Der Versuch, Automatisierung Add-In registrieren über die Automatisierung Add-In selbst könnte heikel erweisen. Ich weiß, dass dies wünschenswert ist, um es zu halten, als eine einzelne, eigenständige Komponente, aber es könnte nicht möglich sein. Oder zumindest das wird nicht einfach sein.

Das Problem ist, dass die Automatisierung Add-In werden bei Bedarf geladen. Das heißt, sie sind nicht wirklich da, bis versucht Excel die erste Tabellenfunktion von Ihrem Automatisierungs-Add-in zuzugreifen. Es gibt zwei Probleme im Zusammenhang mit diesem:

(1) Wenn Sie Ihren Registrierungscode für Ihre Klasse im Konstruktor setzen, dann per definitionem Ihrer Funktion Assistent Informationen nicht existieren können, bis die Funktion zum ersten Mal aufgerufen wurde.

(2) Ihre Konstruktor könnte Ausführung werden, wenn Excel nicht bereit ist, die Automatisierung Befehle zu akzeptieren. Zum Beispiel kann ein Automatisierungs-Add-in ist bedarf geladen normalerweise auf, wenn der Benutzer auf dem Namen eines der benutzerdefinierten Funktionen (UDF) in der Automatisierung definierte eingeben beginnt Add-In. Das Ergebnis ist, dass die Zelle im Bearbeitungsmodus ist, wenn Ihre Automatisierungs-Add-in lädt zunächst. Wenn Sie Automatisierungscode in Ihrem Konstruktor während Bearbeitungsmodus haben, scheitern viele Befehle. Ich weiß nicht, ob die ‚Excel.Application.MacroOptions‘ oder ‚Excel.Application.Excel4Macro‘ Methoden ein Problem damit haben, aber viele commands wird ersticken, wenn sie versuchen auszuführen, während die Zelle im Bearbeitungsmodus befindet. Und wenn die Automatisierung Add-In zum ersten Mal geladen wird, weil es genannt wird, während die Funktions-Assistent geöffnet ist, ich habe keine Ahnung, ob diese Methoden richtig arbeiten.

Es gibt keine einfache Lösung für dieses Problem, wenn Sie Ihre Automatisierungs-Add-in haben, ohne anderen Unterstützung völlig eigenständige werden. Sie können jedoch erstellen ein verwaltetes COM-Add-in, das wird Ihre Automatisierungs-Add-in für Sie über ‚Excel.Application.MacroOptions‘ oder das ‚Excel.Application.Excel4Macro‘ -Ansatz registrieren, wenn Excel startet. Das verwaltete COM-Add-in-Klasse kann als das Ihrer Automatisierungs-Add-in in der gleichen Baugruppe, so dass Sie immer noch nur eine Montage benötigen.

übrigens, könnten Sie sogar eine VBA-Arbeitsmappe oder .XLA Add-In verwenden, das gleiche zu tun - mit dem Workbook.Open Ereignisse in VBA den Registrierungscode nennen. Sie müssen nur etwas Ihren Registrierungscode rufen, wenn Excel startet. Der Vorteil der Verwendung von VBA in diesem Fall ist, dass Sie den Code aus dem Jan Karel Pieterse des nutzen könnten Registrieren eine benutzerdefinierte Funktion mit Excel Artikeln, wie sie ist, ohne es zu .NET übersetzen zu müssen.

  

Auf der positiven Seite, Mike   Empfehlung erstellen eine Schnittstelle   tat töten die lästigen zu implementieren   zusätzliche Methoden, die ausgesetzt wurden.

lol, ich bin froh, etwas gearbeitet!

  

Mit diesem Microsoft-Artikel von Anfang 2007   (Über Mikes Link) scheint eine eher   vollständige Antwort zum Thema:

     

Automation Add-In und die Funktion   Wizard

     

Jeder Automatisierungs-Add-in hat seine eigene   Kategorie in dem Excel-Funktions-Assistenten.   Der Kategoriename ist die Programm-ID für   das Add-in; Sie können nicht angeben, ein   verschiedene Kategorienamen für Automation   Add-In-Funktionen. Zusätzlich gibt   ist keine Art und Weise Funktion zu spezifizieren   Beschreibungen, Argument Beschreibungen,   oder Hilfe für Automatisierungs-Add-in   Funktionen im Funktions-Assistenten.

Dies ist eine Einschränkung für den Ansatz ‚Excel.Application.MacroOptions‘ nur. (Ich entschuldige mich, ich hatte zu dieser Einschränkung des ‚Excel.Application.MacroOptions‘ Methode in Bezug auf Automatisierung Add-Ins vergessen, als ich meine ursprüngliche Antwort schrieb, oben). Die mehr-Komplex ‚Excel.Application. ExecuteExcel4Macro Ansatz jedoch tut absolut Arbeit für die Automatisierung Add-In. Es sollte auch Arbeit für .NET ( „managed“) Automatisierung Add-In als auch, weil Excel hat keine Ahnung, ob es über VB 6.0 / C ++ im Vergleich zu einer verwalteten COM-Automatisierung eines COM-Automatisierungs-Add-in erstellt wird geladen Add-In erstellt VB.NET/C#. Die Mechanik ist genau das gleiche von der COM-Seite des Zauns, weil Excel keine Ahnung hat, was .NET ist, oder dass .NET existiert.

sagen, dass das "Excel.Application.Excel4Macro Ansatz würde auf jeden Fall eine Menge Arbeit ...

Andere Tipps

Sie können entweder eines der Systeme .Net Excel verwenden wie ExcelDNA oder ADDIN Express, oder versuchen, eine der VBA / VB6 Lösungen anzupassen: Blick auf Laurent Longre des FunCustomise http://xcell05.free.fr/english/index.html oder Jan Karel Pieterse den Artikel unter http://www.jkp-ads.com/Articles/ RegisterUDF00.asp die verwendet eine Funktion Überlastung Hack.

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