|
|
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Доброго дня. помогите правильно реализовать задачу. есть такие данные: 103 101 101 102 103 104 104 при встрече первого уникального значения, напротив него надо поставить "1", примерно так: 103 1 101 1 101 102 1 103 104 1 104 вот это конечно не вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. у меня около 40к значений, считает час. как сделать по-граммотному? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 13:13 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Как бы сделал я: Обязательно ли делать программно ? Если Вы данные вставите в Аксесс, то запросом в одну строчку Вы найдете то что Вам нужно за 10 секунд :). Реализуемо ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 13:17 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Ну и к тому же данные можно не вставлять в Access (Copy-Paste или Import), а сделать их источником данных (Link Tables). Так их всегда легко подменить на другие - кладём другой файл с таким же названием -> анализируем другие данные (подразумеваются однотипные файлы, например отчёт за другой период). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 13:27 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Ну или сегодняшняя моя инновация (для меня, не был уверен что получится): Sub VotEtoDa() Dim rs As DAO.Recordset Dim dbe As New DAO.DBEngine Dim mdb As Database Dim sql As String Dim mPath As String mPath = ActiveWorkbook.FullName Set mdb = dbe.OpenDatabase(mPath, False, False, "Excel 8.0;") Set rs = mdb.OpenRecordset("Select Distinct F1 From my") rs.MoveLast rs.MoveFirst For i = 1 To rs.RecordCount Cells(i, 5).Value = rs.Fields("F1").Value rs.MoveNext Next i End Sub Только нужно сделать 23 действия: Подключить библиотеку - Microsoft DAO И назвать Ваш диапазон данных как-нибудь... Ну у меня он назван "my" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 13:55 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Что-то у меня ругается (Defined Error) на Set rs = mdb.OpenRecordset("Select Distinct F1 From my") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:05 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121, DAO подключил?:) _ парни спасибо за ответы, но в Эксессе я бы сам сделал, на работе нет прав установить, а начальника не считает нужным поставить мне его. надо в Экселе как-то любыми путями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:08 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
И DAO, и Access 9.0... Я делал такое в Экселе. Вот почти готово, внизу лишнюю 1 ставит на первую пустую строку, некогда сейчас шлифовать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:19 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Да, UCase там остались с предыдущей версии, я там строки сравнивал, невзирая на регистр букв. В данном случае UCase не нужен, но и не мешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:26 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121, спасибо друг! с меня завтра победа над немцами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:26 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Только есть один недочёт (сейчас заметил в свете новых знаний) - код рассчитан, что UsedRange начинается с первой строки. Если не так, надо шлифануть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 14:32 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121Что-то у меня ругается (Defined Error) на Set rs = mdb.OpenRecordset("Select Distinct F1 From my") Создали именованный диапазон ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 15:06 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Всю колонку целиком выделил. Сечас попробовал только на части колонки - ничего не изменилось. Может ещё какая библиотека нужна? У меня сейчас такие: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 15:16 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121Может ещё какая библиотека нужна? Да, нет, библиотеки вроде все... Еще раз к именнованому диапазону: Если Вы нажмете Вставка-Имя-Вставить... получите где то следующие: my=Лист1!R1C1:R7C1 так ? Еще только что придумал код :)... Действителен только для чисел. Ну в данном случае наверное идеален... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. В диапазоне 100-200 на 40000 ячеек выполнение 1,2 секунды. Ваш код (Hugo121) - 13,2 секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 15:46 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
ReDim Preserve arr(1 To тут максимальное значение в колонке) можна вынести из цикла, а лучше вообще при объявление указать диапазон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 15:47 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
И еще чуть изменив Код: plaintext 1. 2. 3. 4. 5. 6. 7. получим 0.62 секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 16:13 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Зато Ваш код дробями не работает :) Ещё вопрос - как таймер заставить маленькое время показывать (0,62)? Что-то у меня 0 показывает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 16:52 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Я понял, почему с DAO не работало - надо было файл сохранить :) А я на свежем пробовал, несохранённом ещё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 17:01 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121Зато Ваш код дробями не работает :) Ещё вопрос - как таймер заставить маленькое время показывать (0,62)? Что-то у меня 0 показывает... Да, это правда, и еще с буквами тоже :)... Про таймер даже не знаю, почему так может быть... Всегда показывает целые числа ? Даже при выполнении Вашего макро, или не показывает меньше единицы, тоесть сразу 0 ? Может в Вас комп быстрее чем у меня, и код за 0 секунд выполняется :)) С АДО разобрались ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 17:02 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Нет, дробные тоже показывает, если искусственно тормознуть. Машина не очень шустрая, пень 2,8Ггц С ДАО заработало, коду ведь mPath = ActiveWorkbook.FullName подавай, а где его взять, если файл ещё не сохраняли? В общем, интересный вариант с ДАО, не пользовал такое, возьму на заметку, спасибо. Только не поясните, что означает F1 в коде? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 17:18 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Да, и на мой код тоже много раз 0, а затем как-то 0,015625 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 17:21 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Hugo121В общем, интересный вариант с ДАО, не пользовал такое, возьму на заметку, спасибо. Только не поясните, что означает F1 в коде? Set rs = mdb.OpenRecordset("Select Distinct F1 From my") F1 означает названия поля. Его система автоматически присваивает. В АДО можна указывать, использовать первую строку как название столбцов или нет. Наверное и в ДАО можна, но я не знаю как :) Да, и на мой код тоже много раз 0, а затем как-то 0,015625 Да, эксель мочит... У меня тоже вот код глючит, сам себе прокручивает 2 раза без каких либо циклов , а если через F8 то все нормально... Видимо есть какие-то нюансы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2009, 17:51 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Не пойму куда с форума подевались люди, которые альтернативное решение формулами предлагали? ведь многие вещи не требуют сложных программных решений, достаточно знать элементарные формулы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2009, 11:04 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
DeggasadНе пойму куда с форума подевались люди, которые альтернативное решение формулами предлагали? ведь многие вещи не требуют сложных программных решений, достаточно знать элементарные формулы ТС не спрашивал формулу, ее и не предлагают :)... А вообще, это правильно, что то что можна сделать формулой, лучше делать формулой, чем макросом... Так что Вы предлагайте, а Мы (Я) будем учиться :).... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2009, 14:47 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Мне так удобнее сделать один раз макрос, чем каждый раз в файле формулы сочинять/протягивать. Да и сформулами затем осторожно надо обращаться, ни скопировать, ни перенести данные без опаски нельзя... Ведь обычно работы однотипны - вот например эта задача чувствую скоро у меня будет актуальна каждую неделю, и наверное в разных по происхождению и расположению колонок файлах. Поэтому дополнил макрос для универсальности: Код: 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. Тут два варианта - под цифровое обозначение колонки и под буквенное. Какую колонку просматривать и куда ставить пометку, спрашивается в InputBox-е. И пусть оно работает медленнее, зато универсально под любую смесь данных (регистр букв игнорирует). Работает с UsedRange не обязательно с первой ячейки, лишние пометки внизу не ставит (шлифанул :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2009, 17:21 |
|
||
|
поиск уникальных значений
|
|||
|---|---|---|---|
|
#18+
Можно собъединить VBA и то, что могут формулы ячеек: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2009, 23:13 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=36242792&tid=2178979]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
20ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 373ms |

| 0 / 0 |
