Как удалить Excel UDF программно
У меня есть старый плагин для Excel (написанный на VBA), теперь я переписываю старый плагин, используя.NET, ExcelDNA, NetOffice. В старом дополнении есть UDF, скажем, OldUDF, в новом дополнении есть NewUDF, два UDF делают то же самое и принимают одинаковые параметры. но у них разные имена функций. По устаревшей причине у некоторых клиентов есть старое дополнение, у некоторых - новое. У некоторых клиентов есть оба. Когда у них установлены оба надстройки Excel, я хочу установить флажок для пересылки oldUDF на newUDF в новом надстройке. Когда флажок установлен, oldUDF пересылается как newUDF. Если флажок не установлен, oldUDF не будет пересылаться. Я определяю oldUDF и 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() я буду читать прямое значение (true или false) из файла, если forward равно true,
var forward = Helper.ReadForwardOldUDFSettingFromAFile();
if(forward)
{
#define FORWARD
}
но я получаю ошибку компиляции
Редактировать снова: мне удалось успешно зарегистрироваться, я поместил объявление OldUDF в отдельную DLL, скажем, oldUDF.dll создать еще один oldUDF.xll, oldUDF.dna.
В AutoOpen я проверю, является ли значение пересылки (из файла) истинным, я сделаю Excel.Application.RegisterXLL("oldUDF.xll"); Это отлично работает.
Тем не менее, в случае если значение forward равно false, я не могу найти способ отменить регистрацию или удалить XLL в C#?
Изменить: я нашел http://msdn.microsoft.com/en-us/library/office/bb687866.aspx, но не уверен, как использовать его в C#
Спасибо
1 ответ
Спасибо, Говерт. Он ответил на вопрос из другой группы. Оно работает! 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);
}