为XLScatter图表系列的.XValues和.Values属性分配的双精度数组;但是.XValues会以某种方式转换为字符串。为什么?

德莫查德

我有功能性的VBA代码,该代码创建以“ X”数组和“ Y”数组形式提供给它的数据的XYScatter图表(与工作表范围内存在的数据相反)。两个数组都声明为double(即Locals窗口将数组列为“ Double(#to#)”类型,将每个数组元素列为“ Double”类型)。它们分别分配给图表中系列的.XValues和.Values属性,并且所有内容似乎都按预期显示。

一个单独的子项尝试根据在.XValues和.Values中找到的数据范围来调整图表轴刻度的.MinimumScale和.MaximumScale属性,并且成功地对Y轴(.Values)进行调整。但是,X轴失败。尽管我为这两个属性提供了相同的数据类型,但是以某种方式,传递给.XValues的双精度型将转换为字符串,而.Values中的双精度型则保持为双精度型。确切地说,它们在“本地”窗口中分别以“ Variant / String”和“ Variant / Doubles”的数组形式列出。

因此,当我尝试检索最小和最大X值以设置X轴比例时,Application.Max(.XValues)我得到的所有内容均为0,这大概是因为Excel的Max函数无法将字符串识别为数字。

值得注意的是,如果我尝试使用工作表中某个范围的XY数据在图表上进行相同的轴缩放,则不会遇到此问题,并且当我使用“本地”窗口查看此类图表时,它会同时列出两个.XValues和.Values属性作为Variant / Doubles数组。

下面,我将原本单独的子项目的相关部分汇总在一起,以对问题进行故障排除和/或说明。请记住,虽然看起来简单的解决方案是使用xArray的最大值来设置X轴比例,但是我的原始代码创建了一个子图表,并在另一个子图表中进行了缩放。xArray仅可通过第一个子项访问,我希望保持这种方式。

Sub test()

    Dim MaxX As Double, MaxY As Double, MinX As Double, MinY As Double
    Dim xArray(1 To 5) As Double, yArray(1 To 5) As Double
    Dim CHRT As Chart, SER As Series

    xArray(1) = 0: xArray(2) = 0.000001: xArray(3) = 9.99999
    xArray(4) = 10: xArray(5) = 20

    yArray(1) = 0: yArray(2) = 0.000001: yArray(3) = 9.99999
    yArray(4) = 10: yArray(5) = 20

    Set CHRT = ActiveSheet.Shapes.AddChart2(-1, xlXYScatter).Chart

    With CHRT
        .SeriesCollection.NewSeries
        Set SER = .SeriesCollection(1)
        With SER
            .XValues = xArray
            .Values = yArray
        End With
    End With

    With Application
        MaxX = .Max(SER.XValues)
        MinX = .Min(SER.XValues)
        MaxY = .Max(SER.Values)
        MinY = .Min(SER.Values)
    End With

    Stop '...to check Locals window; we expect MaxX = MaxY

End Sub
德莫查德

我一直无法确定为什么无法获得预期的结果,所以我实现了一种变通方法,在我原来的故障排除代码的背景下,这需要声明两个新变量...

Dim tempX() As Double, ii As Integer

然后替换...

With Application
    MaxX = .Max(SER.XValues)
    MinX = .Min(SER.XValues)
    MaxY = .Max(SER.Values)
    MinY = .Min(SER.Values)
End With

...与...

ReDim tempX(LBound(SER.XValues) To UBound(SER.XValues))
For ii = LBound(SER.XValues) To UBound(SER.XValues)
    tempX(ii) = CDbl(SER.XValues(ii))
Next ii
With Application
    MaxX = .Max(tempX)
    MinX = .Min(tempX)
    MaxY = .Max(SER.Values)
    MinY = .Min(SER.Values)
End With

现在,MaxX被正确报告为20而不是0。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章