如何在ExcelDNA XLL UDF

时间:2016-10-24 06:28:31

标签: excel excel-dna

我真的很难理解如何允许将UDF作为数组公式输入。我已经浏览了各个帖子以获得答案,但我认为我的理解一定存在差距。

使用ExcelDNA tutorial double MultiplyThem(双x,双y)作为示例进行演示。

如果我选择一系列单元格并输入 {= MultiplyThem({1; 2; 3; 4},5)} 作为数组公式,我希望看到填充的选定列范围与

5 10 15 20

然而,我得到的是全部5s。此外,如果我的目标范围大于可用值的数量,我希望看到#N / A值,但我再次看到值5。

如何处理数组公式?我是否需要返回double [,]的UDF重载,或者是否有一些内置的Excel功能,它将使用适当的数组值重复调用我的UDF。

1 个答案:

答案 0 :(得分:2)

Excel UDF可以将数组作为输入,并返回数组作为结果,但必须明确地完成。不支持自动扩展标量函数以处理数组。

如果您将public static object MuliplyThem(object x, object y) {…}功能的签名更改为

{=MultiplyThem({1,2,3,4},5)}

当您调用#VALUE时,您的函数将收到完整数组。

然后,您需要在函数中添加类型检查,以确保正确处理不同的选项。 (当您将参数声明为'double'时,Excel会尝试转换输入,如果不兼容则返回[ExcelFunction(Description="Describes the value passed to the function.")] public static string Describe(object arg) { if (arg is double) return "Double: " + (double)arg; else if (arg is string) return "String: " + (string)arg; else if (arg is bool) return "Boolean: " + (bool)arg; else if (arg is ExcelError) return "ExcelError: " + arg.ToString(); else if (arg is object[,]) // The object array returned here may contain a mixture of different types, // reflecting the different cell contents. return string.Format("Array[{0},{1}]", ((object[,])arg).GetLength(0), ((object[,])arg).GetLength(1)); else if (arg is ExcelMissing) return "<<Missing>>"; // Would have been System.Reflection.Missing in previous versions of ExcelDna else if (arg is ExcelEmpty) return "<<Empty>>"; // Would have been null else return "!? Unheard Of ?!"; } 。在这里,您必须处理类型检查和转换。)

“object”参数可以获得的所有值的详尽示例如下所示:

object[,]

在您的情况下,您将以特殊方式处理double[,]数组,并在适当时返回object[,]数组或ExcelError.ExcelErrorValue数组。输入不是您可以处理的类型,您可以返回错误,很可能是{{1}}。