Excel - 工作簿很慢并且崩溃了很多

时间:2012-10-01 09:44:30

标签: excel excel-2007

我们有一个工作簿,我们与5个用户共享并持续使用。我们有大约1800条记录和26列数据。数据是VLOOKUPS,标准值的混合。我有3个宏运行和2个条件格式规则和5个带dumpdata的表(一个包含17K记录和40列数据)。

我们已尝试删除所有不需要的额外功能,并将其替换为标准文字,但我们没有发现差异。

工作簿不断崩溃,即使我们不触摸它,只是在里面点击它,它会冻结,可能需要10分钟才能再次使用。我还注意到它占用了相当多的资源(CPU有时会达到100%)并且当你保存它时会使用100%的CPU。

有没有人对如何加速我们的工作簿或至少阻止文件崩溃有所了解? :)


在Sheet1(语音)中调用

Private Sub Worksheet_Change(ByVal Target As Range)
    '43 = ok '41 = NOK

    'check if change happened in column A
    If Target.Column = 1 Then
      'check if changed value is X
      If Target.Value Like "*x*" Then
          'add datestamp if it is
          Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
      Else
      End If

      If Target.Value Like "*NOK*" Then
          Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")
      Else
      End If
    End If

End Sub

在ThisWorkbook中调用

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Set shtVO = Sheets("Voice")
endRowVO = shtVO.Range("J" & Rows.Count).End(xlUp).Row

For Row = 2 To endRowVO
    If IsEmpty(shtVO.Cells(Row, 28).Value) = False Then
        If shtVO.Cells(Row, 3).Value <> shtVO.Cells(Row, 28).Value Then
            If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
            Else
                shtVO.Cells(Row, 1).Value = shtVO.Cells(Row, 1).Value + "CheckDoneDate"
            End If
        Else
            If shtVO.Cells(Row, 3).Value = shtVO.Cells(Row, 28).Value Then
                If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
                    shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "")
                End If
            End If
        End If
    Else
            If shtVO.Cells(Row, 1).Value Like "*CheckDoneDate*" Then
                shtVO.Cells(Row, 1) = Replace(shtVO.Cells(Row, 1), "CheckDoneDate", "")
            End If
    End If
Next Row

End Sub

被称为模块1

Sub DateNow()

ActiveCell.Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss")

End Sub

Sub UpdateLinks()
'
' Update Links
'
    'ActiveWorkbook.UpdateLink Name:="F:\VOICE.xlsm", Type:=xlExcelLinks
    'ActiveWorkbook.CalculateFull

End Sub

当前状态:阅读我的回答。

3 个答案:

答案 0 :(得分:2)

Excel公式在其参数更改时重新计算(或者当任何单元格更改时,如果函数是不稳定的),则重新计算。

您的案例中的示例计算工作流程将是:

  • 您可以更改第1列中“语音表”中的单元格。
  • 重新计算引用数据表的所有VLOOKUP
  • 为更改的单元格触发
  • Worksheet_Change。从处理程序中,修改同一表的第41或43列。
  • 重新计算引用数据表的所有VLOOKUP
  • 对于第41/43列中已更改的单元格,将触发
  • Worksheet_Change。什么都不做。

对于每一行的保存也是如此。

你可以:

  • 如果可能的话,使VLOOKUP看起来不如第41列。这将消除第二次重新计算。
  • 切换到手动重新计算。

答案 1 :(得分:2)

几种可能性

您的Worksheet_Change更改事件将导致另一个触发器。它不是太糟糕,因为它测试的细胞是第1列并且在第41/43栏中有所改变,但无论如何都值得修复。可能没有太大区别。

此外,如果在该工作表未激活时可以通过代码更改工作表“语音”单元格,则会出现意外结果。将工作表限定符添加到范围调用以进行修复。

Private Sub Worksheet_Change(ByVal Target As Range)
'43 = ok '41 = NOK

'check if change happened in column A
If Target.Column = 1 Then
  'check if changed value is X

  Application.EnableEvents = False  ' <-- Add This

  If Target.Value Like "*x*" Then
      'add datestamp if it is
      Me.Cells(Target.Row, 43).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <---
  ' Else   <--- don't need this
  'End If
  ' --> change to ElseIf (assuming conditions are mutually exclusive)
  ElseIf Target.Value Like "*NOK*" Then
      Me.Cells(Target.Row, 41).Value = Format(DateTime.Now, "yyyy-MM-dd hh:mm:ss") ' <---
  'Else   <--- don't need this
  End If
End If
Application.EnableEvents = True  ' <-- Add This

End Sub

类似于_BeforeSave - 禁用事件以避免_Change触发

答案 2 :(得分:1)

好的,我做的是以下内容,我实现了每个人的解决方案,从创建一个新文件到清理它来编辑宏,所以他们不会处理不必要的项目(尽管我有点不喜欢和#39 ;再使用它,我仍然将它复制到未来!)。

我将工作簿分成两个工作簿。一张工作簿,一张(我们经常使用的一张)。这包含VLOOKUPS,其他功能,按钮宏和2条件格式。我删除了所有转储页并更改了宏的工作方式(按钮而不是onchange或beforesave)。

第二个文件成了我的疑难解答文件。这包含我的所有工作表,但没有宏,没有条件格式。仅使用对单元格的引用显示第一个工作簿中的一个工作表。此文件仅用于故障排除。

  • 似乎效率更高
  • 减少加载时间
  • 崩溃较少(仍然只是偶尔而不是所有时间:P)

感谢大家的时间和精力,我希望这也能帮助将来的人们。 :)