Удаление строк с дублирующейся информацией в столбцах
Я пишу код, который копирует данные с одного листа на другой, и эта функция работает нормально. Теперь я пытаюсь закодировать его, чтобы удалить все строки, содержащие дублирующую информацию, на основе идентификационного номера этой информации в столбце F. Часть нашего процесса заключается в том, чтобы вручную вводить в столбец E после обработки каждой строки.
Поэтому моей конечной целью является удаление кода строк, где столбец E пуст, а столбец F является дубликатом. Мой код работает, но ничего не удаляет. Я действительно надеюсь, что просто упускаю что-то смехотворно очевидное.
For i = 1 To Range("f" & Rows.Count).End(xlUp).Row
If Cells(i, 5).Value = "" Then 'if column E is blank on row i
x = Cells(i, 6).Value
If Not IsError(Application.Match(x, "F:F", 0)) Then '& if that row is a duplicate
ActiveSheet.Range(x).EntireRow.Delete 'delete new duplicate row
End If
End If
Next i
3 ответа
Итак, есть пара ошибок, которые необходимо устранить в вашем коде. Во-первых, если вы перебираете диапазон и удаляете строки, лучше всего начинать снизу и идти вверх. Это предотвращает проблемы, когда ваш итератор находится в строке, эта строка удаляется, и цикл по существу пропускает следующую строку.
Далее вы ищете Match
в столбце F из x
, который содержит значение из столбца F. Таким образом, он всегда будет возвращать значение (само по себе, как минимум). Может быть, попробуйте использовать COUNTIF
и посмотреть, если оно больше 1, может быть лучшим вариантом?
Далее вы заполнили переменную x
со значением в Cells(i, 6)
, но затем вы пытаетесь использовать его как диапазон при удалении. Измените свой код на следующий и посмотрите, работает ли он:
For i = Range("f" & Rows.Count).End(xlUp).Row To 1 Step -1
If Cells(i, 5).Value = "" Then 'if column E is blank on row i
x = Cells(i, 6).Value
If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate
ActiveSheet.Rows(i).Delete 'delete new duplicate row
End If
End If
Next i
Попробуй это с
For i = Range("f" & Rows.Count).End(xlUp).Row to 1 Step -1
If Cells(i, 5).Value = "" Then 'if column E is blank on row i
x = Cells(i, 6).Value
If Application.Countif(Columns(6), x) > 1 Then '& if that row is a duplicate
Rows(i).EntireRow.Delete 'delete new duplicate row
End If
End If
Next i
Вы пытались удалить номер строки x, а не i. Кроме того, все будет соответствовать один раз.
Почему бы не использовать метод.RemoveDuplicates? Это быстрее, чем зацикливаться. Вот примерный план его использования:
With Range
.RemoveDuplicates Columns:=Array(6), Header:=xlYes
End With
Вот документ MSDN для метода и еще одна страница с более подробной реализацией. Они должны прояснить любые ваши вопросы.