2

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

4

4 回答 4

7

不要放置零或空字符串,而是尝试放置#N/A.

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

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

我知道查看差距的唯一方法是使用散点图。

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

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

于 2013-07-22T17:28:45.653 回答
0

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

我有修改图表的代码。它适用于具有#N/A 的单元格,也适用于 na() 函数。就像旧的excel一样。首先,您需要一个带有公共子模块的模块:

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 中定义子:

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

也许它并不完美,但它对我有用。操纵图表样本

于 2016-04-22T10:21:18.593 回答
0

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

Step1:首先获得 Chartpage 访问权限并使用 Display blank as

   Excel.Chart chartPage = myChart.Chart;

   chartPage.DisplayBlanksAs = Excel.XlDisplayBlanksAs.xlInterpolated;

快乐编码。

于 2016-09-08T12:07:02.920 回答
0

正如 stenci 所说,由于单元格中存在公式,因此很难在没有 VBA 的情况下创建间隙。一个耗时的解决方案是一个一个地删除提供空白单元格的公式,以便它们随后将绘制为间隙。对于可能过于耗时的大型数据集。

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

  1. 将空白单元格设置为空。例如:=IF(COUNT(A1)>0,A1,"");
  2. 以您喜欢的格式保存工作簿的副本,因为下一步将消除公式;
  3. 将工作簿另存为具有不同文件名的 .CSV 文件;
  4. 关闭文件。然后重新打开文件;
  5. 现在,折线图将为空单元格提供间隙。

注意,间隙的两侧需要有一条线段,即在间隙的两侧至少有两个数据单元。具体来说,这将绘制一个差距:A1=1、A2=2、A3=(空白)、A4=4、A5=5。

这不会画出差距:A1=1,A2=(空白),A3=3,A4=4。

于 2017-01-10T11:19:20.533 回答