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

Я пытаюсь сравнить значения из столбца А 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, а затем Пауза. Если это не сработает, попробуйте Ctrl, а затем ScrLk.

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

Другие вопросы по тегам