代码之家  ›  专栏  ›  技术社区  ›  Tim

在C中创建Excel宏定义#

  •  2
  • Tim  · 技术社区  · 14 年前

    我想在我的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-Tobe(这是一个令人头疼的问题),它是C++的。

    魔力 2 告诉Excel将我的函数用作宏。然后我的C++代码可以从VB调用,或者使用 ExecuteExcel4Macro . 我也可以用它注册用户定义函数(UDF),只需使用一个magic 1 相反。(有关xlfregister的更多详细信息,请参见: http://msdn.microsoft.com/en-us/library/bb687900.aspx )

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

    那么如何让宏调用我的C代码呢?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Dirk Vollmar    14 年前

    据我所知,.NET中没有方便层允许您在Excel中注册宏,因为它是用户定义函数。

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

    通过反射的方式,您甚至应该能够创建一个通用包装器,它加载C程序集,枚举所有公共方法(或具有特定自定义属性的所有公共方法),然后动态注册这些方法。

    我没有检查过,但是我假设注册UDF的机制以非常相似的方式工作。

        2
  •  2
  •   Govert    14 年前

    首先,你可以用C语言或VB.NET制作XLL而不使用XLopor或C++。 Excel-Dna (免费从 http://exceldna.codeplex.com )

    因此,只需添加一个属性,就可以在Excel中(通过类型为0xa3描述的包装器)将C方法作为函数使用。

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

    其次,可以使用application.run从VBA调用函数和宏。所以你可以说

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