Excel VBA - сравнивает строки листа на основе значения - PullRequest
2 голосов
/ 10 ноября 2011

Проблема похожа на эту:

Найти различия между двумя листами Excel?

Сравнить два листа Excel

В частности, моя проблема заключается в том, что у меня есть ежемесячный список сотрудников с уникальным идентификатором и около 30 столбцов других данных для около 900 сотрудников.

Я пытаюсь выполнить две вещи:

  1. Сравните, были ли сотрудники добавлены или удалены между списками.
  2. Между листами для каждого сотрудника сравните, что другоеданные для этого сотрудника изменились.т.е. должность изменилась.

Большинство сравниваемых надстроек / модулей, которые я нахожу, сравнивают только определенные диапазоны по порядку, таким образом, однажды различие, если будет найдено, каждая последующая строка будет отличаться.

Во-первых, мне интересно, существуют ли какие-либо инструменты, способные сделать это.Если не я думал о создании своего.Я думал об этом, просматривая каждого сотрудника и используя vlookup для проверки совпадений.Я обеспокоен тем, что много циклов затруднит использование макроса.Любое руководство о том, как я должен идти об этом?Спасибо.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Не проверено, но даст вам место для начала ... Это не находит бывших сотрудников, которые находятся на "старом" листе, но не на "текущем" листе.

Sub CompareEmployeeInfo()

    Const ID_COL As Integer = 1 ' ID is in the first column
    Const NUM_COLS As Integer = 30 'how many columns are being compared?

    Dim shtNew As Excel.Worksheet, shtOld As Excel.Worksheet
    Dim rwNew As Range, rwOld As Range, f As Range
    Dim x As Integer, Id
    Dim valOld, valNew

    Set shtNew = ActiveWorkbook.Sheets("Employees")
    Set shtOld = ActiveWorkbook.Sheets("Employees")

    Set rwNew = shtNew.Rows(2) 'first employee on "current" sheet

    Do While rwNew.Cells(ID_COL).Value <> ""

        Id = rwNew.Cells(ID_COL).Value
        Set f = shtOld.UsedRange.Columns(ID_COL).Find(Id, , xlValues, xlWhole)
        If Not f Is Nothing Then
            Set rwOld = f.EntireRow

            For x = 1 To NUM_COLS
                If rwNew.Cells(x).Value <> rwOld.Cells(x).Value Then
                    rwNew.Cells.Interior.Color = vbYellow
                Else
                    rwNew.Cells.Interior.ColorIndex = xlNone                    
                End If
            Next x

        Else
            rwNew.Cells(ID_COL).Interior.Color = vbGreen 'new employee
        End If

        Set rwNew = rwNew.Offset(1, 0) 'next row to compare
    Loop

End Sub
0 голосов
/ 10 ноября 2011

Не знаю, есть ли что-нибудь, что делает это для вас или нет. Но вы можете использовать Dictionary Object, чтобы упростить задачу сравнения. Вы также можете взять примеры из этого ответа, который использует Dictionaries, который проверен на уникальность и оптимизирован для скорости, измените его на то, что вам нужно. Затем вы можете использовать этот быстрый метод , чтобы закрасить ячейки или все, что вы хотите с ними сделать.

Я знаю, что я не предоставляю вам код, но эти указатели помогут вам начать работу, и если у вас возникнут дополнительные вопросы, я могу вам помочь.

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