当手动构建图表时:
这是我的结果...
以下是一小段VBA代码,用于生成图表...
Sub MakeChart()
Dim cell As Range, mySerRng As Range, mySrcRng As Range
Dim mySht As Worksheet, myChrt As Chart
Dim lastRow As Long
Set mySht = Worksheets("Sheet1")
lastRow = mySht.Range("A" & mySht.Rows.Count).End(xlUp).Row
Set mySerRng = mySht.Range(mySht.Cells(1, 2), mySht.Cells(lastRow, 2))
Set mySrcRng = mySht.Range(mySht.Cells(1, 1), mySht.Cells(lastRow, 2))
Set myChrt = mySht.Shapes.AddChart2(-1, xlLine, mySht.Range("C1").Left, mySht.Range("C1").Top).Chart
With myChrt
.SeriesCollection.Add Source:=mySrcRng, RowCol:=xlColumns, serieslabels:=True, categorylabels:=True, Replace:=True
For Each cell In mySerRng
If cell.Value = "Protected" Then
.SeriesCollection(1).Points(cell.Row - 1).Format.Line.Visible = False
.SeriesCollection(1).Points(cell.Row).Format.Line.Visible = False
End If
Next cell
End With
End Sub
替代方法
使用多个系列构建散点图,通过“有问题”的行分隔,并进行格式化,使它们看起来像一个系列...
这样做有以下缺点:
虽然我同意@OldUgly的答案,但如果您认为这样更容易理解,您也可以在数据旁边添加另一列。
=IF(ISNUMBER($B2),$B2,"")
那应该就可以了。
我有点失望,因为我无法理解大部分内容,它似乎是一个非常简单的前提。我已经做了一些变通,但肯定需要进一步完善;
我正在使用一个名为Eval的VBA函数:
Public Function Eval(varRange As Range)
Dim varArray() As Variant
varArray = varRange
Dim R As Long
Dim C As Long
For R = 1 To UBound(varArray, 1)
For C = 1 To UBound(varArray, 2)
If varArray(R, C) = "Protected" Then
varArray(R, C) = CVErr(xlErrNA)
End If
Next C
Next R
Eval = varArray
End Function
还有一个名为“Chart”的定义范围,其公式如下
=EVAL(INDIRECT("Sheet1!$B$2:$B$"&1+COUNTA(Sheet1!$B$2:$B$31)))
这使得范围成为动态的,但如果需要,您可以使用=EVAL(B2:B6)
。
在您的图表中,将系列值范围编辑为Sheet1.xlsm!Chart
(或您的工作表叫什么),然后您将获得数据范围,并将“受保护”的任何值转换为空白。唯一的问题是,图表将绘制两点之间的线,无论如何,我无法使图表绘制间隙。也许有比我更好的谷歌技巧的人能够提出解决方案吗?