我正在绘制一组在某些单元格中有空白的数据。在空白单元格中,我有公式,我必须保留公式。当我绘制数据时,空白单元格被绘制为零。我想在图表中放置空白而不是零。我尝试右键单击图表>选择数据>隐藏和空单元格设置>将空单元格显示为间隙。但这并没有帮助!
4 回答
不要放置零或空字符串,而是尝试放置#N/A
.
您可以使用类似的公式来完成=IF([test],[value],NA())
。
这将允许图表不将缺失值显示为零,但如果我理解您的问题,它仍然不是您想要的,因为您希望将缺失值表示为间隙,而不是缺失值。
我知道查看差距的唯一方法是使用散点图。
据我所知,所有做一条线连接两点的图,确实连接两点,并且没有缺失点的概念。他们只是加入两个最近的点。
一种解决方案可能是制作一个 VBA 宏,该宏进入图表内部,并在数据丢失时更改每条图表线的颜色。
一种解决方案可能是制作一个 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
也许它并不完美,但它对我有用。操纵图表样本
可能是有用的任何人如何有这个问题,
Step1:首先获得 Chartpage 访问权限并使用 Display blank as
Excel.Chart chartPage = myChart.Chart;
chartPage.DisplayBlanksAs = Excel.XlDisplayBlanksAs.xlInterpolated;
快乐编码。
正如 stenci 所说,由于单元格中存在公式,因此很难在没有 VBA 的情况下创建间隙。一个耗时的解决方案是一个一个地删除提供空白单元格的公式,以便它们随后将绘制为间隙。对于可能过于耗时的大型数据集。
如果您愿意打开和关闭文件,有一个解决方法:
- 将空白单元格设置为空。例如:=IF(COUNT(A1)>0,A1,"");
- 以您喜欢的格式保存工作簿的副本,因为下一步将消除公式;
- 将工作簿另存为具有不同文件名的 .CSV 文件;
- 关闭文件。然后重新打开文件;
- 现在,折线图将为空单元格提供间隙。
注意,间隙的两侧需要有一条线段,即在间隙的两侧至少有两个数据单元。具体来说,这将绘制一个差距:A1=1、A2=2、A3=(空白)、A4=4、A5=5。
这不会画出差距:A1=1,A2=(空白),A3=3,A4=4。