[英]Add user defined function to Visual Studio Excel Add-in
在visual studio中,我有一個Excel 2010加載項目。 如何讓該項目創建以下模塊:
我知道我可以使用該模塊保存該工作簿,然后將其與我的添加一起使用。如果我可以讓我的插件創建該模塊,這將是很好的...
可以創建模塊。 但是,為此,必須在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支持Excel UDF,一般建議使用自動加載項(如Sid鏈接所示)。
另一種選擇是從VBA調用托管VSTO功能。 再一次這不是推薦的,但可能。
(從鏈接回顧教程)以下是從VBA調用托管函數的簡單方法。
使用VSTO中的函數創建一個類
<System.Runtime.InteropServices.ComVisible(True)> _
Public Class MyManagedFunctions
Public Function GetNumber() As Integer
Return 42
End Function
End Class
在VSTO中將您的課程連接到VBA
Private Sub ThisWorkbook_Open() Handles Me.Open
Me.Application.Run("RegisterCallback", New MyManagedFunctions)
End Sub
為托管代碼創建Hook,為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
如果您真正想要的是編寫.NET UDF,或組合的.NET應用程序級命令和UDF插件,那么使用VSTO目前不是一個好的解決方案:
我建議使用Addin Express (費用)或Excel DNA (免費)。
這兩個都允許您創建.NET XLL UDF插件和Automation UDF插件(XLL UDF插件提供顯着的性能優勢,但對Excel對象模型的訪問稍有限制)
VSTO插件無法創建UDF,因此您需要為這些函數創建單獨的插件。 雖然這個插件可以和VSTO插件在同一個DLL中,但是如果沒有特殊的技巧,你就無法在VSTO和UDF之間進行通信。
我有一篇關於此的博客文章 。 它為您提供了一個包含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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.