第一次执行后vba sub慢

时间:2016-06-04 17:58:45

标签: excel vba excel-vba

我见过其他人有类似的问题但没有真正的答案。

当我运行一个将数据导入3个工作表的子程序,然后从这3个工作表中编译第4个工作表时,它运行的时间超过17个。

17秒的主要部分是在13.86秒内向输出表写入10,000行(每列26列),每秒只有720行。

当我再次运行这个sub而不关闭excel时出现问题,这需要永远!导入阶段并不慢,但写入输出表会减慢到每秒17行的差异。 (速度降低35倍)

我已经测试了我所知道的关于VBA的所有事情,我无法找出原因。

Sub的开头总是使用

删除每张纸
If sh.AutoFilterMode Then sh.AutoFilterMode = False
sh.Columns.Hidden = False
sh.Rows.Hidden = False
sh.Cells.Clear  
sh.Cells.Delete

我一直用它来清除床单并且从来没有问题,直到我找到了解决我的问题的方法,实际上删除了4张并重新创建它们,这解决了速度的可怕减速。

在我的工作表上留下了上述代码没有删除并造成这种减速问题的原因?

我还将纸张中的数据保存完整并保存并关闭了工作簿,并且在打开excel后第一次运行时仍然可以获得完美的性能,因此它不是纸张上的实际数据。

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

1 个答案:

答案 0 :(得分:0)

根据您的描述,我认为可能的解决方案如下。

  1. application.screenupdating = false放在您的子广告的第一个,并在退出子广告之前application.screenupdating = true
  2. application.calculation = xlCalculationManual放在您的子站点的第一个,并在退出子站点之前放置application.calculation = xlCalculationAutomatic
  3. 使用数组变量。如果你想输入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