Я пытаюсь сравнить значения из столбца 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 ответ1

0

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

  • Подпрограмма «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 не является сервисом для написания сценариев.  Думаю, я достаточно хорошо объяснил, что происходит, чтобы вы могли исправить это сейчас.  Если вы все еще не можете заставить его работать, вернитесь и скажите нам, где вы застряли.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .