Удаление строк с дублирующейся информацией в столбцах

Я пишу код, который копирует данные с одного листа на другой, и эта функция работает нормально. Теперь я пытаюсь закодировать его, чтобы удалить все строки, содержащие дублирующую информацию, на основе идентификационного номера этой информации в столбце 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 для метода и еще одна страница с более подробной реализацией. Они должны прояснить любые ваши вопросы.

Другие вопросы по тегам