我有很多数据是通过Excel中的连接从SQL查询中按下按钮来提取的。然后我编写了一些简单的计算来得到结果。我还有4个基于该数据的图表。
我遇到了一个代码需要几分钟才能执行的问题。我相信这是因为在更新数据时,图表也会更新。我在删除图表后遇到了这个结论,它明显更快。
有没有办法加快这个过程?我可以暂停图表并在所有数据更新后恢复吗?
谢谢!
答案 0 :(得分:5)
您是否考虑过在vba中偏移图表区域并在代码末尾切换回来?
以下是您在VBA中Select the Chart Area的方法。
例如。如果要在范围A1:A10中绘制数据图表,则可以执行以下操作
Charts(1).SetSourceData Source:=Sheets(1).Range("B1:B10")
your logic
Charts(1).SetSourceData Source:=Sheets(1).Range("A1:A10")
将图表“对齐”在不同的范围内,以便在每次更改单元格后不会尝试重新计算图表。一旦你的逻辑完成,然后“瞄准”它回到正确的范围。
答案 1 :(得分:1)
我建议使用
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
也许还
Application.EnableEvents = False
在查询之前, 并在查询后将其翻转
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
答案 2 :(得分:1)
我这样做的方法是在开头清除所有图表中的所有系列。格式化在每个图形上保持不变。我创建了一个子程序,我在主程序中调用,从中我发送每个图表变量名称,声明为ListObject并分配图表名称。
Private Sub DeleteOldData(CurrentChart As ChartObject)
Dim s As Long
With CurrentChart
For s = .Chart.SeriesCollection.Count To 1 Step -1
.Chart.SeriesCollection(s).Delete
Next s
End With
End Sub
然后,我更新数据。之后,我将所有系列重新分配给另一个子图。
Private Sub AddData(CurrentChart As ChartObject, table1 As ListObject, table2 As ListObject, series1 As String, series2 As String)
CurrentChart.Chart.SeriesCollection.NewSeries
CurrentChart.Chart.FullSeriesCollection(1).Name = series1
CurrentChart.Chart.FullSeriesCollection(1).Values = table1.ListColumns(2).DataBodyRange
CurrentChart.Chart.FullSeriesCollection(1).XValues = table1.ListColumns(1).DataBodyRange
CurrentChart.Chart.SeriesCollection.NewSeries
CurrentChart.Chart.FullSeriesCollection(2).Name = series2
CurrentChart.Chart.FullSeriesCollection(2).Values = table2.ListColumns(2).DataBodyRange
CurrentChart.Chart.FullSeriesCollection(2).XValues = table2.ListColumns(1).DataBodyRange
CurrentChart.Chart.FullSeriesCollection(2).Select
DoEvents
End Sub
table1和table2是我从中提取数据的表。我不得不在2张不同的表格的1张图表上添加2张图表。 Series1和Series2是该系列的名称。我在调用每个sub之前声明了它们。