
Estou tentando comparar os valores da coluna A Sheet1
(que renomeei como "AR") e da coluna A Sheet2
(que renomeei como "Colar aqui") e destacar linhas contendo valores que não existem na outra planilha. (Ambas as colunas terminam com uma célula vazia.) Encontrei uma macro que achei que fazia algo semelhante ao que eu queria aqui emRemoção eficiente de registros duplicados em várias planilhas do Excel, e estou tentando modificá-lo para atender às minhas necessidades, mas não consigo fazê-lo funcionar. Atualmente, quando eu o executo, ele bloqueia o Excel e tenho que finalizar a tarefa no Excel.
Isto é o que tenho até agora:
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
Qualquer ajuda que você possa fornecer seria útil.
Responder1
É uma pena que você não tenha entendido melhor a sub-rotina que estava canibalizando antes de começar a modificá-la.
- A sub-rotina “WalkThePlank” procurapartidas. Quando encontra uma linha in
Sheet1
que corresponde a uma linha inSheet2
, ele entra em ação. Você está procurando valores únicos; ou seja, as linhasSheet1
que não correspondem a nadaSheet2
e vice-versa. Mas o que você éfazendoestá acionando pares de linhas que não correspondem; ou seja, seSheet1!Row 1
não corresponderSheet2!Row 1
, você age. Isto é prematuro; você precisa digitalizartodo o caminhoparaSheet2
determinar seSheet1!Row 1
correspondequalquerlinha emSheet2
. O autor da sub-rotina “WalkThePlank” fez algo que não faz muito sentido. Após excluir a linha indexada pela
row
variável, ele definiu a variável como 0. Isso foi um desperdício, pois fez com que a sub-rotina reexaminasse todas asSheet1
linhas que já havia examinado e determinado como únicas. Mas, como ele exclui a linha que não é única (ou seja, que corresponde à linhabRow
onSheet2
), ele não analisaráquelinha novamente e não há um loop infinito. Para aumentar a curiosidade, ele poderia ter ditorow = 0
, mas, em vez disso, disse enigmaticamenterow = row - row
.Mas você precisa mudar isso. (Para ser mais preciso, acredito que você deveria apenas eliminar as
row = …
instruções dentro dosDo While
loops; exceto norow = row + 1
final.) Como você não está excluindo linhas, issofazfazer com que sua macro seja reexaminadaos mesmos dadosuma e outra vez; ou seja, é um loop infinito. Você precisa apenas continuar marchando para baixoSheet1
.- Você pode abortar um loop infinito do VBA sem matar o Excel e perder seus dados digitando Ctrl+ Break. Se o seu teclado não tiver uma Breaktecla, tente abrir o teclado na tela executando
osk
e clicando em Ctrle depois em Pause. Se isso não funcionar, tente Ctrle então ScrLk.
Superusuário não é um serviço de escrita de scripts. Acho que expliquei o que está errado o suficiente para que você consiga consertar agora. Se você ainda não conseguir fazer funcionar, volte e conte-nos onde você travou.