最快的方式来loggingmacros的变化

一些背景:

我有一个Excel加载项,执行17个子例程,并想知道什么是最简单,最有效,最快的方法来

  1. loggingmacros所做的特定更改
  2. 显示所有更改(在新的电子表格中)以及为什么更改(或标记/突出显示)每个单元格的列表
  3. 提供每个错误的单元格地址作为可点击的链接,将用户带到另一个工作表中的特定单元格(在同一工作簿中)

我到目前为止收集到的:

我已经阅读了一些如何实现这一目标的方法,最重要的是从这里 , 在这里 , 在这里 ,最重要的是在这里 。 这些build议的方法如

  • UsedRange转储到数组中,然后在所有UsedRange完成之后,将UsedRange到第二个数组中。 比较两个数组,并找出差异的方式。
  • 使用worksheet_change事件logging更改。
  • Marktastic网站的最后一个链接提供了最有说服力的方法,结合了前两种方法。 然而,即使他每次检查数组的方法都会触发worksheet_change事件,耗时0.06秒,这似乎会加起来很多开销。

我面临的一些特殊问题包括:

  • 处理大文件(15000行,150列)
  • 我的一些潜艇进行了一些不需要注意的改变,例如只重新安排某些细胞的值,否则就不会改变它们
  • 我的macros的构build工作是快速(<1分钟),并完成它的扫描我们的大文件,所以我想这将消除使用Worksheet_Change事件,并写入每个错误后,立即写入单独的工作表。 就像马克build议的那样,既使用两种方法,似乎也会造成太多的滞后。
  • 比较两个数组看起来对于像我一样大的文件来说也是相当慢的,因为这意味着迭代通过15000(行)×150(列)= 2,250,000个单元格
  • 由于我通过macros进行所有的更改, worksheet_change事件不会触发。

所以,这基本上消除了我遇到的所有选项。 我能想到的唯一的其他选项是只有一个数组,用它来logging单元/位置和错误代码正在执行的位置,然后将整个数组完整的转储到新的工作表。 这真的是我最好的select,但?

所以,考虑到以上所有的事实和研究

现在,对于我的问题:

  • 在我的情况下,最有效的方式是logging更改,并显示在我的macros完成之后对文件做了哪些(必须注意的)更改? 无论我是否列出,请随时分享一种您认为最适合这种情况的方法。
  • 你能提供一个简单的示例代码来说明如何实现你所build议的方法吗?

这是我决定去的。 每次使用这种方法,我都会调用一个子variables,并传递我需要logging的必要variables。 在这种情况下, CellReasonStatus 。 然后,被调用的子将其存储在公共Array的末尾,在这种情况下ChangeLog 。 当我完成logging所有我需要的更改后,我调用PrintLog子将更改列表吐出到新的表单中,我将其重命名为Change Log 。 我添加的一个整洁的添加是我制作的预制HYPERLINK公式,同时将值存储在数组中。 将数组粘贴到工作表后,单元格引用已经是可点击的链接,将用户引导到另一个工作表上的地址。

 Public ChangeLog() As String Sub Test() Log ActiveSheet.Range("A2"), "Test1", "Changed" Log ActiveSheet.Range("B2"), "Test2", "Needs Attention" Log ActiveSheet.Range("C2"), "Test3", "Changed" PrintLog End Sub Sub Log(Cell As Range, Reason As String, Optional Status As String) On Error Resume Next If (Not Not ChangeLog) = 0 Then ReDim ChangeLog(0 To 2, 0 To 1) ChangeLog(0, 0) = "Cells": ChangeLog(1, 0) = "Changes Made": ChangeLog(2, 0) = "Status" ChangeLog(0, 1) = "=Hyperlink(" & """#'" & ActiveSheet.Name & "'!" & Cell.Address(False, False) & """,""" & Cell.Address(False, False) & """)" ChangeLog(1, 1) = Reason ChangeLog(2, 1) = Status Else ReDim Preserve ChangeLog(0 To 2, 0 To UBound(ChangeLog, 2) + 1) ChangeLog(0, UBound(ChangeLog, 2)) = "=Hyperlink(" & """#'" & ActiveSheet.Name & "'!" & Cell.Address(False, False) & """,""" & Cell.Address(False, False) & """)" ChangeLog(1, UBound(ChangeLog, 2)) = Reason ChangeLog(2, UBound(ChangeLog, 2)) = Status End If On Error GoTo 0 End Sub Sub PrintLog() Dim currentSheet As Integer: currentSheet = ActiveSheet.Index For s = 1 To ActiveWorkbook.Worksheets.Count If Worksheets(s).Name = "Change Log" Then Application.DisplayAlerts = False Worksheets(s).Delete Application.DisplayAlerts = True Exit For End If Next Dim WS As Worksheet: Set WS = Sheets.Add(After:=Worksheets(ActiveSheet.Index)) WS.Name = "Change Log" WS.Tab.Color = vbYellow WS.Range("A1").Resize(UBound(ChangeLog, 2) + 1, 3) = WorksheetFunction.Transpose(ChangeLog) Erase ChangeLog Worksheets(currentSheet).Activate End Sub 

更改日志表预览:
更改日志