【问题标题】:VBA Macro to compare all cells of two Excel filesVBA宏比较两个Excel文件的所有单元格
【发布时间】:2011-07-20 06:20:46
【问题描述】:

我正在尝试比较两个 Excel 文件,并将仅存在于新文件中的内容存储在一张表中,并将仅存在于旧文件中的内容存储在另一张表中。 (基本上是new - old = sheet1 和old - new = sheet2。)一个SO answers 建议遍历所有单元格并进行简单比较。我(非常)对 VBA 和宏很陌生,所以我不知道该怎么做。它是如何完成的(或者我可以在哪里学习)?

【问题讨论】:

标签: vba excel


【解决方案1】:

您可以对单元格公式进行非常简单的检查:

表 1(新 - 旧)

=(if(AND(Ref_New<>"";Ref_Old="");Ref_New;"")

表 2(旧 - 新)

=(if(AND(Ref_Old<>"";Ref_New="");Ref_Old;"")

此公式应适用于英语 Excel。对于其他语言,它们需要翻译。 (对于德语,我可以提供帮助)

您需要打开所有三个 Excel 文档,然后将第一个公式复制到工作表 1 的 A1 中,将第二个公式复制到工作表 2 的 A1 中。 现在单击第一个单元格的 A1 并标记“Ref_New”,现在您可以选择您的参考,转到新文件并单击 A1,返回 sheet1 并对旧文件的“Ref_Old”执行相同操作。替换另一个“Ref_New”。

对第二张做同样的事情。

现在将公式形式 A1 复制到 zour 数据在旧文件和新文件中的完整范围内。

但这里没有涉及两种情况:

  1. 新旧比较单元格中的数据相同(结果单元格将为空)
  2. 新旧比较单元格中的数据不同(结果单元格将为空)

要涵盖这两种情况,您应该创建自己的函数,即学习 VBA。一个非常有用的Excel页面是cpearson.com

【讨论】:

    【解决方案2】:

    NOT 循环遍历所有单元格!!工作表和 VBA 之间的通信有很多开销,无论是读取还是写入。遍历所有单元格将非常缓慢。我说的是几个小时。

    相反,一次将整个工作表加载到 Variant 数组中。在 Excel 2003 中,这大约需要 2 秒(和 250 MB 的 RAM)。然后,您可以立即循环播放它。

    在 Excel 2007 及更高版本中,工作表大约是 1000 倍(1048576 行 × 16384 列 = 17 十亿个单元格,而 65536 行 × 256 列 = 17 百万在 Excel 2003 中)。如果您尝试将整个工作表加载到 Variant 中,您将遇到“内存不足”错误;在我的机器上,我一次只能加载 3200 万个单元。因此,您必须将自己限制在您知道其中包含实际数据的范围内,或者一点一点地加载工作表,例如一次 30 列。

    Option Explicit
    
    Sub test()
    
        Dim varSheetA As Variant
        Dim varSheetB As Variant
        Dim strRangeToCheck As String
        Dim iRow As Long
        Dim iCol As Long
    
        strRangeToCheck = "A1:IV65536"
        ' If you know the data will only be in a smaller range, reduce the size of the ranges above.
        Debug.Print Now
        varSheetA = Worksheets("Sheet1").Range(strRangeToCheck)
        varSheetB = Worksheets("Sheet2").Range(strRangeToCheck) ' or whatever your other sheet is.
        Debug.Print Now
    
        For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
            For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
                If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
                    ' Cells are identical.
                    ' Do nothing.
                Else
                    ' Cells are different.
                    ' Code goes here for whatever it is you want to do.
                End If
            Next iCol
        Next iRow
    
    End Sub
    

    要与不同工作簿中的工作表进行比较,请打开该工作簿并按如下方式获取工作表:

    Set wbkA = Workbooks.Open(filename:="C:\MyBook.xls")
    Set varSheetA = wbkA.Worksheets("Sheet1") ' or whatever sheet you need
    

    【讨论】:

    • 好提示。我意识到我只需要遍历一列。你会如何建议我这样做?并将其与另一个工作簿中的列进行比较。比较吧。
    • 删除 For iCol...Next iCol 循环。将 iCol 设置为每张表中所需的任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多