2012-12-19 34 views
12

在Visual Studio中,我有一個Excel 2010加載項項目。我怎樣纔能有一個項目創建以下模塊:將用戶定義的函數添加到Visual Studio Excel加載項

enter image description here

我知道我可以保存工作簿與模塊,然後用我的外接使用它這將是很好,如果我可以有我的外接創建模塊...

+2

也許[this](http:// blogs.msdn.com/b/eric_carter/archive/2004/12/01/writing-user-defined-functions-for-excel-in-net.aspx)可能有幫助。 –

+0

*** Nooooo!***在走這條路之前要三思。我強烈建議您使用UDF方法,以便您的代碼邏輯是:a)受Excel用戶保護,可以更改關鍵邏輯*,這將很難檢測到* b)在一個加載項中並且不會在多個工作簿中重複出現c)不需要Trusted許可d)單元測試e)用最新的語言編寫等等 –

回答

3

我不認爲VSTO支持Excel UDF的,一般建議是使用自動化外接的(如Sid的鏈接提示)。

另一種選擇是從VBA調用受管VSTO功能。再次,這不是建議,但可能。

(鏈接教程概述) 以下是從VBA調用託管函數的簡便方法。

在VSTO在VSTO

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

在VBA創建託管代碼掛鉤和包裝器的功能

創建你的函數的類

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

線了你的類VBA

在電子表格或文檔中的VBA模塊中

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 

現在你可以在一個單元格中輸入= GetNumberFromVSTO(),Excel啓動時,單元格的值應該是42

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

+0

這就是我現在所擁有的。如果我可以發佈插件而不必發佈啓用宏的工作簿(book1.xlsx),那將會很好,所以我想這不可能吧? –

10

它可以創建模塊。但是,要使用此功能,必須在Excel中選擇「信任訪問VB項目模型」。如果未選擇信任設置,則會引發訪問被拒絕的錯誤。

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

你很討厭:) –

1

一個VSTO插件不能創建UDF的,所以你需要創建功能獨立的插件。雖然這個插件可以在同一個DLL的VSTO插件,你可以不VSTO和UDF的之間沒有特殊的掛羊頭賣狗肉通信。

我對此有一個blog post。它爲您提供了一個包含VSTO和UDF的完整示例項目。

這裏的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

如果你真的想要做的是寫.NET的UDF,或組合.NET應用程序級指揮和UDF插件然後使用VSTO目前不是一個很好的解決方案:
我會建議您使用Addin Express(費用)或Excel DNA(免費)。這兩個函數都允許您創建.NET XLL UDF插件和自動化UDF插件(XLL UDF插件提供了顯着的性能優勢,但對訪問Excel對象模型的訪問稍微受限)

相關問題