使用C#创建新的Excel公式/函数

时间:2015-03-18 20:32:17

标签: c# excel excel-vba visual-studio-2013 add-in vba

我们希望能够以编程方式创建一个Excel工作簿,该工作簿可以从单元格中调用自定义代码。单元格看起来像:

=MyCode(A1:A10)

我的第一个想法是使用VBA,但由于该算法是专有的,因此希望它受到保护。我可以在上面输入密码,但是有关如何绕过这些密码的详细记录(在StackOverflow上)。

我的第二个想法是在Visual Studio中创建一个Excel 2013工作簿项目,但我还没有找到有关如何在C#中公开函数的任何有用信息,因此它可以像我描述的那样被调用。

接下来我想到让VBA调用C#,并在https://msdn.microsoft.com/en-us/library/bb608613.aspx找到指令。我按照这些说明操作,但当我尝试运行VBA代码时,我得到GetManagedClass函数的错误:不支持对象库功能。

对于如何做这样的事情有什么好的参考吗?

2 个答案:

答案 0 :(得分:3)

您正在寻找Excel-DNA。 这个开源库允许您创建托管Excel加载项,并支持创建用户定义的函数,还支持宏,实时RTD数据源等。

在C#中创建Excel UDF就像这样简单:

[ExcelFunction(Description = "My first .NET function")]
public static string SayHello(string name)
{
    return "Hello " + name;
}

你可以从一个小区打电话:

=SayHello("Walter")

对于使用.NET的代码保护,您需要使用混淆器 - 有各种免费和付费的可用。

答案 1 :(得分:0)

我也试过这个样本,但同样的错误。我找到了一个适合我的解决方案。

在ISheet1.cs文件中,使用以下代码替换ISheet1接口声明。此代码使ISheet1接口公开,并应用http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comvisibleattribute.aspx属性使接口对COM可见。

C#

[System.Runtime.InteropServices.ComVisible(true)]
public interface ISheet1
{
    void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
}

全文她:http://www.nullskull.com/q/10059408/c-code-to-set-excel-workbook-macro-enabled-and-to-trust-vba-projects.aspx