【问题标题】:Graphing blank cells in form of gaps in Excel在 Excel 中以空白的形式绘制空白单元格
【发布时间】:2017-09-15 19:26:34
【问题描述】:

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

【问题讨论】:

  • 嗨,Sara,你能提供一些屏幕截图吗?在 Excel 2010 中,当我测试这种方法时,计算结果为空字符串的公式不会在我的图表中显示为零。 imgur.com/3bopUId

标签: excel excel-charts


【解决方案1】:

不要输入零或空字符串,而是尝试输入#N/A

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

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

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

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

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

【讨论】:

  • 您的解决方案解决了我的问题,因为我在系列开始或结束时只有空白单元格。谢谢!
  • 关于仅散点图作品的评论对我有所帮助。 “我知道查看差距的唯一方法是使用散点图。”
【解决方案2】:

一种解决方案可能是制作一个 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

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

【讨论】:

    【解决方案3】:

    这个问题可能对任何人都有用,

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

       Excel.Chart chartPage = myChart.Chart;
    
       chartPage.DisplayBlanksAs = Excel.XlDisplayBlanksAs.xlInterpolated;
    

    快乐编码。

    【讨论】:

      【解决方案4】:

      正如 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 1970-01-01
        • 2022-01-26
        相关资源
        最近更新 更多