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