在C#中创buildExcelmacros定义
我想创build一个函数在我的C#代码,可以从VB调用,就像它是一个macros。
即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使用我的function作为macros。 然后我的c ++代码可以从VB调用,或使用ExecuteExcel4Macro
。 我也可以使用它来注册用户定义的函数(UDF) – 只需要使用魔术1
。 (有关xlfRegister的更多详细信息,请访问: http : //msdn.microsoft.com/en-us/library/bb687900.aspx )
C#使创buildUDF非常容易,但是我需要一种方法来将我的函数注册为macros而不是公式。
那么我怎么能有一个macros调用我的C#代码?
据我所知,在.NET中没有可用的便利层,它允许您在Excel中注册macros,就像用户定义的函数一样。
解决问题的方法是在托pipe的C ++ / CLI中创build一个包装器DLL,该DLL注册该macros,然后调用托pipe的C#代码。
用reflection的方式,你甚至应该能够创build一个通用的包装器,加载一个C#程序集,枚举所有公共方法(或者所有具有特定定制属性的公共方法),然后dynamic地注册这些方法。
我没有检查过,但我认为注册UDF的机制的工作方式非常相似。
首先,您可以在C#或VB.NET中使用.xlls,而无需使用Excel-Dna (可从http://exceldna.codeplex.com免费获得)处理XLOPER或C ++。
所以你可以使你的C#方法在Excel中作为一个函数(通过types为0xA3的包装描述)可用,只需添加一个属性
[ExcelFunction(Name="MacroName")] public object csharp_method(String parameter) {...}
其次,你可以使用Application.Run从VBA调用函数和macros。 所以你可以说
Dim result As Variant result = Application.Run("MacroName", mystring)