2016-03-26 108 views
2

一些背景资料:最快的方式

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

受宏观
  • 显示由所有更改的列表(在新的电子表格),每个单元
    1. 记录具体的变化,以及为什么它改变(或标记/高亮显示)提供的每一个犯错的单元格地址或者,将采取用户到特定的细胞在另一个工作表(在同一工作簿)可点击的链接

    什么我迄今收集:

    我在读了如何做到这一点的方法很少,最重要的是从here,here,here,最重要的是here。这些通过所有的潜艇运行,则倾倒UsedRange到第二阵列的所有潜艇已经完成后之前建议的方法,如

    • 转储UsedRange到一个数组。比较两个数组,并找出这种差异。
    • 使用worksheet_change事件记录更改。
    • Marktastic site的最后一个链接提供了最有说服力的方法,结合了前两种方法。但是,即使他每次检测到阵列的方法都会触发0.06秒,这看起来会增加很多开销。

    我面对的几个具体问题包括:

    • 与大型文件处理(15000+行,150列)
    • 我的一些潜艇的制造不需要被改变例如只重新排列某些单元格中的值,而不会改变它们,否则不会改变它们
    • 我的宏内置工作速度很快(< 1分钟),并且完成了它对我们大文件的扫描,所以我想这会消除使用Worksheet_Change事件,并在每个错误得到相应处理后立即写入单独的工作表。正如Mark所建议的,即使在一个方法中使用这两种方法似乎也会导致太多的滞后时间。
    • 比较两个数组似乎对于像我一样大的文件来说也很慢,因为它意味着迭代通过15000(行)x 150(列)= 2,250,000个单元格
    • 由于我正在制作通过宏观所有更改worksheet_change事件将不会触发。

    所以,基本上消除了所有的我遇到的选项。我能想到的是唯一的其他选择,只是有一个数组,使用它会在代码执行时记录单元/位置和错误位置,然后在完成子缓冲后将整个数组转储到新工作表中,但这真的是我最好的选择吗?

    因此,考虑到所有的事实和研究上述

    现在,我的问题:

    • 什么是在我的处境最有效的方式来记录的变化和显示什么(必要在我的宏完成后对文件进行了更改?无论我是否列出它,请随意分享一种您认为最适合这种情况的方法。
    • 你能提供一个简单的示例代码来说明如何实现你的建议方法吗?
  • +0

    请缩小你的问题,包括你的示例代码和突出问题的一部分。最好的问候, –

    +3

    我不明白这可能会被缩小。我给了一个非常详细的解释。除了链接中包含的代码外,我没有示例代码,但是如果它能让您开心,我会直接在帖子中包含它们。我只是在寻求如何处理这种情况的建议,我不一定需要任何人为我写代码。我知道这不是一个“*代码写入服务*”。我知道这些规则。 – CaffeinatedCoder

    +0

    您的帖子更适合一些讨论论坛,而非SO。最好的问候, –

    回答

    0

    这就是我决定去的地方。使用这种方法,每次我想记录一个变化并传递我需要记录的必要变量时,我会调用一个子变量。在这种情况下,Cell,ReasonStatus。然后被称为的子将其存储在公共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 
    

    更改日志表预览:
    Change Log