VBA / Excel突然运行缓慢,没有代码更改

时间:2017-07-03 16:28:58

标签: excel vba excel-vba

我今天早上来上班,开始处理我昨天离开的同一个档案。现在,只要宏为单元格指定值或清除它们,Excel就会慢下来。在我离开之前它很快就闪电了,现在一次需要2-3秒才能为一个单元格赋值。

现在,具有类似宏的其他文件运行正常。这发生在另一个文件一段时间后,所以我恢复到该文件的先前版本,它工作正常,而慢文件继续工作缓慢。我想我现在可以做到这一点,但在这种情况下,需要花费大量工作才能将该文件带到我拥有此版本的位置。我想知道是否有人知道可能会发生什么。这是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

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,可能有很多因素导致了这种变化:

  • 在这些事件中触发的任何操作:

    • Worksheet_Calculate()
    • Worksheet_Change()
    • Worksheet_FollowHyperlink()
    • Worksheet_SelectionChange()
    • Workbook_SheetCalculate()
    • Workbook_SheetChange()
    • Workbook_SheetFollowHyperlink()
  • 外部链接,以及移动或删除的外部文件

  • 数据库连接(检查数据选项卡 - &gt;连接)(疑点)
  • 无效的命名范围(公式选项卡 - &gt;名称管理器;任何参考?)
  • 数据验证规则(数据选项卡 - &gt;数据验证 - &gt;全部清除)
  • 您是否从网络位置打开文件 - 这会使速度慢得多
  • 条件格式规则? - 全部删除
  • 任何隐藏物品? ( 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原因

答案 1 :(得分:0)

我开始注意到Range.Value = ...的操作在升级到64位版本后非常慢。除了.ScreenUpdating.Calculation之类的常规内容之外,我发现还有两件事可以显着提高速度:

  1. 在操作之前将光标更改为xlWait,完成后将其更改为xlDefault

    Public Sub MyMacro()
        On Error Goto Exception
        Application.Cursor = xlWait
        ' Do something here.
    Exception:
        Application.Cursor = xlDefault
    End Sub
    
  2. 使用.Value2代替.Value

    Sheet1.Range("A1").Value2 = "The quick brown fox jumps over the lazy dog."