excel 第一次执行后vba子慢

bsxbgnwa  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(110)

我见过其他人提出类似的问题,但没有真实的的答案。
当我运行一个子程序,将数据导入到3个工作表中,然后从这3个工作表中编译第4个工作表时,它只运行了17秒多一点。
17秒的主要部分是在13.86秒内将10,000行(每行26列)的数据写入输出表,每秒超过720行。
问题出现了,当我再次运行这个子没有关闭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,所以它不是工作表上的实际数据。
NB -其余的代码只是标准循环和写入单元格,我100%肯定这不是这个问题的问题

1rhkuytd

1rhkuytd1#

它可以追溯到很久以前,但无论如何:今天,我在使用VBA工具时遇到了同样的问题(Excel 2010,通过UF调用,导入> 40000行数据并执行一些计算):->第一次运行时的运行时间:第2次运行时为40秒和11分钟(关闭UF并再次打开后)。我能够解决这个问题,通过明确地擦除数组,我在代码中使用的“擦除”命令,并设置工作簿对象为“无”明确之前,UF是关闭的。

示例:

  • 私有子UserForm_QueryClose(Cancel As Integer,CloseMode As Integer)If CloseMode = vbFormControlMenu Then Logger_End
Erase allAsmFileREVsArray()
    Erase allAsmFileURLsArray()
    
    Set xlWorkBook = Nothing
End If

结束接头 *
也许会有帮助。。

e1xvtsh3

e1xvtsh32#

根据你的描述,我认为可能的解决方案如下。
1.把application.screenupdating = false放在子目录的第一个,application.screenupdating = true放在退出子目录之前。
1.把application.calculation = xlCalculationManual放在你的子节点的第一个,application.calculation = xlCalculationAutomatic放在退出子节点之前。
1.使用数组变量。如果要输入一个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

相关问题