2013-10-13 60 views
5

我写的生成散点图和改变图表的一些属性一些Excel的VBA代码。 (代码如下,以供参考。)代码在诸如删除图表图例,删除水平/垂直网格线以及更改X和Y系列等任务中缓慢移动。 Excel的计时器给我每个任务的持续时间如下:VBA图表操纵慢

insert scatterplot: 0.01171875 
delete series: 0 
plot x vs y: 0.55859375 
delete legend: 0.5703125 
delete chart title: 0.66015625 
remove grid: 1.3046875 
format axes: 0 
overall: 3.11328125 

卸下电网,更改标题,绘制X和Y系列,并删除传说似乎需要很长的时间。我已经搜索了替代方法来编写代码,但一直没有找到有用的东西。代码完全按照预期工作,除了速度慢以外。任何关于什么导致糟糕表现的想法,以及我如何加快这一点?提前致谢。

编辑:我已经关闭屏幕更新与图表工作时。图表是在用户窗体打开时生成/格式化的,如果这有什么不同。

这里是代码中的相关片段:

With ActiveChart 
    'Delete all series currently in plot 
    Do While .FullSeriesCollection.Count > 0 
     .FullSeriesCollection(1).Delete 
    Loop 

    'Plot Actual (Y) vs. Inverse Distribution (X) 
    .SeriesCollection.NewSeries 
    .FullSeriesCollection(1).XValues = "=" & tempSheetName & "!$C:$C" 
    .FullSeriesCollection(1).Values = "=" & tempSheetName & "!$A:$A" 

    'Delete legend 
    .Legend.Delete 

    'Delete chart title 
    .SetElement (msoElementChartTitleNone) 

    'Remove gridlines 
    .SetElement (msoElementPrimaryValueGridLinesNone) 
    .SetElement (msoElementPrimaryCategoryGridLinesNone) 

    'Format axes 
    Dim xAxis As Axis, yAxis As Axis 
    Set xAxis = .Axes(xlCategory) 
    Set yAxis = .Axes(xlValue) 

    With yAxis 
     'Title y axis "actual" 
     .HasTitle = True 
     .AxisTitle.Caption = "Actual" 

     'Add tick marks 
     .MajorTickMark = xlOutside 
    End With 

    With xAxis 
     'Title x axis by dist type 
     .HasTitle = True 
     .AxisTitle.Caption = dist.getDistType 

     'Add tick marks 
     .MajorTickMark = xlOutside 
    End With 
End With 
+0

您可以发布您的工作簿样本吗? – brettdj

回答

2

没有数据和机器的细节也可以是很难说为什么这是缓慢的,但这里有一些替代一些你的代码中。

我会改变的第一件也是最重要的事情是而不是来激活图表。如果要通过代码创建图表,请这样做,但将其设置为变量,例如Set wcChart = ThisWorkbook.Charts.Add。然后将With ActiveChart更改为With wcChart

此外,删除FullSeriesCollection然后删除图表标题,删除网格线和填充新数据之前,改变轴。图表操作应该更快,图表中的数据更少。这里要小心,但因为以不同的顺序改变图表的多个方面可以产生不同的输出(作为一个例子的图例的布局)。

您填写新FullSeriesCollection A和C的整个列,指定数据,而不是整个列的确切范围。

其他变化的尝试,我不是说这些工作,但他们的价值,如果你还没有尝试射门。相反,每次检查一个FullSeriesCollection的:

Do While .FullSeriesCollection.Count > 0 
    .FullSeriesCollection(1).Delete 
Loop 

以下可以更快:

For ii = .FullSeriesCollection.Count To 1 Step -1 
    .FullSeriesCollection(ii).Delete 
Next ii 

另外,代替.SetElement图表标题和网格线我用下面的:

'You have to set the title to 'True' before it'll work with 'False'. Go figure. 
.HasTitle = True 
.HasTitle = False 

.HasMajorGridlines = False 
.HasMinorGridlines = False 
+0

感谢您的建议 - 我已经能够将整个过程从前3秒缩短到0.5秒。似乎这里的关键建议是最后绘制X和Y系列,并在图表中没有数据的情况下操纵图表。 现在运行时,以供参考: '插入散点图:0.05078125 删除系列:0 删除图例:0 删除图表标题:0格式 轴:0 标绘X对y:0。5234375 整体:0.578125' –

+0

此外 - 就删除图表标题而言,我可以使用'.HasTitle = False',而不需要先设置为true并且没有问题。还应该注意的是,'.HasMajorGridlines'和'.HasMinorGridlines'属于'Axis'而不是'Chart'。 –

+0

很高兴听到这样的说法,您必须拥有合理的数据点才能减慢速度。你至少需要'.HasTitle = False/True'才能向下兼容2007(也许是2010?)。网格线足够公平。 – CuberChase