某些背景:
我有一个Excel加载项,执行17个子例程,并想知道什么是最简单,最有效,最快捷的方法
到目前为止我收集了什么:
我已经了解了一些如何实现这一目标的方法,最明显的是来自here,here,here,最重要的是here。这些建议方法,如
UsedRange
转储到数组中,然后在所有潜艇完成后将UsedRange
转储到第二个阵列中。比较两个数组并找到不同的方式。worksheet_change
事件记录更改。worksheet_change
事件触发时都会检查数组的方法需要.06秒,这似乎会增加很多开销。我面临的一些特殊问题包括:
Worksheet_Change
事件并在每次错误后立即写入单独的工作表因此得到了解决。即使像马克所暗示的那样使用两种方法似乎也会造成太多滞后时间。worksheet_change
事件不会触发。所以,这基本上消除了我遇到的所有选项。我能想到的唯一另一个选择是只有一个数组,在代码执行时用它来记录单元格/位置以及位置中的错误,然后在子程序完成后将整个数组转储到新工作表中。这真的是我最好的选择吗?
所以,鉴于上述所有事实和研究
现在,我的问题是:
答案 0 :(得分:0)
这是我决定使用的内容。使用这种方法,每当我想记录一个变化并传递我需要记录的必要变量时,我就调用一个sub。在这种情况下,Cell
,Reason
,Status
。然后,已调用的子项将其存储在公共Array
的末尾,在本例中为ChangeLog
。在我完成记录所需的所有更改后,我调用PrintLog
子将更改列表吐出到新工作表上,我重命名更改日志。我添加的一个简洁的补充是我在将值存储在数组中时生成的预制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
更改日志表预览: