VBA宏来比较两个Excel文件的所有单元格

时间:2011-03-22 07:14:22

标签: excel vba excel-vba

我正在尝试比较两个Excel文件,并将新文件中的内容存储在一个工作表中,并将旧文件中的内容存储在另一个工作表中。 (基本上是new - old = sheet1old - new = sheet2。)一个SO answers建议循环遍历所有单元格并进行简单比较。我(非常)是VBA和Macros的新手,所以我不知道该怎么做。它是如何完成的(或者我在哪里可以学到这些)?

2 个答案:

答案 0 :(得分:25)

NOT循环遍历所有细胞!!工作表和VBA之间的通信有很多开销,用于读写。循环通过所有细胞将是痛苦的缓慢。我在说几个小时。

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

在Excel 2007及更高版本中,工作表大约大1000倍(1048576行×16384列= 17 十亿单元,而65536行×256列= 17 百万在Excel 2003中)。如果您尝试将整个工作表加载到Variant中,则会遇到“Out of memory”错误;在我的机器上,我一次只能加载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

答案 1 :(得分:0)

您可以使用Cell公式进行非常简单的检查:

表1(新旧)

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

表2(旧 - 新)

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

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

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

对于第二张也是如此。

现在将形式A1复制到zour数据位于旧文件和新文件的整个范围内。

但这里没有涉及两个案例:

  1. 在New和Old的比较单元格中,相同的数据(结果单元格将为空)
  2. 在New和Old的比较单元格中是不同数据(结果单元格将为空)
  3. 为了涵盖这两种情况,你应该创建自己的功能,意味着学习VBA。一个非常有用的Excel页面是cpearson.com