Попытка выделить уникальные значения на нескольких листах в Excel 2007

Попытка выделить уникальные значения на нескольких листах в Excel 2007

Я пытаюсь сравнить значения из столбца A Sheet1(который я переименовал в «AR») и столбца A Sheet2(который я переименовал в «Вставить здесь») и выделить строки, содержащие значения, которых нет на другом листе. (Оба столбца заканчиваются пустой ячейкой.) Я нашел макрос, который, как я думал, делает что-то похожее на то, что мне нужно здесь, наЭффективное удаление дубликатов записей на нескольких листах Excel, и я пытаюсь изменить его под свои нужды, но не могу заставить его работать. В настоящее время, когда я запускаю его, он блокирует Excel, и мне приходится выполнять команду «Завершить задачу» в Excel.

Вот что у меня есть на данный момент:

Option Explicit

Sub Compare2()
    Application.ScreenUpdating = False

    Dim startRow As Integer
    startRow = 1

    Dim row As Integer
    row = startRow

    Dim bRow As Integer

    'sharks below, cap'ain
    ' This loop is looping on row.
    ' Scan down column AR!A (i.e., Sheet1!A) until we find an empty cell.
    Do While (Worksheets("AR").Range("A" & row).Value <> "")

        Dim aVal As String
        aVal = Worksheets("AR").Range("A" & row).Value
        bRow = startRow             'I see thy booty

        ' This loop is looping on bRow.  Scan down column 'Paste Here'!A
        ' (i.e., Sheet2!A) until we find an empty cell.
        Do While (Worksheets("Paste Here").Range("A" & bRow).Value <> "")

            Dim aVal2 As String
            aVal2 = Worksheets("Paste Here").Range("A" & bRow).Value

            If (aVal <> aVal2) Then
                Worksheets("AR").Rows(row).Interior.ColorIndex = 6
                                ' we found a traitor; feed 'em to the sharks
                row = row - row
                Exit Do
            End If

            If (aVal2 <> aVal) Then
                Worksheets("Paste Here").Rows(row).Interior.ColorIndex = 6
                row = row - row
                Exit Do
            End If

            bRow = bRow + 1
        Loop

        row = row + 1
    Loop

End Sub

Любая ваша помощь будет полезна.

решение1

Жаль, что вы не разобрались в сути подпрограммы, которую вы использовали, прежде чем начать ее модифицировать.

  • Подпрограмма «WalkThePlank» ищетМатчи. Когда он находит строку в Sheet1, которая совпадает со строкой в Sheet2​​, он предпринимает действие. Вы ищете уникальные значения; т.е. строки в , Sheet1которые не совпадают ни с чем в Sheet2, и наоборот. Но то, что выделаетвызывает пары строк, которые не совпадают; т.е. если Sheet1!Row 1не совпадает Sheet2!Row 1, вы принимаете меры. Это преждевременно; вам нужно сканироватьвесь путьчтобы Sheet2определить, Sheet1!Row 1совпадают лилюбойстрока в Sheet2.
  • Автор подпрограммы «WalkThePlank» сделал что-то, что не имеет особого смысла. После удаления строки, индексированной переменной row, он установил переменную в 0. Это было расточительно, так как это заставило подпрограмму повторно проверить все Sheet1строки, которые она уже проверила и определила как уникальные. Но, поскольку она удаляет строку, которая не является уникальной (т. е. которая соответствует строке bRowна Sheet2), она не будет смотреть начтострока снова, и нет бесконечного цикла. Чтобы усугубить любопытство, он мог бы сказать row = 0, но вместо этого он загадочно сказал row = row - row.

    Но вам нужно это изменить. (Если быть точнее, я считаю, что вам следует просто удалить row = …операторы внутри Do Whileциклов, за исключением row = row + 1в конце.) Поскольку вы не удаляете строки, этоделаетзаставьте ваш макрос пересмотретьте же данныеснова и снова; т.е. это бесконечный цикл. Вам нужно просто продолжать маршировать вниз Sheet1.

  • Вы можете прервать бесконечный цикл VBA без остановки Excel и потери данных, нажав Ctrl+ Break. Если на вашей клавиатуре нет клавиши Break, попробуйте вызвать экранную клавиатуру, запустив osk и нажав Ctrl, а затем Pause. Если это не сработает, попробуйте Ctrlи затем ScrLk.

Super User — это не служба написания сценариев. Думаю, я достаточно хорошо объяснил, что не так, и вы сможете это исправить. Если у вас все еще не получается, вернитесь и расскажите, где вы застряли.

Связанный контент