2012-12-19 10 views
12

In Visual Studio habe ich ein Excel 2010-Add-in-Projekt. Wie kann ich das Projekt das folgende Modul erstellen.Hinzufügen einer benutzerdefinierten Funktion zu Visual Studio Excel-Add-in

enter image description here

Ich weiß, dass ich mit diesem Modul die Arbeitsmappe speichern kann es dann mit meinem Add verwenden es schön, wenn ich mein Add-In haben Erstellen Sie dieses Modul ...

+2

Vielleicht [this] (http: // blogs.msdn.com/b/eric_carter/archive/2004/12/01/writing-user-defined-functions-for-excel-in-net.aspx) könnte helfen. –

+0

*** Nooooo! *** Denke zweimal darüber nach, bevor du diesen Weg einschlagen musst.Ich fordere Sie dringend auf, den UDF-Ansatz zu verwenden, damit Ihre Code-Logik a) Geschützt vor Excel-Benutzern, die kritische Logik * ändern, die schwer zu erkennen sind * b) in einem Add-In & nicht in mehreren Arbeitsmappen dupliziert c) erfordert nicht Trusted Erlaubnis d) Einheit testbar e) geschrieben in einer aktuellen Sprache & etc –

Antwort

3

Ich glaube nicht, dass VSTO Excel UDFs unterstützt, die allgemeine Empfehlung ist die Verwendung von Automation Add-Ins (wie Sids Link suggeriert).

Eine weitere Option besteht darin, eine verwaltete VSTO-Funktion von VBA aus aufzurufen. Auch dies ist nicht empfehlenswert, aber möglich.

(Zusammenfassung des Tutorials von Link) Hier ist eine einfache Möglichkeit, verwaltete Funktionen von VBA aufrufen.

Erstellen Sie eine Klasse mit Ihren Funktionen in VSTO

<System.Runtime.InteropServices.ComVisible(True)> _ 
Public Class MyManagedFunctions 
    Public Function GetNumber() As Integer 
     Return 42 
    End Function 
End Class 

verdrahten Ihre Klasse zu VBA in VSTO

Private Sub ThisWorkbook_Open() Handles Me.Open 
    Me.Application.Run("RegisterCallback", New MyManagedFunctions) 
End Sub 

erstellen Haken für verwalteten Code und einen Wrapper für die Funktionen in VBA

In einem VBA-Modul in Ihrer Tabelle oder Ihrem Dokument

Dim managedObject As Object 

Public Sub RegisterCallback(callback As Object) 
    Set managedObject = callback 
End Sub 

Public Function GetNumberFromVSTO() As Integer 
    GetNumberFromVSTO = managedObject.GetNumber() 
End Function 

Jetzt können Sie GetNumberFromVSTO() in einer Zelle eingeben =, wenn Excel startet sollte die Zelle Wert 42.

http://blogs.msdn.com/b/pstubbs/archive/2004/12/31/344964.aspx

+0

Das ist, was ich jetzt habe. Es wäre schön, wenn ich das Plug-in veröffentlichen könnte, ohne die Makro-fähige Arbeitsmappe veröffentlichen zu müssen (book1.xlsx). Also denke ich, dass es nicht möglich ist, oder? –

10

sein Es ist möglich, das Modul zu erstellen. Damit dies jedoch funktioniert, muss die Einstellung "Zugriff auf das VB-Projektmodell vertrauen" in Excel ausgewählt werden. Es wird ein Fehler ausgegeben, dass der Zugriff verweigert wird, wenn die Vertrauenseinstellung nicht ausgewählt ist.

+0

du bist böse :) –

1

Ein VSTO-Add-In kann keine UDFs erstellen, daher müssen Sie ein separates Add-In für die Funktionen erstellen. Obwohl sich dieses Add-In in der gleichen DLL wie das VSTO-Add-In befinden kann, können Sie ohne besondere Tricks nicht zwischen dem VSTO und den UDFs kommunizieren.

Ich habe eine blog post darüber. Sie erhalten ein vollständiges Beispielprojekt mit VSTO und UDFs.

Hier ist die grundlegende Struktur der UDF selbst.

[Guid("3B81B6B7-3AF9-454F-AADF-FAF06E5A98F2")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface IFunctions 
{ 
    int MYINT(); 
} 

[Guid("F58C591D-A22F-49AD-BC21-A086097DC26B")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
public class Functions : IFunctions 
{ 
    public int MYINT() 
    { 
     return 42; 
    } 
} 
2

Wenn das, was Sie wirklich wollen, ist .NET UDF oder eine kombinierte .NET Anwendungsebene Befehl und UDF Addin schreiben dann mit VSTO ist nicht eine gute Lösung:
würde ich empfehlen, entweder Addin Express (Kosten) oder Excel DNA (kostenlos).
Beide ermöglichen es Ihnen, sowohl .NET XLL UDF-Addins als auch Automation UDF-Addins zu erstellen (XLL UDF-Addins bieten erhebliche Leistungsvorteile, aber mit etwas eingeschränkterem Zugriff auf das Excel-Objektmodell)

Verwandte Themen