1) Go ahead and break the habit of using .UsedRange in your method for determining the first and/or last row of data. It is full of holes and when it does break you won't know it, you just won't know it's doing wrong things to your data.
Instead, pick the row that always has data filled in, like column A, and just evaluate that column directly.
LR = Range("A" & Rows.Count).End(xlUp).Row
2) Before you run your loop, delete all the "error" rows first to speed up the process, they're no longer there to have to be evaluate. This one line of code will delete every row that has a formula in that results in an error in column A:
Columns("A:A").SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete xlShiftUp
3) Maybe this then:
Dim r As Long, LR As Long
Columns("A:A").SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete xlShiftUp
LR = Range("A" & Rows.Count).End(xlUp).Row
For r = LR To 2 Step -1
Select Case Cells(r, "A").Value
Case "ItemA", "ItemB", "ItemC"
Cells(r, "B") = "Here" 'edit this to your own 'change' code
Case Else
Rows(r).EntireRow.Delete xlShiftUp
End Select
Next r
Bookmarks