VBA从数组制作图表 - 缺少值的问题

Posted

技术标签:

【中文标题】VBA从数组制作图表 - 缺少值的问题【英文标题】:VBA Making chart from array - problem with missing values 【发布时间】:2019-03-21 08:34:01 【问题描述】:

我正在制作带有标记的折线图。数据正在代码中创建到数组中,并将该数组放入图表中。

问题是数组中的缺失值表示为 EMPTY。

在绘制确实存在的两个点时,它们与线相连。 如果单元格为空,则选择该选项以绘制间隙。

Serie 公式将 EMPTY 显示为 #N/A。

XValues=="11/28/2016","12/5/2016","12/12/2016","12/19/2016","12/26/2016","1/ 2/2017","1/9/2017","1/16/2017","1/23/2017","1/30/2017","2/6/2017","2/13/ 2017","2/20/2017","2/27/2017"

值= 125.15,93.875,#N / A,#N / A,#N / A,#N / A,42,125,48.5714285714285,137,127.285714285714,81.6428571428571,89.9375,69.5,65.6428571428571,75.5,47.1666666666666

尝试用 0、""、NaN 替换,但没有任何效果。我想中断绘图线。

我有现有值,然后是一系列缺失值,然后是一些值。 我注意到,如果 serie 以缺失值开头,那么它的绘制效果很好。 否则不工作。

For i = LBound(p_data, 1) + 1 To UBound(p_data, 1)
    sSerieName = p_data(i, 0)

    If sSerieName <> "" Then

        Dim serie() As Variant
        Dim w As Long
        w = 0
        For j = LBound(labels) To UBound(labels)
            ReDim Preserve serie(j): serie(j) = p_data(i, j + 1)
        Next j
        If Not Len(Join(serie, "")) = 0 Then
        On Error Resume Next
            With p_chart.Chart.SeriesCollection.NewSeries
                .XValues = labels
                .Values = serie
                .Name = sSerieName                    
            End With
        On Error GoTo 0
        End If
    End If
Next i

【问题讨论】:

请edit您的问题并显示代码,或者更好的是minimal reproducible example。 On Error Resume Next最好不要这样做,你可以跳过错误,你正在尝试查找 你能告诉我xvaluesserie的结果吗? @Nathan_Sav 添加在上面 你试过用字符串“empty”或Null替换错误。 【参考方案1】:

我认为在通过数组设置值等时这是不可能的。似乎将 Empty 解析为 N/A。我尝试了以下解决方案,这将涉及您记录这些空的发生位置。因此,例如,在这种情况下,我在第 3 点用之前的值替换了我的空值,并使用了以下

需要的值是 10,20,EMPTY,40

With s.NewSeries
    .XValues = Array("a", "b", "c", "d")
    .Values = Array(10, 20, 20, 40)
    .Points(3).Format.Line.Visible = msoFalse
End With

我尝试的完整解决方案如下

Sub x()

Dim s As SeriesCollection
Dim lc As Long
Dim aTest() As Variant
Dim serie As String

aTest = Array(15, 20, Empty, 40)

Set s = ActiveChart.SeriesCollection

For lc = 0 To UBound(aTest)

    If aTest(lc) = "" Then      '   <--- record these lc values to hide points
        If lc = 0 Then
            aTest(lc) = 0
        Else
            aTest(lc) = aTest(lc - 1)
        End If
    Else
    End If

Next lc

With s.NewSeries
    .XValues = Array("a", "b", "c", "d")
    .Values = aTest
    .Points(3).Format.Line.Visible = msoFalse
End With

End Sub

【讨论】:

像魅力一样工作。有类似的想法。非常感谢!

以上是关于VBA从数组制作图表 - 缺少值的问题的主要内容,如果未能解决你的问题,请参考以下文章

从读取文件制作数组

如何通过VBA代码获取Excel 2012条件格式的色标制作的颜色

如何使用canvasJS在PHP中制作动态图表?

如何使用canvasJS在PHP中制作动态图表?

如何从具有特定值的变量和数据库中获取数据以将其计入laravel上的图表

SyntaxError:缺少:属性ID之后