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

Jun*_*ter 12 excel vba excel-vba

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

Jea*_*ett 26

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

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

在Excel 2007及更高版本中,工作表大约大1000倍(1048576行×16384列= 170 亿个单元,而Excel36中为65536行×256列= 1700 ).如果您尝试将整个工作表加载到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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 删除 For iCol...Next iCol 循环。将 iCol 设置为每个工作表中需要的任何内容。 (2认同)