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

Excel DNA UDF obtain unprocessed values as inputs

我在 F# 中编写了几个辅助函数,使我能够通过 COM/PIA 接口处理 Excel 的动态特性。但是,当我在 Excel-DNA UDF 中使用这些函数时,它们无法按预期工作,因为 Excel-DNA 正在预处理来自 excel 的数组中的值。 例如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 接口的它们?即 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

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

https://github.com/Excel-DNA/ExcelDna/blob/2aa1bd9afaf76084c1d59e2330584edddb888eb1/Distribution/Reference.txt

使用 ExcelEmpty(用户提供了一个空单元格)的原因是对于 UDF,参数也可以是 ExcelMissing(用户未提供任何参数),这可能都是合理的null 并且有必要去歧义。

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