使用 Excel-DNA 或 Excel.Interop 将一些 Excel 图表系列值设置为 #N/A

Set some of the Excel Chart Series values to #N/A using Excel-DNA or Excel.Interop

我正在使用 ExcelDNA 和 Microsoft.Office.Interop.Excel 将给定 Excel 图表系列的一些 y 值设置为 #N/A。 (*)

这就是我在 VBA 中想要实现的目标。这按预期工作:

Sub test()
  Dim xdata As Variant, ydata As Variant
  Dim chrt As Chart
  
  Set chrt = ActiveWorkbook.Worksheets("Sheet1").ChartObjects("Chart 1").Chart

  With chrt
    xdata = Array(0, 1, 2, 3, 4, 5)
    ydata = Array(0, 10, 20, CVErr(xlErrNA), 40, 50)  'Works as expected
    .SeriesCollection(1).XValues = xdata
    .SeriesCollection(1).Values = ydata
  End With

End Sub

在 F# 中,我尝试了以下两种方法,none 有效:

module TEST =
    open Microsoft.Office.Interop.Excel
    open ExcelDna.Integration

    let series : Series = 
        let app = ExcelDnaUtil.Application :?> Application
        let wks   = (app.Sheets.Item "Sheet1") :?> Worksheet
        let cho = wks.ChartObjects("Chart 1") :?> ChartObject
        let ch = cho.Chart
        let s = ch.SeriesCollection(1) :?> Series
        s

    [<ExcelFunction(Category="Chart", Description="")>]
    let setYSeries1() : obj = 
        let s = series
        s.XValues <- [| 0.0; 1.0; 2.0; 3.0; 4.0; 5.0 |]
        s.Values <- [| 0.0; 10.0; 20.0; 30.0; 40.0; 50.0 |] |> Array.map box // Works as expected.
        box "Done."

    [<ExcelFunction(Category="Chart", Description="")>]
    let setYSeries2() : obj = 
        let s = series
        s.XValues <- [| 0.0; 1.0; 2.0; 3.0; 4.0; 5.0 |]
        s.Values <- [| box 0.0; box 10.0; box 20.0; ExcelError.ExcelErrorNA |> box; box 40.0; box 50.0 |] |> Array.map box // y = 42 for x = 3, instead of y = #N/A
        box "Done."

    [<ExcelFunction(Category="Chart", Description="")>]
    let setYSeries3() : obj = 
        let s = series
        s.XValues <- [| 0.0; 1.0; 2.0; 3.0; 4.0; 5.0 |]
        s.Values <- [| box 0.0; box 10.0; box 20.0; ((int32) -2146826246) |> box; box 40.0; box 50.0 |]  // y = -2146826246 for x = 3, instead of y = #N/A
        box "Done."

setYSeries1 是没有#N/A 值的基本情况。它工作正常。

setYSeries2 是自然的方式,使用 ExcelDNA 的 ExcelError.ExcelErrorNA 枚举,但 #N/A 被图表中的枚举值替换 (y = 42) .

我在阅读 this article 后尝试了 setYSeries3,在内部,Excel 使用整数来表示像 #N/A 这样的错误(而 Excel 使用双倍表示数字),用 (int) -2146826246 代替 #N/A 值。也不走运。

我的问题:我应该怎么做才能将#N/A 值传递给系列的 .Values 数组?

(*) 我需要通过数组设置系列的 .Values 属性,而不是通过 sheet 范围。

您需要将错误值转换为 .NET 将理解为 COM 错误类型的类型(如 VBA 中的 CVErr)。

有一个 Excel-DNA 助手将 C API 错误枚举映射到 COM 错误:

    ExcelDna.Integration.ExcelErrorUtil.ToComError(ExcelError.ExcelErrorNA)

在内部就可以了

     new System.Runtime.InteropServices.ErrorWrapper(-2146826246)