【问题标题】:Why are some series temporarily missing from my Excel chart?为什么我的 Excel 图表中暂时缺少某些系列?
【发布时间】:2017-04-02 12:51:58
【问题描述】:

我正在从 VB 宏生成 Excel 柱形图。我添加了 3 条水平参考线,发现当宏完成时,只有第一条出现(以及柱形图)。但是,如果我保存工作簿并重新打开它,则所有 3 条参考线都是可见的。或者,如果我转到设计选项卡以“选择数据”并简单地单击任何一个参考线名称,所有 3 都会立即出现。关于我可以在宏中放入什么以使它们在宏完成时自动出现的任何想法?

创建这 3 条参考线的代码是(sc 是图表的SeriesCollection):

With sc.NewSeries
    .ChartType = xlXYScatterLinesNoMarkers
    .Name = "A"
    .XValues = "={1,3}"
    .Values = "={100,100}"
End With
With sc.NewSeries
    .ChartType = xlXYScatterLinesNoMarkers
    .Name = "B"
    .XValues = "={1, 3}"
    .Values = "={80, 80}"
End With
With sc.NewSeries
    .ChartType = xlXYScatterLinesNoMarkers
    .Name = "C"
    .XValues = "={1, 3}"
    .Values = "={50, 50}"
End With

编辑:这是使用@axel-richter 回答中的数据的屏幕截图。这是宏结束后的样子。

【问题讨论】:

  • 如果您单步执行代码 (F8),它会按预期显示吗?
  • 是的,如果我单步执行它会显示得很好。
  • DoEvents 无效。凭直觉,我也尝试了Application.Wait Now(),但仍然没有。

标签: vba excel charts macros


【解决方案1】:

我想这适用于 Excel 2010 及更高版本。

添加新系列后,不带参数调用Chart.ChartWizard Method

例子:

假设我们有:

然后在运行这个宏之后:

Sub addChart()

 Dim oChart As ChartObject
 Dim sc As SeriesCollection

 Set oChart = ActiveSheet.ChartObjects.Add(300, 40, 300, 200)
 oChart.Chart.ChartWizard Source:=ActiveSheet.Range("A1:D4"), Gallery:=xlColumn

 Set sc = oChart.Chart.SeriesCollection

 With sc.NewSeries
  .ChartType = xlXYScatterLinesNoMarkers
  .Name = "A"
  .XValues = "={1,3}"
  .Values = "={100,100}"
 End With
 With sc.NewSeries
  .ChartType = xlXYScatterLinesNoMarkers
  .Name = "B"
  .XValues = "={1, 3}"
  .Values = "={80, 80}"
 End With
 With sc.NewSeries
  .ChartType = xlXYScatterLinesNoMarkers
  .Name = "C"
  .XValues = "={1, 3}"
  .Values = "={50, 50}"
 End With

 oChart.Chart.ChartWizard

End Sub

我们有:

【讨论】:

  • 谢谢,但是当我运行这段代码时,我仍然遇到完全相同的问题 - 只显示第一行。
  • 什么 Excel 版本?使用 Excel 2016 为我工作。
  • Office 365 - Excel 16.0.6965.2105
  • 您确定在我的代码中添加新系列后调用oChart.Chart.ChartWizard 吗?请试试我的例子。如果这可行,但您的示例不起作用,请准确描述我的示例与您的示例之间的区别。
  • 是的,我粘贴了您的代码,当宏结束时只看到 A 行。 (虽然B和C在传说中)
【解决方案2】:

我仍然无法解释为什么这些线条没有显示给我,但我找到了一个“解决方案”,可以强制它们显示。我在宏的末尾添加了以下内容,以 (a) 在末尾添加一个额外的系列,然后 (b) 立即将其删除。

With sc.NewSeries
    .ChartType = xlXYScatterLinesNoMarkers
    .Name = "D"
    .XValues = "={1, 3}"
    .Values = "={50, 50}"
 End With
 sc(sc.Count).Select
 Application.SendKeys "{Delete}"

注意最后一行。使用Selection.Delete 会删除多余的系列,但不可见的线条会保持不变。

【讨论】:

    【解决方案3】:

    如果您有时间,请尽量不要重用您的 SeriesCollection 对象。

    我在编写一个 C# 应用程序时遇到了这个问题。我可以看到我们的代码之间唯一的相似之处是我们都在同一个 SeriesCollection 对象上调用 NewSeries()。

    还值得注意的是 Chartwizard,快速系列创建删除解决方法对我不起作用。

    在每次调用 SeriesCollection.NewSeries() 之前,在图表对象上调用 seriescollection() 起作用。

    如:

    ChartObject co = target.ChartObjects().Item(1);
    Chart c = co.Chart;
    SeriesCollection s = c.SeriesCollection();
    Series s1 = s.NewSeries();
    s1.ChartType = XlChartType.xlLine;
    
    s = c.SeriesCollection();
    Series s2 = s.NewSeries();
    s2.ChartType = XlChartType.xlLine;
    

    完全猜想,但我怀疑 SeriesCollection 类存在缺陷;可能某些事件不会在后续的 NewSeries 调用中触发。根据我们每个人使用的版本,变通办法会导致未触发的事件触发,因此我们会看到“隐形系列”实际出现。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 2015-11-14
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多