数据在Excel 2010中绘制graphics,但不在Excel 2013中绘制

我正在使用VBA来绘制Excel 2010中创build的程序中的数据。我将它发送到另一台计算机,它具有Excel 2013,而且我发现除了此graphics问题外,一切都运行良好。

我的代码将创buildgraphics,并完美的大小,但它不会实际绘制任何数据点。 在我的代码中,我也添加和删除系列,我注意到系列的数量是正确的,但系列没有保留我给他们的自定义名称。

但是,这是一个转折点。 当我右键单击图表并单击“select数据”时,所有数据立即popup,包括系列的所有自定义名称。 我什至不去select数据或任何东西。 当我点击它,所有的值立即popup。

这是一个看起来像之前/之后的imgur专辑。 请注意,除了右键单击外,我绝对没有任何操作,并select“select数据”选项。 这就像数据已被选中,但直到我点击“select数据”才显示出来。

为什么Excel 2013会这样做? 我如何使这些值通过VBA方法实际显示? 我将添加下面使用的graphics代码的示例。

'Setting the range the chart will cover Set rngChart = ActiveSheet.Range(Cells(Counter + 3, 4), Cells(Counter + 27, 10)) 'Dimensioning the chart and choosing chart type Set co = ActiveSheet.Shapes.AddChart(xlXYScatter, rngChart.Cells(1).Left, rngChart.Cells(1).Top, rngChart.Width, rngChart.Height) Set cht = co.Chart Set sc = cht.SeriesCollection 'Remove any default series Do While sc.Count > 0 sc(1).Delete Loop 'Setting chart data 'Series 1 With sc.NewSeries .Name = "=Sheet1!$C$1" .XValues = "=Sheet2!$A$2:$A$" & SimpleTracker + 1 .Values = "=Sheet2!$B$2:$B$" & SimpleTracker + 1 .MarkerSize = 3 .MarkerStyle = xlMarkerStyleCircle End With 'Series 2 With sc.NewSeries .Name = "=Sheet1!$B$1" .XValues = "=Sheet1!$A$2:$A$" & Counter + 1 .Values = "=Sheet1!$B$2:$B$" & Counter + 1 .MarkerSize = 5 .MarkerStyle = xlMarkerStyleCircle .MarkerBackgroundColorIndex = 10 .MarkerForegroundColorIndex = 10 End With 'Setting chart labels With cht .HasTitle = True If n = 0 Then .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time" ElseIf Range("I" & n) = "Regression Title" Then .ChartTitle.Characters.Text = Range("J" & n).Text Else .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time" End If .Axes(xlCategory, xlPrimary).HasTitle = True If DayTracker = 1 Then .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Days)" ElseIf HourTracker = 1 Then .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Hours)" Else .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Minutes)" End If .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CFL" .Axes(xlCategory).HasMajorGridlines = True .Axes(xlCategory).HasMinorGridlines = True End With 

我还想指出,这个代码在Excel 2010中仍然可以正常工作,并且graphics在这里仍然有效。 它只是在Excel 2013中不起作用。

感谢您的阅读! 如果您有任何疑问或需要澄清,请告诉我。

更换

 With sc.NewSeries 

 With cht.SeriesCollection.NewSeries 

我在Excel 2013中遇到了同样的问题。我不知道为什么,但是这个解决scheme适用于我。

简短的故事是我无法复制这种不正当行为。

漫长的故事:我假设你的代码是一个Sub的主体,所以我创build了一个包含以下内容的模块:

 Sub DoItOriginal() 'Setting the range the chart will cover Set rngChart = ActiveSheet.Range(Cells(Counter + 3, 4), Cells(Counter + 27, 10)) 'Dimensioning the chart and choosing chart type Set co = ActiveSheet.Shapes.AddChart(xlXYScatter, rngChart.Cells(1).Left, rngChart.Cells(1).Top, rngChart.Width, rngChart.Height) Set cht = co.Chart Set sc = cht.SeriesCollection 'Remove any default series Do While sc.Count > 0 sc(1).Delete Loop 'Setting chart data 'Series 1 With sc.NewSeries .Name = "=Sheet1!$B$1" .XValues = "=Sheet2!$A$2:$A$" & SimpleTracker + 1 .Values = "=Sheet2!$B$2:$B$" & SimpleTracker + 1 .MarkerSize = 3 .MarkerStyle = xlMarkerStyleCircle End With 'Series 2 With sc.NewSeries .Name = "=Sheet1!$B$1" .XValues = "=Sheet1!$A$2:$A$" & Counter + 1 .Values = "=Sheet1!$B$2:$B$" & Counter + 1 .MarkerSize = 5 .MarkerStyle = xlMarkerStyleCircle .MarkerBackgroundColorIndex = 10 .MarkerForegroundColorIndex = 10 End With 'Setting chart labels With cht .HasTitle = True If n = 0 Then .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time" ElseIf Range("I" & n) = "Regression Title" Then .ChartTitle.Characters.Text = Range("J" & n).Text Else .ChartTitle.Characters.Text = "Simple Fit - CFL Over Time" End If .Axes(xlCategory, xlPrimary).HasTitle = True If DayTracker = 1 Then .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Days)" ElseIf HourTracker = 1 Then .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Hours)" Else .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time (Minutes)" End If .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "CFL" .Axes(xlCategory).HasMajorGridlines = True .Axes(xlCategory).HasMinorGridlines = True End With End Sub 

接下来,我需要一些数据来处理,所以在另一个模块中,我写了一个数据生成器,填充Sheet1和Sheet2。 这是该模块的内容:

 Option Explicit Sub Setup() SetupSheet "Sheet1", 5 SetupSheet "Sheet2", 2.5 End Sub Sub SetupSheet(nm As String, divisor As Double) Dim i As Long With ThisWorkbook.Worksheets(nm) .[A2].CurrentRegion.ClearContents .[B1].Value = "Chart" & Right(nm, 1) With .[A1] For i = 1 To SimpleTracker .Offset(i).Value = i .Offset(i, 1).FormulaR1C1 = "=1-EXP(-RC[-1]/" & divisor & ")" Next i End With End With End Sub 

然后,我从VB编辑器执行了Setup(),并创build了第三个工作表并将其激活。

然后我从VB编辑器中运行DoItOriginal(),而我没有注意到你所描述的问题。 我想到一个可能的解释是,从VBE切换回Excel用户界面做了一些事情来隐藏这种不当行为,所以我在表单上安装了一个button,并从那里执行了DoItOriginal,并且仍然没有观察到2010年的行为,2011年或2013年。

在我注意到的事情是系列1的设置行.Name =“= Sheet1!$ B $ 1”可能要参考Sheet2。

试试上面的代码,看看你是否仍然观察到不当行为。 如果你这样做,我不这样做可能是有趣的。 如果你不这样做,那么难题就是这种安排与你看到这种不正当行为的背景有什么不同。 既然你没有发布,我会暂停等待。 -hth

尝试添加

 DoEvents 

添加每个图表元素后,尤其是添加每个系列后。