我想在我的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#代码?
答案 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的机制非常类似。