如何以编程方式删除 Excel UDF

Posted

技术标签:

【中文标题】如何以编程方式删除 Excel UDF【英文标题】:How to remove an Excel UDF programmatically 【发布时间】:2013-03-11 16:09:27 【问题描述】:

我有一个旧的 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() 中, 我将从文件中读取转发值(真或假),如果转发为真,

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

但我得到一个编译错误

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

在 AutoOpen 中,我将检查转发值(来自文件)是否为真,我会这样做 Excel.Application.RegisterXLL("olderUDF.xll"); 这工作正常。

但是,如果 forward 值为 false,我找不到在 C# 中取消注册或删除 XLL 的方法?

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

谢谢

【问题讨论】:

您不介意与我们分享您的相关工作 - 只是为了支持What have you tried? @PeterL,谢谢,查看编辑 我找到了msdn.microsoft.com/en-us/library/office/…,但它没有一个例子来说明如何使用它 【参考方案1】:

谢谢,Govert。他回答了另一组的问题。有用! 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); 
 

【讨论】:

以上是关于如何以编程方式删除 Excel UDF的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式删除 Excel 工作表 VB.NET

如何在 C# 的线程中以编程方式复制 Excel 文件时修复访问拒绝错误

如何以编程方式将 Excel 数据导入 Access 表?

如何使用 vb.net 以编程方式对 Excel 中的列进行排序?

如何以编程方式执行Microsoft Excel Office脚本?

如何以编程方式填写和获取 Excel 电子表格的 PDF 输出?