使用 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)
我正在使用 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)