ExcelDna F#和可选参数

ExcelDna F#和可选参数,f#,excel-dna,F#,Excel Dna,对于标量(即类似于非数组的)可选参数,我将使用以下模式: [<ExcelFunction(Category= "Test", Description= "Test optional arguments.")>] let test_test1 ([<ExcelArgument(Description= "Optional. This is a double. Default is 42.0.")>] arg1 : obj) : double = match arg

对于标量(即类似于非数组的)可选参数,我将使用以下模式:

[<ExcelFunction(Category= "Test", Description= "Test optional arguments.")>]
let test_test1 ([<ExcelArgument(Description= "Optional. This is a double. Default is 42.0.")>] arg1 : obj) : double = 
    match arg1 with
    | :? ExcelMissing -> 42.0  // the argument was missing
    | :? double as d  -> d     // the argument was a double
    | _               -> -1.0  // otherwise

。。。但不幸的是,我得到了一个
#NUM输出。只有当我不传递任何信息时,我才能正确地获得[42.0,42.0]数组。

这涵盖了所有可能的情况:


[<ExcelFunction("describes the input argument")>]
let describe(arg1 : obj) : string =
    match arg1 with
        | :? double as d        -> sprintf "Double: %f" d
        | :? string as s        -> "String: " + s
        | :? bool as b          -> sprintf "Boolean: %b" b
        | :? ExcelError as err  -> sprintf "ExcelError: %A" err
        | :? (obj[,]) as arr    -> sprintf "Array[%i, %i]" (Array2D.length1 arr) (Array2D.length2 arr)
        | :? ExcelEmpty         -> "<<Empty>>"
        | :? ExcelMissing       -> "<<Missing>>"
        | _                     -> "!? Unheard of ?!"

[]
让我们描述(arg1:obj):字符串=
将arg1与
| :? 双重身份->sprintf“双重身份:%f”d
| :? 字符串形式为s->“字符串:”+s
| :? 布尔值为b->sprintf“布尔值:%b”b
| :? ExcelError作为错误->sprintf“ExcelError:%A”错误
| :? (obj[,])作为arr->sprintf“数组[%i,%i](Array2D.length1 arr)(Array2D.length2 arr)
| :? ExcelEmpty->“
| :? Excel缺少->“”
|“!?闻所未闻?!”

这涵盖了所有可能性:


[<ExcelFunction("describes the input argument")>]
let describe(arg1 : obj) : string =
    match arg1 with
        | :? double as d        -> sprintf "Double: %f" d
        | :? string as s        -> "String: " + s
        | :? bool as b          -> sprintf "Boolean: %b" b
        | :? ExcelError as err  -> sprintf "ExcelError: %A" err
        | :? (obj[,]) as arr    -> sprintf "Array[%i, %i]" (Array2D.length1 arr) (Array2D.length2 arr)
        | :? ExcelEmpty         -> "<<Empty>>"
        | :? ExcelMissing       -> "<<Missing>>"
        | _                     -> "!? Unheard of ?!"

[]
让我们描述(arg1:obj):字符串=
将arg1与
| :? 双重身份->sprintf“双重身份:%f”d
| :? 字符串形式为s->“字符串:”+s
| :? 布尔值为b->sprintf“布尔值:%b”b
| :? ExcelError作为错误->sprintf“ExcelError:%A”错误
| :? (obj[,])作为arr->sprintf“数组[%i,%i](Array2D.length1 arr)(Array2D.length2 arr)
| :? ExcelEmpty->“
| :? Excel缺少->“”
|“!?闻所未闻?!”

