Как удалить дублирующую строку, но сохранить последнюю (VBA)? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть Excel, где у меня есть 2 листа, и я хочу импортировать выбранные столбцы на другой лист и удалить возможные повторяющиеся строки. Проблема в том, что когда я запускаю свой код, он удаляет мою последнюю дублирующую строку, даже если я хочу сохранить последнюю строку и удалить другой «старый» дубликат. Я действительно ценю любую помощь! Спасибо :) Вот мой код, который я пробовал до сих пор:

Private Sub CommandButton1_Click()

Cells.RemoveDuplicates Columns:=Array(1, 2, 3)

Dim lastrow As Long, erow As Long
lastrow = Worksheets("one").Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastrow
Worksheets("one").Cells(i, 1).Copy
erow = Worksheets("two").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("one").Paste Destination:=Worksheets("two").Cells(erow + 1, 1)

Worksheets("one").Cells(i, 3).Copy
Worksheets("one").Paste Destination:=Worksheets("two").Cells(erow + 1, 2)

Next i

End Sub

Другой вопрос, я пробовал этот код для теста Excel, но там, где я хочу использовать этот макрос, гораздо больше данных,Требуется очень много времени, чтобы просмотреть все данные. Проблема в моем коде или фактический Excel такой большой? Надеюсь, я все объясню мрачно.

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2019

"Проблема в том, что когда я запускаю свой код, он удаляет мою последнюю дублирующую строку ..."

Проблема в порядке сортировки ваших данных.

Remove Duplicates перемещается от первого индекса к последнему и сохраняет первое вхождение. Поэтому вам нужно либо отсортировать данные так, чтобы ваш «самый старый» дубликат был первым вхождением сверху, либо использовать другой метод для удаления дубликатов.


»- это проблема вмой код или действительно большой Excel просто такой большой? "

Это может быть и то и другое, но одно можно сказать наверняка, ваш код может определенно работать быстрее.

Низко зависающийпоставить Application.EnableScreenUpdating = False в начале вашего саб. Это мешает Excel обновлять экран при запуске. Это будет иметь огромное значение. Просто не забудьте снова установить его на True.

Вы также просматриваете диапазон по одной строке за раз, но я не вижу какой-либо конкретной причины, почему вам это нужно. Вы можете скопировать диапазон while в одном операторе без зацикливания. Вам даже не нужно копировать вас, не заботясь о порядке форматирования, вы можете передать значения, просто сделав диапазоны равными друг другу.

Пример того, как вы можете передавать значения без обрезки или зацикливания

  Worksheets("two").Range("A2:A" & lastrow).Value = Worksheets("one").Range("E2:E" & lastrow).Value

Вы можете использовать тот же подход с копированием и вставкой, если хотите.

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