Как найти повторяющиеся строки, а затем удалить один из них? требует VBA - PullRequest
3 голосов
/ 10 марта 2012

Мне было интересно, знает ли кто-нибудь, как удалить повторяющиеся строки. Скажем, например,

   A        B       C

1  1        3       4
2  2        6       9
3  TEST     1       2
4  TEST     1       2
5  Both     1
6  Hi               2
7  None     3       3
8  Loud     4       4

Для приведенного выше конкретного примера TEST был повторен дважды. В некоторых других случаях имя может бытьнекоторые другие виды, такие как полдень, утро и т. д. И строка 8 не обязательно должна быть последней строкой.Я понятия не имею, как сравнить строки, чтобы проверить наличие повторных имен, а затем удалить их.Мне нужно запустить макрос с этим, и поэтому мне понадобится VBA.Если вы знаете это, пожалуйста, поделитесь им со мной .. Буду благодарен!

Попытка кодов:

 Sub Macro1()

   Dim LastRow As Long, n As Long, rowstodelete As Long

    LastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

      For n = 1 To LastRow

    With Worksheets("Sheet1").Cells(n, 1)
         If .Cells(n, 1) = .Cells(n + 1, 1) Then
           rowstodelete = Worksheets("Sheet1").Cells(n, 1)
           Rows(rowstodelete).Select
           Selection.Delete Shift:=xlUp
         End If
   End With
       Next n

 End Sub

К сожалению, в .Cells произошла ошибка во время выполнения (n, 1) .. Я понятия не имею, почему это так ... если вы знаете, что-то можете поделиться со мной или изменить это немного.буду благодарен!

Ответы [ 5 ]

6 голосов
/ 11 марта 2012

user1204868

Рекомендуется, чтобы при удалении строк всегда делали это в обратном режиме.Смотрите этот код.Также вам не нужно выделять ячейку перед удалением.Это замедлит ваш код*

есть идеи, почему обратное удаление строк лучше?- Франклин 29 секунд назад

Когда вы удаляете строку, ваш цикл For портится, когда вы нацеливаетесь на заданное количество строк.Затем вы должны написать дополнительную строку кода, как вы сделали, чтобы отслеживать строки, которые вы удалили.Это также замедляет ваш код :) Когда вы удаляете в обратном порядке, вам не нужно учитывать удаленную строку, поскольку она выпадает из текущего цикла * .Таким образом, ваш код быстрее.Но затем, как я уже упоминал выше, если вы не используете обратное удаление строк, используйте второй код, который я дал.Это еще быстрее.

Один момент, который я хотел бы упомянуть, хотя.Если вы используете Excel 2007/2010, то однострочный код, предложенный @brettdj, является самым быстрым:)

HTH

Sid

4 голосов
/ 10 марта 2012

Руководство
Веб-сайт Билла Йелена предлагает три метода не VBA

  1. Все версии: Использование уникальной опции в расширенном фильтре
  2. XL 07/10: Использование условного форматирования для отметки дубликатов
  3. Xl 07/10: Используйте значок «Удалить дубликаты»

Для (3) эквивалентный VBA будет выглядеть примерно так (без заголовков)
ActiveSheet.Range("$A$1:$C$100").RemoveDuplicates Columns:=1, Header:=xlNo

enter image description here

Обработка существующих дубликатов
Мой бесплатный Duplicate Master addin позволит вам

  • Выбрать
  • Цвет
  • Список
  • Удалить

дублирует либо ячейки, либо целые строки (что кажется вашим вопросом), либо определенные столбцы в строке

Но что более важно, это позволит вам выполнить более сложное сопоставление, чем точные строки, например

  • Поиск без учета регистра / с учетом регистра
  • Обрезка / очистка данных
  • Удалить все пробелы (включая CHAR (160))
  • Выполнить совпадения с регулярными выражениями
  • Совпадение по любой комбинации столбцов (т. Е. Столбец A, все столбцы, столбцы A и B и т. Д.) enter image description here
0 голосов
/ 25 сентября 2013

Я думаю, нам нужно сначала отсортировать данные перед запуском этого макроса, чтобы полностью удалить дубликаты.

0 голосов
/ 09 января 2013

Самый простой способ сделать это в VBA (в версии 2007 или выше):

Worksheet("Sheet1").Range("A1").CurrentRegion.RemoveDuplicates(Array(1, 2, 3))

В зависимости от макета вашего рабочего листа вам может потребоваться настроить Range("A1").CurrentRegion в соответствии с вашим диапазоном данных ...

0 голосов
/ 10 марта 2012

Я попробовал свой код еще раз, и он может сработать .. Спасибо!Я поделюсь этим здесь, чтобы ответить на подобные вопросы в будущем!

  Sub Macro1()

  Dim LastRowcheck As Long, n1 As Long, rowschecktodelete As Long

  LastRowcheck = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

  For n1 = 1 To LastRowcheck
    With Worksheets("Sheet1").Cells(n1, 1)
      If Cells(n1, 1) = Cells(n1 + 1, 1) Then
        Worksheets("Sheet1").Cells(n1, 1).Select
        Selection.EntireRow.Delete
     End If
   End With
  Next n1

  End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...