
Estoy tratando de comparar los valores de la columna A Sheet1
(a la que le cambié el nombre "AR") y la columna A Sheet2
(a la que le cambié el nombre "Pegar aquí") y resaltar las filas que contienen valores que no existen en la otra hoja. (Ambas columnas terminan con una celda vacía). Encontré una macro que pensé que hacía algo similar a lo que quería aquí enEliminación eficiente de registros duplicados en varias hojas de Excel, y estoy intentando modificarlo para satisfacer mis necesidades, pero no puedo hacerlo funcionar. Actualmente, cuando lo ejecuto, bloquea Excel y tengo que finalizar la tarea en Excel.
Esto es lo que tengo hasta ahora:
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
Cualquier ayuda que pueda brindarnos sería útil.
Respuesta1
Es una lástima que no entendiste mejor la subrutina que estabas canibalizando antes de comenzar a modificarla.
- La subrutina “WalkThePlank” está buscandopartidos. Cuando encuentra una fila
Sheet1
que coincide con una fila enSheet2
, toma medidas. Buscas valores únicos; es decir, filasSheet1
que no coinciden con nadaSheet2
y viceversa. Pero lo que ereshaciendoestá desencadenando pares de filas que no coinciden; es decir, siSheet1!Row 1
no coincideSheet2!Row 1
, toma medidas. Esto es prematuro; necesitas escaneartodo el caminoparaSheet2
determinar siSheet1!Row 1
coincidecualquierfila enSheet2
. El autor de la subrutina “WalkThePlank” hizo algo que no tiene mucho sentido. Después de eliminar la fila indexada por la
row
variable, estableció la variable en 0. Esto fue un desperdicio, ya que provocó que la subrutina volviera a examinar todas lasSheet1
filas que ya había examinado y determinado como únicas. Pero, dado que elimina la fila que no es única (es decir, que coincide con la filabRow
enSheet2
), no veráesofila de nuevo, y no hay un bucle infinito. Para aumentar la curiosidad, podría haber dichorow = 0
, pero, en cambio, dijo crípticamenterow = row - row
.Pero necesitas cambiar eso. (Para ser más preciso, creo que deberías eliminar las
row = …
declaraciones dentro de losDo While
bucles; excepto lasrow = row + 1
del final). Como no estás eliminando filas, estohacehacer que su macro se vuelva a examinarlos mismos datosuna y otra vez; es decir, es un bucle infinito. Necesitas seguir marchando hacia abajoSheet1
.- Es posible que pueda cancelar un bucle infinito de VBA sin matar Excel y perder sus datos escribiendo Ctrl+ Break. Si su teclado no tiene una Breaktecla, intente abrir el teclado en pantalla ejecutando
osk
y haciendo clic en Ctrly luego Pause. Si eso no funciona, inténtalo Ctrly luego ScrLk.
Superusuario no es un servicio de redacción de guiones. Creo que he explicado lo que está mal lo suficientemente bien como para que puedas solucionarlo ahora. Si aún no logras que funcione, regresa y cuéntanos dónde te quedaste atascado.