在Visual Studio中,我有一個Excel 2010加載項項目。我怎樣纔能有一個項目創建以下模塊:將用戶定義的函數添加到Visual Studio Excel加載項
我知道我可以保存工作簿與模塊,然後用我的外接使用它這將是很好,如果我可以有我的外接創建模塊...
在Visual Studio中,我有一個Excel 2010加載項項目。我怎樣纔能有一個項目創建以下模塊:將用戶定義的函數添加到Visual Studio Excel加載項
我知道我可以保存工作簿與模塊,然後用我的外接使用它這將是很好,如果我可以有我的外接創建模塊...
我不認爲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
這就是我現在所擁有的。如果我可以發佈插件而不必發佈啓用宏的工作簿(book1.xlsx),那將會很好,所以我想這不可能吧? –
它可以創建模塊。但是,要使用此功能,必須在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);
你很討厭:) –
一個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;
}
}
如果你真的想要做的是寫.NET的UDF,或組合.NET應用程序級指揮和UDF插件然後使用VSTO目前不是一個很好的解決方案:
我會建議您使用Addin Express(費用)或Excel DNA(免費)。這兩個函數都允許您創建.NET XLL UDF插件和自動化UDF插件(XLL UDF插件提供了顯着的性能優勢,但對訪問Excel對象模型的訪問稍微受限)
也許[this](http:// blogs.msdn.com/b/eric_carter/archive/2004/12/01/writing-user-defined-functions-for-excel-in-net.aspx)可能有幫助。 –
*** Nooooo!***在走這條路之前要三思。我強烈建議您使用UDF方法,以便您的代碼邏輯是:a)受Excel用戶保護,可以更改關鍵邏輯*,這將很難檢測到* b)在一個加載項中並且不會在多個工作簿中重複出現c)不需要Trusted許可d)單元測試e)用最新的語言編寫等等 –