|
|
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
PlanBпросто sql-запрос книги excel к самой себе. такое можно встроенными способами сделать ручками. просто в данном случае вам дали красивый и универсальный код Ручками много чего можно делать, но все упирается в такой фактор как время и производное от времени - скорость. Кроме того, код, предложенный Дмитрием, позволил мне взшлянуть на автоматизацию рутинных процессов с новой точки бытия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 15:10 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
SirFisherDjon PlayerРаз у вас 150 тысяч строк, значит у вас как минимум Excel 2007. А в Excel 2007 есть такая фишка "Удалить дубликаты" во вкладке "Данные". Спасибо, мне знакома эта операция в excel. Но она не выполняет задачу в той форме, которая мне нужна. Но, за участие в беседе - спасиборешает... вообще, как мне кажется, прописывать подключение ADO в задачке, для которой есть, как минимум 2 встроенных метода 2007 excel (я имею ввиду уже упомянутые "удалить дубликаты" и "получить внешние данные из excel"), - дело не благодарное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 15:41 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
SirFisher, Попробуйте из кода Дмитрия убрать кейс, т.е. строки Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2011, 16:42 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
Более чем в 2 раза быстрее получилось: Sub test2() Dim tm: tm = Timer Sheets(2).[A1].CurrentRegion.ClearContents Dim a(), oDict As Object, i As Long, temp As String Dim ind As Long With Sheets(1) a = .[A1].CurrentRegion.Value End With ReDim b(1 To UBound(a), 1 To 22) Set oDict = CreateObject("Scripting.Dictionary") For i = 1 To UBound(a) temp = _ a(i, 3) & "|" & _ a(i, 4) & "|" & _ a(i, 5) & "|" & _ a(i, 6) & "|" & _ a(i, 7) & "|" & _ a(i, 8) & "|" & _ a(i, 9) & "|" & _ a(i, 10) & "|" & _ a(i, 11) & "|" & _ a(i, 12) & "|" & _ a(i, 13) & "|" & _ a(i, 14) & "|" & _ a(i, 15) & "|" & _ a(i, 16) & "|" & _ a(i, 17) & "|" & _ a(i, 18) & "|" & _ a(i, 19) & "|" & _ a(i, 20) & "|" & _ a(i, 21) & "|" & _ a(i, 22) If Not oDict.Exists(temp) Then ind = ind + 1 oDict.Add temp, CStr(ind) For ii = 1 To 22: b(ind, ii) = a(i, ii): Next End If Next With Sheets(2) .[A1].Resize(ind, 22) = b End With Sheets(2).Activate Debug.Print Timer - tm End Sub ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2011, 18:23 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
Упс, упустил: For i = UBound(a) To 1 Step -1 но тогда ещё в конце отсортировать по порядку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2011, 18:25 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
Предыдущий вариант просто оставляет первую попавшуюся уникальную строку (в зависимости от направления перебора массива это будет первая или последняя строка источника). Вот ещё два варианта - первый оставляет последнюю строку из дублей (т.е. практически как v.01), второй оставляет строку с последней датой (еcли даты одинаковы, тогда последнюю встреченную). Но вывод не сортируется. Вообще на ADO результат красивее - сортированный, и отбор последних по бОльшему количеству полей задан, но процесс в 2 раза медленнее на примере (не знаю, как на 150к строк будет), но сложнее настройка, да и может хватит просто взять строку с последней датой? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2011, 09:12 |
|
||
|
Удаление повторяющихся строк
|
|||
|---|---|---|---|
|
#18+
Коллеги, подскажите по коду (см. ниже). Взят из примера выше (в начеле темы). Работает относительно первой строки. Как сдвинуть относительно второй второй строки (то есть будет заголовок и одна строка с которой не будет производиться работа). Другими словами, первый две строки не трогать. Менял вот это Код: plaintext Код: plaintext Ниже в Код: plaintext 1. Основной код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2011, 16:57 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=37438751&tid=2176482]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
3ms |
| others: | 204ms |
| total: | 341ms |

| 0 / 0 |
