Вы хотите проверить .Value
каждой отдельной ячейки.
Таким образом,
If Not IsEmpty(Columns("AB").Value) And Not IsEmpty(Columns("CD").Value)
становится
If Not IsEmpty(Cells(i, "AB").Value) And Not IsEmpty(Cells(i, "CD").Value)
и аналогично для
If Not IsEmpty(Columns("PQ").Value) And Not IsEmpty(Columns("RS").Value)
Вы можете объединить операторы If
(хотя я не уверен, что это помогает с удобочитаемостью). Используйте скобки, чтобы заключить каждое условие:
If (Not IsEmpty(Cells(i, "AB").Value) And Not IsEmpty(Cells(i, "CD").Value)) Or _
(Not IsEmpty(Cells(i, "PQ").Value) And Not IsEmpty(Cells(i, "RS").Value)) Then
Более важно было бы найти последнюю строку и выполнить цикл для нее, а не через все строки. См. этот вопрос о том, как это сделать.