在Excel中以间隙的形式绘制空白单元格

时间:2013-07-22 16:35:27

标签: excel excel-charts

我正在绘制一组在某些单元格中有空白的数据。在空白单元格中,我有公式,我必须保留公式。当我绘制数据图时,空白单元格被绘制为零。我想在图表中添加间隙而不是零。 我试着右键点击图表&gt;选择数据&gt; <隐藏和空单元格设置>将空单元格显示为间隙。但这没有帮助!

4 个答案:

答案 0 :(得分:7)

不要将零或空字符串放在#N/A

您可以使用=IF([test],[value],NA())等公式来完成。

这将允许图形不将缺失值显示为零,但如果我理解您的问题,它仍然不是您想要的,因为您希望将缺失值表示为间隙,而不是缺失值。< / p>

我知道看到差距的唯一方法是使用分散的图表。

据我所知,所有使一条线连接两个点的图形,都会加入两个点,并且没有缺失点的概念。他们只是加入了两个最接近的点。

解决方案可能是制作一个进入图表内部的VBA宏,并在数据丢失时更改每个图表行的颜色。

答案 1 :(得分:0)

  

解决方案可能是制作一个进入图表内部的VBA宏,并在数据丢失时更改每个图表行的颜色。

我有代码,可以修改图表。 它适用于具有#N / A和na()函数的单元格。像老excel一样。 首先,您需要一个带有public sub的模块:

Public Sub FormatNA()
Dim myChart As ChartObject
Dim series_i As Integer, series_count As Integer
Dim values_i As Integer, values_count As Integer
Dim rows As Integer, r As Integer
Dim mySeries As Object
Dim myValues As Variant
Dim myPoint As Object
Application.ScreenUpdating = False
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
' for each chart in active sheet
For Each myChart In ActiveSheet.ChartObjects
    ' Determine Chart Type
    Select Case myChart.Chart.ChartType
        Case xlLine, _
            xlLineMarkers, _
            xlLineMarkersStacked, _
            xlLineMarkersStacked100, _
            xlLineStacked, _
            xlLineStacked100, _
            xlXYScatter, _
            xlXYScatterLines, _
            xlXYScatterLinesNoMarkers, _
            xlXYScatterSmooth, _
            xlXYScatterSmoothNoMarkers
                ' for each series
                series_count = myChart.Chart.SeriesCollection.Count
                For series_i = 1 To series_count
                    ' for each data
                    Set mySeries = myChart.Chart.SeriesCollection(series_i)
                    Set myPoint = mySeries.Points(1)
                    myValues = mySeries.Values
                    values_count = UBound(myValues)
                    ' global formatting:
                    Select Case mySeries.ChartType
                        ' MARKERS:
                        Case xlLineMarkers, _
                            xlLineMarkersStacked, _
                            xlLineMarkersStacked100, _
                            xlXYScatter, _
                            xlXYScatterLines, _
                            xlXYScatterSmooth
                                With mySeries
                                    .MarkerForegroundColorIndex = myPoint.MarkerForegroundColorIndex
                                    .MarkerForegroundColor = myPoint.MarkerForegroundColor
                                    .MarkerBackgroundColorIndex = myPoint.MarkerBackgroundColorIndex
                                    .MarkerBackgroundColor = myPoint.MarkerBackgroundColor
                                    .MarkerForegroundColor = myPoint.MarkerForegroundColor
                                    .MarkerSize = myPoint.MarkerSize
                                    .MarkerStyle = myPoint.MarkerStyle
                                End With
                        ' NO MARKERS, JUST LINE:
                        Case Else
                    End Select
                    With mySeries
                        .Border.Color = myPoint.Border.Color
                        .Border.Weight = myPoint.Border.Weight
                        With .Format.Line
                            .ForeColor.RGB = myPoint.Format.Line.ForeColor.RGB
                            .BackColor.RGB = myPoint.Format.Line.BackColor.RGB
                            .Weight = myPoint.Format.Line.Weight
                            .Visible = msoTrue
                        End With
                    End With
                    For values_i = 2 To values_count
                        ' set line invisible if #NA
                        If IsEmpty(myValues(values_i - 1)) And Not IsEmpty(myValues(values_i)) Then
                            mySeries.Points(values_i).Format.Line.Visible = msoFalse
                            'mySeries.Points(values_i).Border.Color = RGB(255, 255, 255) ' for debugging
                            'mySeries.Points(values_i).Border.Weight = 1
                        End If
                    Next values_i
                Next series_i
        Case Else
            ' different chart type
    End Select
Next
Application.ScreenUpdating = True
End Sub

然后,每次计算工作表时都必须触发此子程序: 在ThisWorkbook中定义sub:

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Static Calculated As Boolean
If Not Calculated Then
    Call FormatNA
    Calculated = True
Else
    Calculated = False
End If
End Sub

也许它并不完美,但它对我有用。 Sample of manipulated chart

答案 2 :(得分:0)

可能有用的任何人如何解决这个问题,

步骤1:首先获取Chartpage访问权限并使用显示空白

   Excel.Chart chartPage = myChart.Chart;

   chartPage.DisplayBlanksAs = Excel.XlDisplayBlanksAs.xlInterpolated;

快乐编码。

答案 3 :(得分:0)

正如stenci所说,由于细胞中存在配方,很难在没有VBA的情况下产生缺口。一个耗时的解决方案是逐个删除提供空白单元格的公式,然后将它们绘制为间隙。 对于可能太耗时的大型数据集。

如果您愿意打开和关闭文件,则有一种解决方法:

  1. 将空白单元格设置为空白。例如:= IF(COUNT(A1)&gt; 0,A1,“”);
  2. 以您首选的格式保存工作簿的副本,因为下一步将取消公式;
  3. 将工作簿另存为具有不同文件名的.CSV文件;
  4. 关闭文件。然后重新打开文件;
  5. 现在,折线图将为空单元格提供间隙。
  6. 注意,间隙的两侧需要具有线段,即间隙两侧的至少两个数据单元。具体来说,这将描绘一个差距: A1 = 1,A2 = 2,A3 =(空白),A4 = 4,A5 = 5.

    这不会形成差距: A1 = 1,A2 =(空白),A3 = 3,A4 = 4.