VBA Macro для сравнения всех ячеек двух файлов Excel - PullRequest
12 голосов
/ 22 марта 2011

Я пытаюсь сравнить два файла Excel и сохранить то, что есть только в новом файле, на одном листе и сохранить то, что есть только в старом, на другом листе. (В основном new - old = sheet1 и old - new = sheet2.) В одном SO ответе предлагается пройти через все ячейки и провести простое сравнение. Я (очень) новичок в VBA и макросах, поэтому не знаю, как это сделать. Как это делается (или где я могу это узнать)?

Ответы [ 2 ]

25 голосов
/ 22 марта 2011

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
0 голосов
/ 22 марта 2011

Очень простая проверка, которую вы можете сделать с формулами ячейки:

Лист 1 (новый - старый)

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

Лист 2 (старый - новый)

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

Эта формула должна работать для английского языка Excel.Для других языков они должны быть переведены.(Для немецкого я могу помочь)

Вам нужно открыть все три документа Excel, затем скопировать первую формулу в А1 вашего листа 1, а вторую - в А1 листа 2. Теперь нажмите А1 в первой ячейке.и отметьте «Ref_New», теперь вы можете выбрать свою ссылку, перейти к новому файлу и щелкнуть в A1, вернуться к sheet1 и сделать то же самое для «Ref_Old» со старым файлом.Замените также другой «Ref_New».

Сделайте то же самое для Листа 2.

Теперь скопируйте форму A1 формулы во всем диапазоне, где данные zour находятся в старом и новом файле.

Но два случая здесь не рассматриваются:

  1. В сравниваемой ячейке New и Old находятся те же данные (Результирующая ячейка будет пустой)
  2. В сравниваемой ячейкеячейка New и Old - это разные данные (Результирующая ячейка будет пустой)

Чтобы охватить и эти два случая, вы должны создать свою собственную функцию, то есть изучить VBA.Очень полезная страница Excel - cpearson.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...