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

时间:2012-12-19 15:52:03

标签: c# excel user-defined-functions excel-addins

在visual studio中,我有一个Excel 2010加载项项目。如何让该项目创建以下模块:

enter image description here

我知道我可以使用该模块保存该工作簿,然后将其与我的添加一起使用。如果我可以让我的插件创建该模块,这将是很好的...

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

我不认为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

答案 2 :(得分:2)

如果您真正想要做的是编写.NET UDF,或组合.NET应用程序级别命令和UDF插件,那么使用VSTO目前不是一个好的解决方案:
我建议使用{{3 }}(成本)或Addin Express(免费)。
这两个允许您创建.NET XLL UDF插件和Automation UDF插件(XLL UDF插件提供显着的性能优势,但访问受限更多)到Excel对象模型)

答案 3 :(得分:1)

VSTO插件无法创建UDF,因此您需要为这些功能创建单独的插件。虽然这个插件可以和VSTO插件在同一个DLL中,但是如果没有特殊的诡计,你就无法在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;
    }
}
相关问题