2012-12-19 16 views
12

W visual studio mam projekt dodatku Excel 2010. Jak mogę mieć, że projekt utworzenia następujący moduł.Dodaj funkcję zdefiniowaną przez użytkownika do dodatku Visual Studio Excel

enter image description here

wiem, że mogę zapisać, że skoroszyt z tego modułu, a następnie używać go z moim dodatku w Będzie miło, jeśli mogę mieć mój dodatek Stwórz ten moduł ...

+2

Być może [to] (http: // blogs.msdn.com/b/eric_carter/archive/2004/12/01/writing-user-defined-functions-for-excel-in-net.aspx) może pomóc. –

+0

*** Nieeee! *** Zastanów się dwa razy zanim zejdziesz tą ścieżką.Zachęcam do stosowania podejścia UDF, więc logika kodu jest a) Ochrona przed użytkownikami Excela zmieniającymi krytyczną logikę *, które będą trudne do wykrycia * b) w jednym dodatku i nie powielone w wielu skoroszytach c) nie wymaga Zaufania pozwolenie d) jednostka testowalna e) napisana w aktualnym języku i tak dalej. –

Odpowiedz

3

Nie sądzę, że VSTO obsługuje Excel UDF, zalecenie ogólne to użycie dodatków do automatyzacji (jak sugeruje link Sid).

Inną opcją jest wywołanie zarządzanej funkcji VSTO z VBA. Ponownie nie jest to zalecane, ale możliwe.

(Podsumowanie samouczka z linku) Oto łatwy sposób na wywołanie funkcji zarządzanych z VBA.

Utwórz klasę ze swoich funkcji w VSTO

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

drut swoją klasę do VBA w VSTO

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

Tworzenie Hook dla kodu zarządzanego i otoki dla funkcji w VBA

W module VBA w arkuszu kalkulacyjnym lub dokumencie

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 

Teraz można wprowadzić = GetNumberFromVSTO() w komórce, kiedy rozpoczyna Excel wartość komórki powinny być 42.

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

+0

To właśnie mam teraz. Byłoby miło, gdybym mógł opublikować wtyczkę bez konieczności publikowania skoroszytu z włączoną obsługą makr (book1.xlsx). Więc myślę, że to nie jest możliwe, prawda? –

10

Jest możliwe, aby utworzyć moduł. Jednak aby to działało, należy wybrać ustawienie "Zaufaj dostępowi do modelu projektu VB" w programie Excel. Zgłasza błąd polegający na odmowie dostępu, jeśli ustawienie zaufania nie jest wybrane.

using Excel = Microsoft.Office.Interop.Excel; 
using VB = Microsoft.Vbe.Interop; 

Excel.Application eApp = new Excel.Application(); 

eApp.Visible = true; 
Excel.Workbook eBook = eApp.Workbooks.Add(); 

VB.VBProject eVBProj = (VB.VBProject)eBook.VBProject; 
VB._VBComponent vbModule = eVBProj.VBE.ActiveVBProject.VBComponents.Add(VB.vbext_ComponentType.vbext_ct_StdModule); 

String functionText = "Function MyTest()\n"; 
     functionText += "MsgBox \"Hello World\"\n"; 
     functionText += "End Function"; 

vbModule.CodeModule.AddFromString(functionText); 
+0

jesteś nieprzyjemny :) –

1

Dodatek VSTO nie może utworzyć UDF, więc należy utworzyć osobny dodatek do funkcji. Chociaż ten dodatek może znajdować się w tej samej bibliotece DLL co dodatek VSTO, nie można się komunikować między VSTO i UDF bez specjalnej sztuczki.

Mam blog post na ten temat. Daje kompletny przykładowy projekt, który obejmuje VSTO i UDF.

Oto podstawowa struktura samego UDF.

[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

Jeśli naprawdę chcesz zrobić, to napisać .NET UDF lub skojarzona polecenia poziomu aplikacji .NET i UDF Addin następnie przy użyciu VSTO nie jest obecnie dobrym rozwiązaniem:
Polecam stosując albo Addin Express (koszty) lub Excel DNA (bezpłatnie).
Obie te opcje umożliwiają tworzenie dodatków UDF .NET XLL i dodatków UDF automatyki (dodatki XDF UDF oferują znaczną przewagę wydajności, ale z nieco bardziej ograniczonym dostępem do modelu obiektów programu Excel)