如何以编程方式删除Excel自定义项

如何以编程方式删除Excel自定义项,excel,add-in,user-defined-functions,excel-dna,Excel,Add In,User Defined Functions,Excel Dna,我有一个旧的Excel加载项(用VBA编写),现在我使用.NET、ExcelDNA和NetOffice重新编写旧加载项。在旧的外接程序中,有一个自定义项,比如说,旧的自定义项,在新的外接程序中,有一个新的自定义项,两个自定义项做相同的事情,接受相同的参数。但是它们有不同的函数名。 出于遗留原因,有些客户端有旧的加载项,有些客户端有新的加载项。 有些客户两者都有。 当它们都安装了Excel加载项时,我想提供一个复选框,在新加载项中显示forward oldUDF to newUDF。选中该复选框后

我有一个旧的Excel加载项(用VBA编写),现在我使用.NET、ExcelDNA和NetOffice重新编写旧加载项。在旧的外接程序中,有一个自定义项,比如说,旧的自定义项,在新的外接程序中,有一个新的自定义项,两个自定义项做相同的事情,接受相同的参数。但是它们有不同的函数名。 出于遗留原因,有些客户端有旧的加载项,有些客户端有新的加载项。 有些客户两者都有。 当它们都安装了Excel加载项时,我想提供一个复选框,在新加载项中显示forward oldUDF to newUDF。选中该复选框后,oldUDF将作为newUDF转发。如果未选中该复选框,则不会转发oldUDF。 我在新加载项中定义了oldUDF&newUDF,但不知道在取消选中复选框时如何删除oldUDF的definiatino。谢谢

编辑:

这是我试过的,但不起作用

#if FORWARD
        public static object OldUDF([ExcelArgument(AllowReference = true, Name = "Symbol",
            Description = "is a futures symbol as defined in *** Database.")]string symbol,
            [ExcelArgument(AllowReference = true, Name = "Column",
                Description = "is a column associated with a symbol")]string column,
            [ExcelArgument(AllowReference = true, Name="Date",
                Description = "is the date for which you want the value")]object onDate,
                object fillOpt, object frequency)
        {
            return NewUDF(symbol, column, onDate, fillOpt, frequency);
        }
#endif 
在AutoOpen()中, 如果forward为true,我将从文件中读取forward值(true或false)

        var forward = Helper.ReadForwardOldUDFSettingFromAFile();
        if(forward)
        {
             #define FORWARD
        }
但是我得到了一个编译错误

再次编辑: 我成功地注册了 我将OldUDF的声明放在一个单独的dll中,比如OldUDF.dll 创建另一个olduf.xll,olduf.dna

在AutoOpen中,我将检查转发值(来自文件)是否为真,我将执行以下操作 Excel.Application.RegisterXLL(“olderUDF.xll”); 这个很好用

但是,如果forward值为false,我无法找到在C#?

编辑:我找到了,但不确定如何在C中使用它#


谢谢你,戈弗特。他回答了另一组人的问题。它起作用了!


你不介意至少与我们分享你的一部分相关工作吗?只是为了支持@PeterL,谢谢,请参阅editI-find,但它没有一个示例来说明如何使用它
private static void UnregisterFunction(string name) 
{ 
    // get the path to the XLL 
    var xllName = XlCall.Excel(XlCall.xlGetName); 

    // get the registered ID for this function and unregister 
    var regId = XlCall.Excel(XlCall.xlfEvaluate, name); 
    XlCall.Excel(XlCall.xlfSetName, name); 
    XlCall.Excel(XlCall.xlfUnregister, regId); 

    // reregister the function as hidden and then unregister (clears the function wizard) 
    var reregId = XlCall.Excel(XlCall.xlfRegister, xllName, "xlAutoRemove", 
    "I", name, ExcelMissing.Value, 2); 
    XlCall.Excel(XlCall.xlfSetName, name); 
    XlCall.Excel(XlCall.xlfUnregister, reregId); 
}