1

我们有一个与 5 个用户共享并持续使用的工作簿。我们有大约 1800 条记录和 26 列数据。数据是 VLOOKUPS 标准值的混合。我有 3 个正在运行的宏和 2 个条件格式规则和 5 张带有转储数据的工作表(一张包含 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

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

4

3 回答 3

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

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

于 2012-10-01T10:39:14.570 回答
2

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

在您的情况下,一个示例计算工作流程是:

  • 您更改语音表第 1 列中的一个单元格。
  • 所有VLOOKUP引用数据表的 s 都会重新计算。
  • Worksheet_Change为更改的单元格触发。从处理程序中,您可以修改同一张表的第 41 或 43 列。
  • 所有VLOOKUP引用数据表的 s 都会重新计算。
  • Worksheet_Change为第 41/43 列中更改的单元格触发。什么也没做。

对于每一行,保存时也会发生同样的情况。

你可以:

  • 如果可能的话,让VLOOKUPs 看起来不远到第 41 列。这将消除第二次重新计算。
  • 切换到手动重新计算。
于 2012-10-01T10:30:36.940 回答
1

好的,我所做的是以下,我实现了每个人的解决方案,从创建一个新文件来清理它到编辑宏,这样他们就不会处理不必要的项目(虽然我不再使用它,但我仍然复制它未来!)。

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

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

  • 好像效率更高
  • 更少的加载时间
  • 更少的崩溃(仍然会发生,但只是偶尔而不是所有时间:P)

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

于 2012-10-02T07:23:10.257 回答