|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
VBA для Excel. Двухмерный массив. Нужно отсортировать по нескольким полям. При одинаковых данных по всем полям сортировки порядок оставлять изначальный. Т.е. полный аналог метода Sort для листа. Но без скидывания массива на лист, сортировки и обратной записи в массив. . И главное - такой же быстрый, как метод Sort на листе. Почему-то все самописные алгоритмы сортировки работают, но О-О-О-О-О-ОЧЕНЬ медленно!!! Здесь "алгоритм" имеется ввиду не метод (пузырёк, вставками, быстрая, Шелла и пр.), а именно реализация в VB(A). Или это уже проблема самого VB(A)? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2008, 20:33 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
toliktИли это уже проблема самого VB(A)?Как ты догадался?! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2008, 21:23 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
> Автор: tolikt > VBA для Excel. > Двухмерный массив. Нужно отсортировать по нескольким полям. При > одинаковых данных по всем полям сортировки порядок оставлять изначальный. > Т.е. полный аналог метода Sort для листа. Но без скидывания массива > на лист, сортировки и обратной записи в массив.. > И главное - такой же быстрый, как метод Sort на листе. А почему бы не воспользоватся сбросом данных на лист? не отсортировать быстрым сортом и обратно в массив ;-) например так: Код: 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.
Всего два полных прохода по массиву ;) > > Почему-то все самописные алгоритмы сортировки работают, но > О-О-О-О-О-ОЧЕНЬ медленно!!! Здесь "алгоритм" имеется ввиду не метод > (пузырёк, вставками, быстрая, Шелла и пр.), а именно реализация в VB(A). > Или это уже проблема самого VB(A)? Напиши на другом языке длл с функцией сортировки и сортируй там ;D Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2008, 09:06 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Игорь ГорбоносА почему бы не воспользоватся сбросом данных на лист? не отсортировать быстрым сортом и обратно в массив ;-)1. Иногда не желательны лишние действия с данными на листе. Да и основное время уходит не на сортировку на листе, а на чтение/запись данных между массивом и листом. 2. Сортировка на листе имеет свои недостатки. Например, не учитывается дефис. Обсуждалось, в т.ч., и в теме Сортировка (косяк). Говорят, что есть возможность сортировки через Recordset, но у меня не получается записать в него данные массива: предложенные коды не работают. Может, тут помогут? Игорь ГорбоносНапиши на другом языке длл с функцией сортировки и сортируй там ;DК сожалению, кроме скудных познаний в области VBA, других языков не знаю... :-(( ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2008, 08:20 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
> Автор: tolikt > Игорь Горбонос > А почему бы не воспользоватся сбросом данных на лист? > не отсортировать быстрым сортом и обратно в массив ;-) > 1. Иногда не желательны лишние действия с данными на листе. Делай эти действия на новом листе > Да и основное время уходит не на сортировку на листе, а на > чтение/запись данных между массивом и листом. В моем варианте на лист передается одним действием: r.Value = a Внутренний механизм передачи я не знаю, но думаю, что он оптимизирован, на уровне екселя. Из листа данные забираются тоже одним действием: v = r.Value Механизм передачи из ячеек в массив, тоже не знаю, но меня снова не оставляют мысли об оптимизации на уровне екселя. Результат, правда, получается типа вариант для этого и делался полный проход по массиву, для преобразования к целевому типу, если устраивает вариант не преобразовуй и оставляй как есть > 2. Сортировка на листе имеет свои недостатки. Например, не > учитывается дефис. Обсуждалось, в т.ч., и в теме Сортировка (косяк). Приводи данные к виду в котором не будет косяков, и тут вдруг подумал, ты хочешь сказать, что имеешь двухмерный массив строк ТАКОГО размера? Так не имей такого массива, а заполняй сразу RecordSet и будет тебе расширенная сортировка как говорят ;) > Говорят, что есть возможность сортировки через Recordset, но у меня > не получается записать в него данные массива: предложенные коды не > работают. Может, тут помогут? В RecordSet данные можно записать. Вместо заполнения массива, заполняй его. Можно получить готовый - сделать запрос к листу с этими данными, выбирать тебе. Кода не дам, потому, что не понял, что и почему( скорострельность моего примера достаточно высокая, а правильность сортировки всплыла после, и пока я не вижу проблем и с ней ) тебя не устраивает в моем варианте Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2008, 15:57 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Игорь ГорбоносДелай эти действия на новом листеПри записи массива на лист и обратно могут возникнуть проблемы с форматом данных и прочие подводные камни. И нагромождать лишний код тут совсем не хочется. Игорь ГорбоносВ моем варианте на лист передается одним действием: r.Value = aТут я имел ввиду не о сложности кода записи массива данных на лист и обратно, а о времени. Игорь ГорбоносПриводи данные к виду в котором не будет косяковТак ведь до конца и не понятно, какие косяки могут возникнуть. Тем более, если мне не нужно записывать промежуточные данные на лист и обратно. В любом случае: НАДО ОБОЙТИСЬ БЕЗ ЗАПИСИ НА ДАННЫХ НА ЛИСТ . Только в самом конце и уже окончательные данные. Игорь ГорбоносВ RecordSet данные можно записать. Вместо заполнения массива, заполняй его.Массив и так уже получен запросом через Recordset. Но проблема в том, что массив не один, а несколько и из разных источников. К тому же все возможные действия (суммирование, группировка, сортировка , отбор и т.п.), которые возможно сделать запросом, уже сделаны. И надо из массивов получить ещё выборку данных с сортировкой, суммированием и т.п. Проблему записи данных из массива в Recordset описывал в другой теме, но пока предложенные варианты у меня не работают. Проблему объединения двух и более Recordsetов в один тоже описывал, но тоже пока окончательно не решилось. Игорь Горбоносхочешь сказать, что имеешь двухмерный массив строк ТАКОГО размераМассив не более чем 65536 строк. К тому же Access и прочие базы данных не знаю. Приходиться пользоваться только Excel. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2008, 06:38 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
> Автор: tolikt > В любом случае: НАДО ОБОЙТИСЬ БЕЗ ЗАПИСИ НА ДАННЫХ НА ЛИСТ. Только в > самом конце и уже окончательные данные. Тогда и вариантов нет :) , медленно сортируй в памяти > Игорь Горбонос > В RecordSet данные можно записать. Вместо заполнения массива, > заполняй его. > Массив и так уже получен запросом через Recordset. Но проблема в том, > что массив не один, а несколько и из разных источников. К тому же все > возможные действия (суммирование, группировка, сортировка, отбор и т.п.), > которые возможно сделать запросом, уже сделаны. И надо из массивов > получить ещё выборку данных с сортировкой, суммированием и т.п. Делаешь RecordSet'у сортировку а потом пробегаешся по нему и сумируешь что нужно У тебя появляется и отсортированный набор данных и суммы чего нужно Т.е. ты хочешь сказать что по полученным данным нужно проводить ещё сумирование и группировку? не проще сделать новый запрос с нужными сумированиями и сортировкой? > Проблему записи данных из массива в Recordset описывал в другой теме, > но пока предложенные варианты у меня не работают. > Проблему объединения двух и более Recordsetов в один тоже описывал, > но тоже пока окончательно не решилось. Я бы сначала посмотрел какие данные и в каком объеме нужно будет обрабатывать, после определения этих требований выбирал хранилище, которое позволяет делать все это достаточно быстро, и после работал бы с этим хранилищем. А у тебя получается, что данные приходят как RecordSet'ы, потом ты их сливаешь в массивы, хотя можно попробовать слить на лист, а потом начинаешь придумывать велосипед, как быстрее сделать сортировку и слияние. Но это мое мнение и я не знаю всех влияющих факторов. Но в любом случае обработка больших объемов данных дело не быстрое, показывай SplashScreen с интерактивно изменяющимся ProgressBar'ом который будет показывать что программа не болтается без дела, а работает, но с другой стороны это увеличит время выполнения. Вообщем все ньюансы знаешь только ты и решать тебе ;) > Игорь Горбонос > хочешь сказать, что имеешь двухмерный массив строк ТАКОГО > размера > Массив не более чем 65536 строк. К тому же Access и прочие базы > данных не знаю. Приходиться пользоваться только Excel. Может имеет смысл поучить Акцесс и поручить сортировки и слияние ему? Хотя тебе даже не сколько Акцесс нужен, а работа с mdb базой через ADO, или через что ты ходишь. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2008, 09:32 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
тоже интересно. сразу скажу, с одномерным массивом уже сделано - и быстрее, чем сбрасывать на лист(гораздобыстрее - реализация qsort без рекурсии, и вообще разговоры про написать на другом языке несколько отвлечены от темы, в большинстве случаев VBA справляется нормально, вопрос правильного кода ) интересует именно сортировка по опред полю - пока вижу такой подход: 1 берем одномерный столбец( тот, по которому нужно сортировать)(вот тут лучше воспользоваться средствами не совсем VBA - функция copymemory из библиотеки kernel32 с этим справится быстрее) 2 создаем доп массив, равный получившемуся одномерному- он будет считаться заполненным порядковыми номерами элементов первого массива(1,2,3..) - т.е. изначально он упорядочен. 3 сортируем первый массив, одновременно выполняя те же преобразования над вторым 4 переписываем остальные поля двумерного массива в соответствии с порядком, получившимся в нашем дополнит массиве - например получилось 4,2,8,1.. - заполняем двумерный массив arr(1 to n,1 to c) из первоначального массива arr_n с помощью нашего доп массива arr_r(1 to n) Код: plaintext 1. 2. 3.
есть ли лучшие предложения? или где почитать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 09:44 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
_slan_или где почитать? я думаю, гуглеж по словам "алгоритмы сортировки массивов" даст массу данных, ибо народ на эту тему диссертации защищает ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 10:04 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Shocker.Pro, не так просто - в основном все точно такие же вопросы.. нашел КНУТа, но это 30 лет назад.. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:23 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Консилиум изобретателей велосипедов )) Почему бы не воспользоваться рекордсетом? Он по-любому обгонит все доморощенные vba-алгоритмы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:25 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
к тому же в такой постановке точно заблудишься ибо будет в основном одномерная сортировка, а сней я уже вроде разобрался.. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:25 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
AntonariyКонсилиум изобретателей велосипедов )) Почему бы не воспользоваться рекордсетом? Он по-любому обгонит все доморощенные vba-алгоритмы. бла-бла с одномерной не обогнал.. далеко не обогнал ну как может обогнать, когда на запись время тратится? доморощенный - не значит плохой, да и на доморощенном я не наставиваю - дайте проверенный, а на vba я сам его реализую ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:28 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
_slan_ну как может обогнать, когда на запись время тратится?А массив откуда берется? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:31 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Antonariy, генерируется программой. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:32 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
А, Игорь уже все насоветовал, что я хотел. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:32 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Antonariy, медленно сортируй в памяти? а что recordsets не в памяти? почему медленно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:35 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
> Автор: _slan_ > нашел КНУТа, но это 30 лет назад.. Ты надеешся что с тех пор что-то кардинально изменилось? Вынужден тебя огорчить, что-бы получился ребёнок, по прежнему нужна женщина и мужчинаничего вообще не поменялось. Хотя диссертаций защищено немало Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 11:39 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
_slan_Antonariy, медленно сортируй в памяти? а что recordsets не в памяти? почему медленно?Смысл вопросов от меня ускользнул. Я имел ввиду, что он рекомендовал не использовать массив, а сразу создавать рекордсет, чтобы не тратить время на перегонку данных туда-сюда. Реализация сортировки в нем будет быстрее хотя бы потому, что сделана не на VBA. А то, что процедура, узко заточенная под конкретный одномерный массив, оказалась быстрее, к делу отношения не имеет, работаем-то с двумерным. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 12:25 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Antonariy_slan_Antonariy, медленно сортируй в памяти? а что recordsets не в памяти? почему медленно?Смысл вопросов от меня ускользнул. Я имел ввиду, что он рекомендовал не использовать массив, а сразу создавать рекордсет, чтобы не тратить время на перегонку данных туда-сюда. Реализация сортировки в нем будет быстрее хотя бы потому, что сделана не на VBA. А то, что процедура, узко заточенная под конкретный одномерный массив, оказалась быстрее, к делу отношения не имеет, работаем-то с двумерным. смысл только в характере высказывания :) Тогда и вариантов нет :) медленно сортируй в памяти вот я и спрашиваю где расположены recordsets а отношение имеет ибо надо получить производительность, а как вы правильно заметили, универсальные процедуры, хоть и написанные не на бэйсике(а в чем собственно разница? и в vba проект компилируется..) часто проигрывают узкозаточенным. а почему массивы? так только потому, что это наиболее быстрый способ обращения к данным.. теоретически.. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 14:23 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
Игорь Горбонос > Автор: _slan_ > нашел КНУТа, но это 30 лет назад.. Ты надеешся что с тех пор что-то кардинально изменилось? Вынужден тебя огорчить, что-бы получился ребёнок, по прежнему нужна женщина и мужчинаничего вообще не поменялось. Хотя диссертаций защищено немало Posted via ActualForum NNTP Server 1.4 в методах работы с памятью? надеялся, что изменилось. А вдруг? вот теорему пуанкаре доказали.. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 14:26 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
_slan_, и вообще, мы вступаем на тропу общей полемики. А что скажете о предложенном алгоритме? может кто знает какой алгоритм в методе sort листа используется? мож его улучшить.. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 14:29 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
автор(а в чем собственно разница? и в vba проект компилируется..) Во-первых не компилируется, во-вторых, при прочих равных код, скомпилированный из c++, будет быстрее хотя бы потому, что не зависит от виртуальной машины VB, через которую работают все функции и половина vb-операторов. А такое ответственное дело, как сортировка, в рекордсете наверняка реализована на ассемблере. автора отношение имеет ибо надо получить производительность, а как вы правильно заметили, универсальные процедуры, хоть и написанные не на бэйсике часто проигрывают узкозаточенным.Ну получили вы в ней производительность, что дальше? В рамочку и на стену? Ведь поставленную задачу она не решает. автортак только потому, что это наиболее быстрый способ обращения к данным.. теоретически..Вот именно, что теоретически. А практически подкачивают средства манипуляциями массивами. авторвот я и спрашиваю где расположены recordsetsВ памяти. Только они с ней эффективней обращаются, чем VB. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2010, 16:51 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
по прежнему жду конструктивных предложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2010, 08:32 |
|
Сортировка двумерного массива по нескольким полям
|
|||
---|---|---|---|
#18+
tolikt VBA для Excel . Двухмерный массив. Нужно отсортировать по нескольким полям. При одинаковых данных по всем полям сортировки порядок оставлять изначальный. Т.е. полный аналог метода Sort для листа. без скидывания массива на лист , сортировки и обратной записи в массив.[/b]. И главное - такой же быстрый, как метод Sort на листе Ну так и при чем здесь Excel??? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2010, 06:46 |
|
|
start [/forum/topic.php?fid=60&tid=2154848]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 434ms |
0 / 0 |