最好将类型声明为“obj”,然后从那里进行检查。谢谢,我尝试过(请参见我的编辑部分),但没有成功。我做错了什么?你认为“;:?(double[])”配得上你吗?我希望它作为一个obj数组出现在您的面前。另外,您不能真正返回array.empty作为结果。这有几个问题,一个是显而易见的,一个是稍微微妙的。明显的问题是,您必须将Excel认为合法的东西放回单元格(如果您将UDF作为数组公式调用,则为单元格)。也就是说,数字(所有数字实际上都是浮点)、字符串、布尔值或一个特殊的Excel错误值。Excel不知道如何处理空数组。更微妙的问题是语义:在这种情况下,您打算返回错误值还是默认值?@Jim Foye,
|::?(double[])
似乎不匹配。
|:?(obj[])
但是
|::?(obj[,])
确实匹配。最好将类型声明为“obj”,然后从那里进行检查。谢谢,我尝试过(请参见我的编辑部分),但没有成功。我做错了什么?你认为“;:?(double[])”配得上你吗?我希望它作为一个obj数组出现在您的面前。另外,您不能真正返回array.empty作为结果。这有几个问题,一个是显而易见的,一个是稍微微妙的。明显的问题是,您必须将Excel认为合法的东西放回单元格(如果您将UDF作为数组公式调用,则为单元格)。也就是说,数字(所有数字实际上都是浮点)、字符串、布尔值或一个特殊的Excel错误值。Excel不知道如何处理空数组。更微妙的问题是语义:在这种情况下,您打算返回错误值还是默认值?@Jim Foye,
|::?(double[])
似乎不匹配。
|:?(obj[])
但是
|::?(obj[,])
不匹配。谢谢!这是否意味着没有直接的方法来匹配像
obj[]
(obj的1d数组)或
double[,]
(基本类型的2d数组)这样的东西?也就是说,为了匹配可选的一维双精度数组,我应该确定1)它是否缺少参数,2)如果没有缺少,它是二维数组,3)如果它是二维数组,它的长度是否等于1和4)如果它确实是obj的一维数组,所有元素都是相同类型的(例如,这里都是双精度元素)?如果您的参数类型为
obj
,则永远不会从Excel DNA封送层获得
double[,]
或1d
obj[]
。上面的代码片段显示了可能得到的所有不同类型。与内置函数一样,如果无法处理给定参数,可以返回类似于
ExcelError.ExcelErrorValue
(#VALUE)的内容。Govert的答案是正确的(当然,他是Excel Dna的作者)。所以,一旦你知道你拥有什么,你拥有的是obj[,],你就必须做更多的工作来看看里面有什么。你不能假设有人在给你双打,例如,可能有其他类型加上空单元格(将丢失)。谢谢!这是否意味着没有直接的方法来匹配像
obj[]
(obj的1d数组)或
double[,]
(基本类型的2d数组)这样的东西?也就是说,为了匹配可选的一维双精度数组,我应该确定1)它是否缺少参数,2)如果没有缺少,它是二维数组,3)如果它是二维数组,它的长度是否等于1和4)如果它确实是obj的一维数组,所有元素都是相同类型的(例如,这里都是双精度元素)?如果您的参数类型为
obj
,则永远不会从Excel DNA封送层获得
double[,]
或1d
obj[]
。上面的代码片段显示了可能得到的所有不同类型。与内置函数一样,如果无法处理给定参数,可以返回类似于
ExcelError.ExcelErrorValue
(#VALUE)的内容。Govert的答案是正确的(当然,他是Excel Dna的作者)。所以,一旦你知道你拥有什么,你拥有的是obj[,],你就必须做更多的工作来看看里面有什么。你不能假设有人在传递你的双倍密码,例如,可能有其他类型的密码加上空白单元格(可能会丢失)。

[<ExcelFunction("describes the input argument")>]
let describe(arg1 : obj) : string =
    match arg1 with
        | :? double as d        -> sprintf "Double: %f" d
        | :? string as s        -> "String: " + s
        | :? bool as b          -> sprintf "Boolean: %b" b
        | :? ExcelError as err  -> sprintf "ExcelError: %A" err
        | :? (obj[,]) as arr    -> sprintf "Array[%i, %i]" (Array2D.length1 arr) (Array2D.length2 arr)
        | :? ExcelEmpty         -> "<<Empty>>"
        | :? ExcelMissing       -> "<<Missing>>"
        | _                     -> "!? Unheard of ?!"