2017-07-03 173 views
0

今天早上我上班,開始從昨天離開的同一個文件開始工作。現在,只要宏將值賦給單元格或清除它們,Excel就會減慢速度。我昨天離開之前閃電般快,現在每次需要2-3秒才能給單元格賦值。VBA/Excel突然慢速運行,無需更改代碼

現在,其他具有相似宏的文件運行良好。這發生在另一個文件中,因此我恢復到了以前版本的文件,並且它運行良好,而慢速文件繼續運行緩慢。我想我現在可以做到這一點,但在這種情況下,需要花費大量工作才能將該文件帶到我擁有此版本的地方。我想知道是否有人知道可能會發生什麼。這是Excel文件不時做的事情之一(如一種文件損壞),還是有修復?

我已經提供了下面的宏,儘管只要將值分配給單元格就會發生在整個文件中。我通過表示<---SLOW HERE來標記故障區域。

我知道這一切聽起來非常模糊,我知道我很少繼續。也許信息不足,但這是我擁有的一切。沒有理由(我可以看到)發生這種情況。我甚至重新啓動了電腦......以防萬一這個問題出現在Excel之外。不用找了。

如果您需要更多信息,我會盡我所能來闡述我是否可以。感謝您的幫助和理解。

例如宏基:

Sub DeleteButton1_Click() 
    Call UnlockSettingsWorksheet 

    Sheet24.Range("C18:E18").Value = "" <---SLOW HERE 
    Dim i As Long 
    For i = 18 To 21 
    Sheet24.Range("C" & i & ":E" & i).Value = Sheet24.Range("C" & i + 1 & ":E" & i + 1).Value <---SLOW HERE 
    Next 
    Sheet24.Range("C22:E22").Value = "" <---SLOW HERE 

    Call LockSettingsWorksheet 
End Sub 
+1

用'Application.Calculation = xlCalculationManual'嘗試 - 是否有公式的的一大堆在其餘工作表或工作簿?如果是這樣,在默認情況下每次更改值後,Excel將計算所有內容,在更改單元值的每行代碼之後確實是一個巨大的開銷。 –

+0

@RikSportel就是這樣,沒有公式附加到這些價值分配。它只是把一個值放在一個單元格中。我在其中涉及公式的工作簿的其他區域使用'xlCalculationManual',但即使這些分配在禁用自動計算時也很慢。 – LazyBear

+0

您是否在完整代碼執行過程中監視了任務管理器中的應用程序? CPU使用率和更重要的內存使用情況? 根據發佈的代碼,它不應該花時間去這些小的更新。 –

回答

0

正如在評論中提到的,有可能是一個很大的促成這一變化的因素:

  • 任何行動,這些事件觸發:

    • Worksheet_Calculate()
    • Worksheet_Chan GE()
    • Worksheet_FollowHyperlink()
    • Worksheet_SelectionChange()
    • Workbook_SheetCalculate()
    • Workbook_SheetChange()
    • Workbook_SheetFollowHyperlink()
  • 外部鏈接,和外部文件(S)移動或刪除

  • 數據庫連接(檢查數據選項卡 - >連接)(可疑)
  • 命名範圍無效(公式選項卡 - >名稱管理器; ?任何參考文獻)
  • 數據驗證規則(數據選項卡 - >數據驗證 - >清除所有)
  • 你從網絡位置打開文件 - 這將使它更慢
  • 條件格式規則? - 全部刪除
  • 任何隱藏的物體? (Alt + F10 - 全部刪除)
  • 隱藏格式(上次使用的數據是什麼?);這可能並不相關的情況下
  • 腐敗文件

如果該文件已損壞,這是可行的,嘗試從頭重新創建它,並運行此函數首先

如果不是貪官,第一件事我想嘗試一個是宏之前禁用所有Excel功能:


Sub DeleteButton1_Click() 

    'UnlockSettingsWorksheet 

    FastWB   '<--- Disables all Application and Worksheet level settings 

    With ThisWorkbook.Worksheets("Sheet24") 'Fully qualified worksheet 

     .Range("C18:E18").Value2 = vbNullString 

     Dim i As Long 
     For i = 18 To 21 
      .Range("C" & i & ":E" & i).Value2 = .Range("C" & (i + 1) & ":E" & (i + 1)).Value2 
     Next 

     .Range("C22:E22").Value2 = vbNullString 

    End With 

    XlResetSettings '<--- Restores all Excel settings to defaults 

    'LockSettingsWorksheet 

End Sub 


Public Sub FastWB(Optional ByVal opt As Boolean = True) 
    With Application 
     .Calculation = IIf(opt, xlCalculationManual, xlCalculationAutomatic) 
     .DisplayAlerts = Not opt 
     .DisplayStatusBar = Not opt 
     .EnableAnimations = Not opt 
     .EnableEvents = Not opt 
     .ScreenUpdating = Not opt 
    End With 
    FastWS , opt 
End Sub 

Public Sub FastWS(Optional ByVal ws As Worksheet, Optional ByVal opt As Boolean = True) 
    If ws Is Nothing Then 
     For Each ws In Application.ThisWorkbook.Sheets 
      OptimiseWS ws, opt 
     Next 
    Else 
     OptimiseWS ws, opt 
    End If 
End Sub 

Public Sub OptimiseWS(ByVal ws As Worksheet, ByVal opt As Boolean) 
    With ws 
     .DisplayPageBreaks = False 
     .EnableCalculation = Not opt 
     .EnableFormatConditionsCalculation = Not opt 
     .EnablePivotTable = Not opt 
    End With 
End Sub 

Public Sub XlResetSettings() 'default Excel settings 
    With Application 
     .Calculation = xlCalculationAutomatic 
     .DisplayAlerts = True 
     .DisplayStatusBar = True 
     .EnableAnimations = False 
     .EnableEvents = True 
     .ScreenUpdating = True 
     Dim ws As Worksheet 
     For Each ws In Application.ThisWorkbook.Sheets 
      With ws 
       .DisplayPageBreaks = False 
       .EnableCalculation = True 
       .EnableFormatConditionsCalculation = True 
       .EnablePivotTable = True 
      End With 
     Next 
    End With 
End Sub 

也許這將消除一些VBA導致