excel 创建图表非常慢

gwbalxhn  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(146)

我正在使用VBA将图表插入到工作表中。第一个图表添加得非常快(几分之一秒),但此后创建任何后续图表至少需要20秒,我不知道为什么这么慢。

Dim newChartObj As ChartObject
Set newChartObj = ActiveSheet.ChartObjects.Add(endRange.Left, endRange.Offset(2, 0).Top, 360, 240)

上面代码的第二行是延迟发生的地方。在这一点上,我甚至还没有添加一系列数据。当图表对象最终创建时,我继续并开始添加系列,格式化等。所有这些都发生得非常快。
电子表格本身很大(大约20 Mb,有100 k多行数据和60多列),但不是很大。如果我手动插入一个图表,我也没有延迟问题。
如果任何人有任何提示,如何克服这一点,我会非常感激!

zkure5ic

zkure5ic1#

我最近在使用ChartObjects时遇到了同样的问题。Add()非常慢。我的发现可能对其他人有帮助,也可能没有帮助,但我想我至少会分享我的发现,因为我相信它与@Marcel的响应有关。
在我的例子中,我有两个工作表,我正在使用ChartObjects.Add()调用。在一个工作表上,调用立即执行,在另一个工作表上,它花了大约一分钟。凭直觉,我决定调用Worksheet.UsedRange.Address来查看返回的值。
在快速执行的工作表中,我得到了类似于$A$1:$Z$100的结果。但是对于慢速执行的工作表,我得到了类似于$A:$Z的结果。这意味着它实际上使用了大约140万行,尽管实际数据要少得多。我相信这是因为我们使用了Range.EntireColumn来设置一些格式。我们在快速工作表中没有这种格式。
最后,我们修改了代码,以防止它设置格式“无限”和ChartObjects.Add的执行变得即时。
使用像@Marcel这样的过滤器可能是可行的,或者你可能需要像我们一样修改你的代码,如果你得到的UsedRange是整个列而不是集合行。

omvjsjqw

omvjsjqw2#

在运行代码之前禁用所有内容

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.CutCopyMode = False

Dim newChartObj As ChartObject
Set newChartObj = ActiveSheet.ChartObjects.Add(endRange.Left, _
    endRange.Offset(2, 0).Top, 360, 240)

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.CutCopyMode = True
uurv41yg

uurv41yg3#

我遇到了极端的性能问题:

ActiveSheet.Shapes.AddChart.Select

问题是表中的数据量(10'000 - 500'000行)。
禁用“一切”在我的情况下没有帮助。
我的解决方案是,通过使用自动过滤器来减少显示的行数:

ActiveSheet.Range("B:B").AutoFilter Field:=2, Criteria1:="1"

只显示每1 '000行。
然后添加图表,设置数据源,配置图表,...然后撤销自动筛选。在我的情况下,这将使用的时间减少了10倍以上。

相关问题