在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)