在C#中创建Excel宏定义

时间:2010-10-26 21:36:11

标签: c# excel

我想在我的C#代码中创建一个函数,可以从VB调用它,就好像它是一个宏。

即。 VB代码应该能够做到:

sub vb_method
    csharp_method("some_parameters")
end sub

并调用我的C#方法:

public object csharp_method(String parameter) {
    ...
}

我知道这可以用C ++完成:

LPXLOPER retval;
LPXLOPER module;  // = something
LPXLOPER parameters[] = { module,
                         "cpp_function", "parameter_type_info",
                         "MacroName", "text",
                         2,
                         ... };
Excel4v(xlfRegister, retval, parameter_count, parameters);

这会注册我的cpp_function,以便可以通过名称MacroName来调用它。但它使用的是XLOPER(这很令人头疼),而且它是用C ++编写的。

魔术2告诉Excel将我的函数用作宏。然后我的c ++代码可以从VB调用,或者使用ExecuteExcel4Macro调用。我也可以使用它来注册用户自定义函数(UDF) - 只需使用魔术1。 (有关xlfRegister的详细信息,请访问:http://msdn.microsoft.com/en-us/library/bb687900.aspx

C#使得创建UDF变得非常容易,但是我需要一种方法来将我的函数注册为宏而不是公式。

那么我怎么能用宏调用我的C#代码?

2 个答案:

答案 0 :(得分:2)

首先,您可以使用Excel-Dna(可从http://exceldna.codeplex.com免费获得)在C#或VB.NET中创建.xlls而无需处理XLOPER或C ++。

因此,只需添加一个属性,就可以将您的C#方法作为Excel中的函数(通过0xA3类型的包装器)提供

[ExcelFunction(Name="MacroName")]
public object csharp_method(String parameter) 
{...}

其次,您可以使用Application.Run从VBA调用函数和宏。所以你可以说

  Dim result As Variant
  result = Application.Run("MacroName", mystring)

答案 1 :(得分:1)

据我所知,.NET中没有可用的便利层允许您在Excel中注册宏,就像用户定义的函数一样。

解决问题的方法是在托管C ++ / CLI中创建一个包装器DLL,它注册宏,然后调用托管C#代码。

使用反射方法,您甚至可以创建一个通用包装器,它可以加载C#程序集,枚举所有公共方法(或具有特定自定义属性的所有公共方法),然后动态注册这些方法。 / p>

我没有检查过,但我认为注册UDF的机制非常类似。