F# Excel DNA UDF获取未处理的值作为输入

F# Excel DNA UDF获取未处理的值作为输入,f#,excel-dna,excel-udf,F#,Excel Dna,Excel Udf,我用F#编写了几个helper函数,使我能够通过COM/PIA接口处理Excel的动态特性。但是,当我在Excel DNA UDF中使用这些函数时,它们不会像预期的那样工作,因为Excel DNA正在预处理Excel中数组中的值。 e、 g.null变为ExcelDna.Integration.ExcelEmpty 这干扰了我自己的验证代码,该代码预期为null。我可以通过在模式匹配中添加一个附加案例来解决此问题: let (|XlEmpty|_|) (x: obj) = match x

我用F#编写了几个helper函数,使我能够通过COM/PIA接口处理Excel的动态特性。但是,当我在Excel DNA UDF中使用这些函数时,它们不会像预期的那样工作,因为Excel DNA正在预处理Excel中数组中的值。 e、 g.
null
变为
ExcelDna.Integration.ExcelEmpty

这干扰了我自己的验证代码,该代码预期为
null
。我可以通过在模式匹配中添加一个附加案例来解决此问题:

let (|XlEmpty|_|) (x: obj) =
    match x with
    | null -> Some XlEmpty
    | :? ExcelDna.Integration.ExcelEmpty -> Some XlEmpty
    | _ -> None
然而,一次又一次地转换感觉像是一种浪费。有没有办法告诉Excel DNA不要对UDF中的范围值进行额外处理,并将其提供给COM/PIA接口?i、 e.
Range.Value XlRangeValueDataType.xlRangeValueDefault

编辑: 我将我的参数声明为
obj
,如下所示:

[<ExcelFunction(Description = "Validates a Test Table Row")>]
let isTestRow (headings: obj) (row: obj) =
    let validator = TestTable.validator
    let headingsList = TestTable.testHeadings
    validateRow validator headingsList headings row
[]
let Isestrow(标题:obj)(行:obj)=
让validator=TestTable.validator
让headingsList=TestTable.testHeadings
validateRow validator标题列表标题行

我做了更多的挖掘,@Jim Foye建议的问题也证实了这一点。对于UDF,Excel DNA通过C API而不是COM工作,因此必须自己进行封送处理。可能的值显示在此文件中:

使用
ExcelEmpty
(用户提供了一个空单元格)的原因是,对于UDF,参数也可以是
ExcelMissing
(用户没有提供参数),这两个参数可能都是合理的
null
,需要消除歧义


我将调整模式匹配,使其与COM封送和ExcelDNA封送兼容。

我已经做了更多的挖掘,@Jim Foye建议的问题也证实了这一点。对于UDF,Excel DNA通过C API而不是COM工作,因此必须自己进行封送处理。可能的值显示在此文件中:

使用
ExcelEmpty
(用户提供了一个空单元格)的原因是,对于UDF,参数也可以是
ExcelMissing
(用户没有提供参数),这两个参数可能都是合理的
null
,需要消除歧义


我将调整模式匹配以与COM封送和ExcelDNA封送兼容。

是否将UDF参数声明为对象?可能会有帮助。您是否将UDF参数声明为对象?可能会有帮助。