Do NOT цикл через все ячейки !! Существует много накладных расходов при обмене данными между рабочими листами и VBA, как для чтения, так и для письма. Цикл по всем клеткам будет мучительно медленным. Я говорю часами.
Вместо этого загрузите сразу весь лист в массив Variant. В Excel 2003 это занимает около 2 секунд (и 250 МБ ОЗУ). Тогда вы можете пройти через это в кратчайшие сроки.
В Excel 2007 и более поздних версиях листы примерно в 1000 раз больше (1048576 строк × 16384 столбцов = 17 миллиардов ячеек по сравнению с 65536 строками × 256 столбцов = 17 миллионами в Excel 2003). Вы столкнетесь с ошибкой «Недостаточно памяти», если попытаетесь загрузить весь лист в Variant; на моей машине я могу загрузить только 32 миллиона ячеек одновременно. Таким образом, вы должны ограничить себя диапазоном, который, как вы знаете, содержит фактические данные, или загружать лист по крупицам, например, 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