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