簡體   English   中英

將用戶定義的函數添加到Visual Studio Excel加載項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM