簡體   English   中英

VBA 子程序在第一次執行后速度變慢了很多

[英]VBA subroutine slows down a lot after first execution

我有一個子程序,可以生成 5 個家庭中不同投資組合的業績報告。 問題是,有問題的投資組合從來都不相同,每個家庭的金額也不相同。 因此,我復制粘貼了一個模板(即格式化和...),並將格式化行(包含公式和...)添加到報告中每個投資組合的正確系列中。 一切正常,代碼當然不是最佳和完美的,但它可以很好地滿足我們的需要。 問題不在於代碼本身,而是當我第一次執行代碼時,它運行得非常快(比如 1 秒)......但是從第二次開始,代碼速度顯着變慢(基本的 30 秒任務與第一個相同)。 我嘗試了所有手動計算,沒有刷新屏幕......但這確實不是問題所在。 對我來說,這看起來像是內存泄漏,但我找不到問題出在哪里! 為什么代碼運行得非常快,但之后卻慢得多……無論報告的長度和文件的內容如何,​​我都需要關閉 excel 並為每個報告重新打開它。

**不確定我是否清楚,但這不是因為代碼使excel文件變大或什么,因為在第一次(快速)執行之后,如果我保存工作簿,關閉並重新打開它,(新)第一次執行將再次非常快,但如果我會在不關閉和重新打開的情況下做同樣的 excat 事情,那將會非常慢......^!^!

Dim Family As String
Dim FamilyN As String
Dim FamilyP As String
Dim NumberOfFamily As Integer
Dim i As Integer
Dim zone As Integer


Sheets("RapportTemplate").Cells.Copy Destination:=Sheets("Rapport").Cells
Sheets("Rapport").Activate

i = 3
NumberOfFamily = 0
FamilyP = Sheets("RawDataMV").Cells(i, 4)
While (Sheets("RawDataMV").Cells(i, 3) <> "") And (i < 100)

    Family = Sheets("RawDataMV").Cells(i, 4)
    FamilyN = Sheets("RawDataMV").Cells(i + 1, 4)

    If (Sheets("RawDataMV").Cells(i, 3) <> "TOTAL") And _
    (Sheets("RawDataMV").Cells(i, 2) <> "Total") Then

        If (Family <> FamilyP) Then
            NumberOfFamily = NumberOfFamily + 1
        End If
        With Sheets("Rapport")
            .Rows(i + 8 + (NumberOfFamily * 3)).EntireRow.Insert
            .Rows(1).Copy Destination:=Sheets("Rapport").Rows(i + 8 + (NumberOfFamily * 3))
            .Cells(i + 8 + (NumberOfFamily * 3), 6).Value = Sheets("RawDataMV").Cells(i, 2).Value
            .Cells(i + 8 + (NumberOfFamily * 3), 7).Value = Sheets("RawDataMV").Cells(i, 3).Value
        End With
    End If
    i = i + 1
    FamilyP = Family
Wend

For i = 2 To 10
    If Sheets("Controle").Cells(16, i).Value = "" Then
        Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = True
    Else
        Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = False
    End If
Next i
Sheets("Rapport").Cells(1, 1).EntireRow.Hidden = True

'Define printing area
zone = Sheets("Rapport").Cells(4, 3).End(xlDown).Row
Sheets("Rapport").PageSetup.PrintArea = "$D$4:$Y$" & zone


Sheets("Rapport").Calculate
Sheets("RANK").Calculate
Sheets("SommaireGroupeMV").Calculate
Sheets("SommaireGroupeAlpha").Calculate
Application.CutCopyMode = False

結束子

我目前沒有筆記本電腦,但您可以嘗試幾件事:

  1. 使用選項顯式確保在使用它們之前聲明所有變量;
  2. 據我所知,數字的原生 vba 類型不是整數而是long ,整數被轉換為 long ,以節省計算時間,使用 long 而不是整數;
  3. 您的 Family 變量被定義為字符串,但您將整個單元格而不是它們的值存儲在其中,即=cells()而不是=cells().value
  4. 一個經驗法則是使用cells(rows.count, 4).end(xlup).row而不是cells(3, 4).end(xldown).row. ;
  5. 條件格式可能會減慢很多速度;
  6. 如果可能的話,使用for 范圍內的每個循環而不是while ,甚至將范圍復制到變量數組並對其進行迭代(這是最快的解決方案);
  7. 使用早期綁定而不是后期綁定,即盡快以適當的類型定義對象;
  8. 不顯示打印區域(分頁符等);
  9. 嘗試做一些分析並尋找瓶頸 - 請參閱查找 excel vba 瓶頸
  10. 如果您不需要格式,則僅粘貼值;
  11. 每次復制/粘貼后清除剪貼板;
  12. 使用完對象后將對象設置為Nothing
  13. 使用Value2而不是Value - 這將忽略格式並僅采用數值而不是格式化值;
  14. 使用工作表對象並引用它們,例如

    Dim sh_raw As Sheet, sh_rap As Sheet set sh_raw = Sheets("RawDataMV") set sh_rap = Sheets("Rapport")

然后到處使用sh_raw而不是Sheets("RawDataMV")

我有同樣的問題,但我終於想通了。 這聽起來很荒謬,但它與打印頁面設置有關。 顯然,每次更新單元格時 Excel 都會重新計算它,這就是導致速度變慢的原因。

嘗試使用

Sheets("Rapport").DisplayPageBreaks = False

在您的例行程序開始時,在任何計算和

Sheets("Rapport").DisplayPageBreaks = True

最后。

我有同樣的問題。 我遠非專家級程序員。 以上答案對我的程序有所幫​​助,但沒有解決問題。 我在 5 歲的筆記本電腦上運行 excel 2013。 打開程序而不運行它,轉到文件>選項高級,向下滾動到數據並取消選中“禁用撤消大型數據透視表刷新......”和“禁用撤消大型數據模型操作”。 您也可以嘗試讓它們處於選中狀態,但降低它們的價值。 其中一個或兩個似乎正在創建一個不斷增加的文件,該文件會減慢宏並最終使其停止。 我假設關閉 excel 會清除他們創建的文件,這就是為什么當 excel 關閉並重新打開至少一段時間時它運行得很快。 有更多知識的人將不得不解釋這些更改將做什么以及取消選中它們的后果是什么。 這些更改似乎將應用於您創建的任何新電子表格。 如果我有一台更新更強大的計算機,也許這些更改就沒有必要了。

我對此表示懷疑,但這是:“對大數據模型操作禁用撤消”確實救了我! 它立即立即開始以相同的速度運行我的宏。

暫無
暫無

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

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