【问题标题】:Excel Chart - How to draw discontinuous series in VBA without range referenceExcel图表 - 如何在没有范围参考的VBA中绘制不连续系列
【发布时间】:2018-06-10 13:35:11
【问题描述】:

Excel 2010。

问题:我需要通过 VBA* 在 XY 散点图中绘制一个 *single* *discontinuous* 系列而不引用工作表中的范围。

当 Y 值布置在工作表范围内时,通过在不连续处插入空白值很容易实现;只要在“选择数据”>“隐藏和空单元格”中选择“将空单元格显示为:间隙”。这是一个例子(红色的Series2是最重要的):

所以我试图通过 VBA 重现相同的内容:

Sub addDiscountinuousSingleSeries()
    Dim vx As Variant, vy As Variant
    Dim chrtObj As ChartObject, chrt As Chart, ser As Series

    Set chrtObj = ActiveSheet.ChartObjects("MyChart"): Set chrt = chrtObj.Chart

    Set ser = chrt.SeriesCollection.NewSeries

    vx = Array(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
    vy = Array(-1, 1, vbNullString, -1, 1, vbNullString)
    'vy = Array(-1, 1, CVErr(xlErrNA), -1, 1, CVErr(xlErrNA)) 'doesn't work either
    'vy = Range(RANGE_YVALUES_WITH_BLANK) 'this would work, but I do not want to reference a range

    chrt.DisplayBlanksAs = xlNotPlotted 'VBA equivalent to 'Show empty cells as: Gaps'

    With ser
        ser.Name = "VBA Series"
        .XValues = vx
        .Values = vy
    End With

End Sub

但是 vy 数组中的空白值似乎被忽略了,两个竖线现在已连接,我试图避免这种情况(绿色系列)。

我知道我可以通过编程方式删除中间线,但在我试图解决的现实问题中,它不是正确的解决方案(太复杂、太慢)。

我的问题:有没有办法指定系列的 .Values 数组以获得预期的行为并获得 vba 中两个垂直绿色段之间的间隙(只有一个系列并且没有参考工作表范围)?

【问题讨论】:

  • 我意识到这个OP 有类似的问题,但没有得到任何答案。
  • 不确定是否在 Excel 2010 中可用,但对于 2016,vy = Array(-1, 1, CVErr(xlErrNA), -1, 1, CVErr(xlErrNA))chrt.DisplayValueNotAvailableAsBlank = True 结合使用。
  • 谢谢!在 Excel 2010 中似乎不存在 DisplayValueNotAvailableAsBlank 属性,因此很遗憾,这可能是 2010 年之后的升级。
  • 是的,找到 Display empty cells, null (#N/A) values, and hidden worksheet data in a chart:“将 #N/A 显示为空单元格选项:此功能仅在您订阅了 Office 365 且当前仅适用于预览体验成员时可用。如果您是Office 365 订阅者,请确保您拥有最新版本的 Office。”所以不在 Excel 2010 中。
  • 当有一个空值时,你能不能不把数组分成两个单独的系列?我知道这不是你问的,但它会达到相同的视觉效果。

标签: vba excel charts


【解决方案1】:

你可以只格式化你不想要的行。也许不是最漂亮的方式,但它会实现你想要的。

ser.Points(3).Format.Line.Visible = msoFalse
ser.Points(4).Format.Line.Visible = msoFalse
ser.Points(6).Format.Line.Visible = msoFalse

或者:

For i = 1 To ser.Points.Count
    If i <> 1 Then k = i - 1 Else k = i
    If ser.Values(i) = 0 Or ser.Values(k) = 0 Then
        ser.Points(i).Format.Line.Visible = msoFalse
    End If
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多