将用户定义的函数添加到Visual Studio Excel加载项

在Visual Studio中,我有一个Excel 2010加载项目。 我怎样才能有这个项目创build以下模块:

在这里输入图像说明

我知道我可以用该模块保存该工作簿,然后将其与我的插件一起使用。如果我可以让我的插件创build该模块,那将是非常好的…

可以创build模块。 但是,要使用此function,必须在Excel中select“信任访问VB项目模型”。 如果未select信任设置,则会引发访问被拒绝的错误。

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,一般的build议是使用自动化加载项(如Sid的链接build议)。

另一种select是从VBA调用受pipeVSTOfunction。 再次这不是build议,但可能的。

(从链接教程概述)以下是从VBA调用托pipe函数的简单方法。

用VSTO中的函数创build一个类

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

把你的class级连接到VSTO的VBA

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

为托pipe代码创build挂钩,并为VBA中的函数创build一个包装器

在电子表格或文档中的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 

现在你可以在单元格中input= GetNumberFromVSTO(),当excel开始时,单元格的值应该是42。

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

如果你真正想要做的是编写.NET UDF或者一个组合的.NET应用程序级命令和UDF插件,那么使用VSTO目前还不是一个好的解决scheme:
我会build议使用Addin Express (费用)或Excel DNA (免费)。
这两种方法都允许您创build.NET XLL UDF插件和自动化UDF插件(XLL UDF插件提供了显着的性能优势,但对访问Excel对象模型的访问稍微受限)

VSTO插件不能创buildUDF,所以你需要为函数创build一个单独的插件。 虽然这个插件可以和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; } }