簡體   English   中英

第一次執行后vba sub變慢

[英]vba sub slow after first execution

我見過其他人有類似的問題,但沒有真正的答案。

當我運行將數據導入到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后,我在第一次運行時仍然獲得了理想的性能,因此它不是工作表上的實際數據。

注意:其余代碼只是標准循環和寫入單元格,我100%確信這不是此問題的問題

根據您的描述,我認為可能的解決方案如下。

  1. application.screenupdating = false在你的第一個分和application.screenupdating = true退出前分。
  2. application.calculation = xlCalculationManual放在您的子application.calculation = xlCalculationManual的第一個位置,將application.calculation = xlCalculationAutomatic退出子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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM