繁体   English   中英

如何以编程方式删除Excel UDF

[英]How to remove an Excel UDF programmatically

我有一个旧的Excel插件(用VBA编写),现在我使用.NET,ExcelDNA,NetOffice重新编写了旧的插件。 在旧的外接程序中,有一个UDF,例如OldUDF,在新的外接程序中,有一个NewUDF,两个UDF做相同的事情并接受相同的参数。 但是它们具有不同的函数名称。 由于遗留原因,某些客户端具有旧的插件,某些客户端具有新的插件。 一些客户同时拥有。 当他们都安装了两个Excel插件时,我想提供一个复选框,其中将新插件中的oldUDF转发到newUDF。 选中此复选框后,oldUDF将作为newUDF转发。 如果未选中此复选框,则不会转发oldUDF。 我在新的插件中定义了oldUDF和newUDF,但是当取消选中该复选框时,我不知道如何删除oldUDF的定义。 谢谢

编辑:

这是我尝试过的方法,但是不起作用。

#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,我将从文件中读取正向值(true或false),

        var forward = Helper.ReadForwardOldUDFSettingFromAFile();
        if(forward)
        {
             #define FORWARD
        }

但出现编译错误

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

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

但是,如果前向值是false,我找不到在C#中注销或删除XLL的方法吗?

编辑:我找到了http://msdn.microsoft.com/en-us/library/office/bb687866.aspx ,但是不确定如何在C#中使用它

谢谢

谢谢,哥维特。 他回答了另一组的问题。 有用! http://exceldna.codeplex.com/discussions/436393

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); 
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM