vba在第一次执行后缓慢

我曾经见过其他类似的问题,没有真正的答案。

当我运行一个子导入数据到3个工作表,然后编译从这3个工作表中的第四张工作表,它只是运行在17secs以上。

17秒的主要部分是以13.86秒的速度向输出表写入10,000行(每行26列),每秒钟超过720行。

问题出现的时候,我再次运行这个子没有closuresexcel,它需要永远! import阶段不慢,但写入产出表减慢,一直差17行一秒。 (速度下降35倍)

我已经testing了我所知道的有关VBA的每一件事情,但是我无法find原因。

Sub的开始总是使用删除每张纸

If sh.AutoFilterMode Then sh.AutoFilterMode = False sh.Columns.Hidden = False sh.Rows.Hidden = False sh.Cells.Clear sh.Cells.Delete 

我一直使用这个来清除表单,从来没有问题,直到我find了我的问题的修复,实际上删除了4张,并重新创build它们,这就解决了可怕的速度放缓。

我的工作表上留下了什么,上面的代码没有删除,并造成这个放缓问题?

我也离开了表格数据并保存并closures了工作簿,并且在打开excel之后,我仍然在第一次运行时获得了完美的性能,所以它不是表单上的实际数据。

NB – 其余的代码只是标准循环和写入单元格,我100%确定它不是这个问题的问题

根据你的描述,我认为可能的解决scheme如下。

  1. application.screenupdating = false放在你的子文件的第一个位置,在退出子文件之前放上application.screenupdating = false
  2. application.calculation = xlCalculationManual先放在你的sub中,然后在application.calculation = xlCalculationAutomatic之前先退出sub。
  3. 使用数组variables。 如果你想input一个100000 x 26的范围(“A1:Z100000”),正常和慢的方式如下

     for i = 1 to 100000 for j = 1 to 26 cells(i,j).value = 123 next j next i 

    快速的方法是

     dim ary(100000 - 1, 26 -1) as variant 'make an array for i = lbound(ary, 1) to ubound(ary, 1) for j = lbound(ary, 2) to ubound(ary, 2) ary(i, j) = 123 next j next i range("a1").resize(ubound(ary, 1) - lbound(ary, 1) + 1, ubound(ary, 2) - lbound(ary, 2) +1).value = ary