2017-07-03 180 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导致