Ещё как вариант. Зная про "ёжиков" для конкретного приложения (скажем, сейчас ё оказывается в конце) - можно сделать алгоритм с в виде "сортировка+перестановка". Т.е. сначала сортируем весь диапазон, используя встроенные средства, а затем переставляем всех "ёжиков" в промежуток между "е" и " ж". На большом количестве данных алгоритм может начать выигрывать у любых "самописных" сортировок - ведь для второго этапа нам понадобится всего один проход (определить два значения - "начало диапазона 'ж или больше'" и "начало диапазона 'ё'") и одна команда на перезапись диапазона данных тремя объединенными диапазонами (по сути, ещё один проход с копированием)...
Ещё как вариант. Зная про "ёжиков" для конкретного приложения (скажем, сейчас ё оказывается в конце) - можно сделать алгоритм с в виде "сортировка+перестановка". Т.е. сначала сортируем весь диапазон, используя встроенные средства, а затем переставляем всех "ёжиков" в промежуток между "е" и " ж". На большом количестве данных алгоритм может начать выигрывать у любых "самописных" сортировок - ведь для второго этапа нам понадобится всего один проход (определить два значения - "начало диапазона 'ж или больше'" и "начало диапазона 'ё'") и одна команда на перезапись диапазона данных тремя объединенными диапазонами (по сути, ещё один проход с копированием)...AndreTM
МСН, у Вас как всегда все просто и немного букв в коде Забираю себе в копилку . В этот алгоритм легко можно дописать еще "Ёжиков" и др. У меня код запутаннее был Искать не буду.
МСН, у Вас как всегда все просто и немного букв в коде Забираю себе в копилку . В этот алгоритм легко можно дописать еще "Ёжиков" и др. У меня код запутаннее был Искать не буду.SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Понедельник, 20.10.2014, 22:34
Все таки поискал ... как оказалось не зря У меня код работает в разы быстрее чем у МСН Особенно если размножить до 100000.(0,28125 против 33,85156) В файле нажмите "размножить", а потом можно выбрать способ рассчета
Все таки поискал ... как оказалось не зря У меня код работает в разы быстрее чем у МСН Особенно если размножить до 100000.(0,28125 против 33,85156) В файле нажмите "размножить", а потом можно выбрать способ рассчета SLAVICK
Set dic = CreateObject("Scripting.Dictionary") 'Добавление уникальных в коллекцию For i = 1 To UBound(mas) For ii = 1 To UBound(mas, 2) On Error Resume Next dic.Add mas(i, ii), i Next ii, i
[/vba]
SLAVICK, это круто! Сколько варил? [vba]
Код
Set dic = CreateObject("Scripting.Dictionary") 'Добавление уникальных в коллекцию For i = 1 To UBound(mas) For ii = 1 To UBound(mas, 2) On Error Resume Next dic.Add mas(i, ii), i Next ii, i
SLAVICK, я все же предлагаю глянуть вариант вашего же алгоритма, но использующий только "встроенные" средства Максимум - в полтора раза дольше вашего исполняется (таймер замера поправлен, поскольку у меня не используется массив). Ну и все же - поиск уников занимает бОльшую часть этого времени.
SLAVICK, я все же предлагаю глянуть вариант вашего же алгоритма, но использующий только "встроенные" средства Максимум - в полтора раза дольше вашего исполняется (таймер замера поправлен, поскольку у меня не используется массив). Ну и все же - поиск уников занимает бОльшую часть этого времени.AndreTM
Спасибо Сначала использовал коллекцию, потом решил использовать словарь, а пометку не поправил. - правильнее "'Добавление уникальных в словарь"
Я просто работаю с большим количеством данных, поэтому для меня скорость - на вес золота Искал не долго, просто так сложилось, что на тот момент у меня уже было 2 инструмента: добавление в словарь(точнее на тот момент - коллекцию) Быстрая сортировка.
Спасибо Сначала использовал коллекцию, потом решил использовать словарь, а пометку не поправил. - правильнее "'Добавление уникальных в словарь"
Я просто работаю с большим количеством данных, поэтому для меня скорость - на вес золота Искал не долго, просто так сложилось, что на тот момент у меня уже было 2 инструмента: добавление в словарь(точнее на тот момент - коллекцию) Быстрая сортировка.
AndreTM - в Вашем варианте - совсем другой принцип - Вы задействуете лист, и сортировку на листе, что мне лично не подходит, поскольку мои данные обрабатываются полностью в массивах, коллекциях.... К тому же при таком подходе попробуйте расширить диапазон до нескольких столбцов - возникнут проблемы. А если на листе будут данные или автофильтры? Придется это дело обходить
В моем случае можно использовать сколько угодно столбцов(заменить a1:a100000 на например a1:b100000 или selection для выделенного диаппазона) - добавление в словарь будет происходить по всему диапазону :D.
В данном коде используются штатное сравнение <=> .
AndreTM - в Вашем варианте - совсем другой принцип - Вы задействуете лист, и сортировку на листе, что мне лично не подходит, поскольку мои данные обрабатываются полностью в массивах, коллекциях.... К тому же при таком подходе попробуйте расширить диапазон до нескольких столбцов - возникнут проблемы. А если на листе будут данные или автофильтры? Придется это дело обходить
В моем случае можно использовать сколько угодно столбцов(заменить a1:a100000 на например a1:b100000 или selection для выделенного диаппазона) - добавление в словарь будет происходить по всему диапазону :D.
В данном коде используются штатное сравнение <=> .SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 10:27
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему: определить набор данных - удалить дубликаты - сделать ключ сортировки - отсортировать - (выгрузить на лист). А непосредственно код - это метод реализации Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти. Не подойдет Вам - другие могут найти нечто полезное. Да и вообще, это тема Rioran про его сортировку
[offtop]Ну и замечу, что заявлять о неких "по-вашему, проблемах", судя по всему, не проверив использованных методов - по крайней мере, не комильфо. С чего это .RemoveDuplicates стало работать с "одним столбцом"? Причем здесь "другие данные и или фильтры"? etc...[/offtop]
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему: определить набор данных - удалить дубликаты - сделать ключ сортировки - отсортировать - (выгрузить на лист). А непосредственно код - это метод реализации Кроме того, вы нигде не упоминали, что обработка ведется исключительно в памяти. Не подойдет Вам - другие могут найти нечто полезное. Да и вообще, это тема Rioran про его сортировку
[offtop]Ну и замечу, что заявлять о неких "по-вашему, проблемах", судя по всему, не проверив использованных методов - по крайней мере, не комильфо. С чего это .RemoveDuplicates стало работать с "одним столбцом"? Причем здесь "другие данные и или фильтры"? etc...[/offtop]AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Вторник, 21.10.2014, 16:14
SLAVICK, Если важна скорость - эачем 100000 раз On Error Resume Next выполняете? Достаточно один раз в начале кода отключить. Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.
P.S. Да даже если скорость не важна - зачем делать лишнюю работу?
SLAVICK, Если важна скорость - эачем 100000 раз On Error Resume Next выполняете? Достаточно один раз в начале кода отключить. Да и вообще с словарём можно работать без ошибок - или сперва проверить наличие, или просто молча заменить item.
P.S. Да даже если скорость не важна - зачем делать лишнюю работу?Hugo
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца.Попробуйте запустить мой макрос и выбрать несколько столбцов и Вы увидите разницу
Да. Rioran - изначально делал код для сортировки исключительно в памяти (почитайте название темы):D И мое последнее решение, на мой взгляд, наиболее схоже с первоначальным файлом - просто оптимизировано. Впрочем это решать ни мне ни Вам, а автору. Он задал мне вопрос - я на него ответил .У меня единственное отступление от темы - это то, что сортировка не "пузырьковая"...
SLAVICK, как ни странно, но мой алгоритм полностью соответствует вашему
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца.Попробуйте запустить мой макрос и выбрать несколько столбцов и Вы увидите разницу
Да. Rioran - изначально делал код для сортировки исключительно в памяти (почитайте название темы):D И мое последнее решение, на мой взгляд, наиболее схоже с первоначальным файлом - просто оптимизировано. Впрочем это решать ни мне ни Вам, а автору. Он задал мне вопрос - я на него ответил .У меня единственное отступление от темы - это то, что сортировка не "пузырьковая"...SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 17:02
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца
Как ни странно - да Не путайте алгоритм с реализацией, пожалуйста. И в моей реализации, если рассуждать о ней, один диапазон (шириной в один столбец) используется как коллекция исходных данных, а второй диапазон (на один столбец вправо от исходного - как ключ. Если мне надо будет обрабатывать данные из нескольких исходных "столбцов" - я предварительно считаю их в один отдельный, расположенный в нужном месте - и укажу его в качестве источника данных для алгоритма. Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа" Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей. Я - независимое решение каждой подзадачи, в результате решающие общую И да, я же просил сравнить быстродействие подзадач по отдельности?..
Как ни странно - нет Можете попробовать Мой код может добавлять уникальные позиции не только с одного столбца, а с нескольких - Ваш только с одного - с "а" - попробуйте добавить данные в столбец b и поменять диапазон останутся уникальные только с одного столбца
Как ни странно - да Не путайте алгоритм с реализацией, пожалуйста. И в моей реализации, если рассуждать о ней, один диапазон (шириной в один столбец) используется как коллекция исходных данных, а второй диапазон (на один столбец вправо от исходного - как ключ. Если мне надо будет обрабатывать данные из нескольких исходных "столбцов" - я предварительно считаю их в один отдельный, расположенный в нужном месте - и укажу его в качестве источника данных для алгоритма. Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа" Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей. Я - независимое решение каждой подзадачи, в результате решающие общую И да, я же просил сравнить быстродействие подзадач по отдельности?..AndreTM
Господа, мне крайне импонирует, что из моей невинной темы вышла довольно серьёзная дискуссия. Спасибо всем за оставленные алгоритмы (в том числе ссылки на видео ^.^), очень полезно и есть о чём подумать, куда совершенствоваться.
Если у кого-нибудь из Вас есть ещё идеи на тему сортировок/фильтров - прошу, высказывайтесь. В таких темах самое ценное - делиться опытом =)
Господа, мне крайне импонирует, что из моей невинной темы вышла довольно серьёзная дискуссия. Спасибо всем за оставленные алгоритмы (в том числе ссылки на видео ^.^), очень полезно и есть о чём подумать, куда совершенствоваться.
Если у кого-нибудь из Вас есть ещё идеи на тему сортировок/фильтров - прошу, высказывайтесь. В таких темах самое ценное - делиться опытом =)Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа"
Я не противоречил себе. Просто мой алгоритм сразу создает словарь уникальных по всем столбцам массива данных т.е. все данные сразу забрасываются в массив(память) и потом в памяти обрабатываются, без предварительной обработки данных на листе. Обращение к листу у меня аж 2 раза: для получения исходного массива для вывода итогового массива
Цитата
Алгори́тм — это точный набор инструкций, описывающих порядок действий некоторого исполнителя для достижения результата, решения некоторой задачи за конечное время.
Исходя из цитаты мой алгоритм одинаков для любого количества столбцов: 1.Считать все данные в один уникальный массив 2.Добавить столбец корректировки 3.Отсортировать по столбцу корректировки 4.Вывести итоговый массив в указанное место.
Ваш алгоритм для нескольких столбцов отличается от алгоритма для одного столбца: 1.Получить отдельный столбец со всеми данными(может также состоять из подпунктов) 2.Считать все данные в один уникальный диапазон 3.Добавить столбец корректировки 4.Отсортировать по столбцу корректировки 5.Удалить столбец сортировки
Исходя из личного опыта могу сказать, что работа с функциями листа медленнее, чем эта же работа в коде - при условии правильно подобранного кода
Как подтверждение: A1__1,011719 A2__1,03125 A3__1,039063 A4__1,050781
против S1 __0,5039063 S2 __0,515625 S3 __0,53125 S4 __0,5625
Где 1-4 - шаги. А - Ваш алгоритм S - мой Зеленые - шаги между которыми была сортировка. На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей.
У меня точно так же как у Вас - две задачи решаются отдельно(просто не делал промежуточную выгрузку массива), если хотите - можете выгрузить несортированный массив - для этого добавьте строку вывода массива "arrDicKeys" на лист.
Ну и не надо уж тогда противоречить самому себе - то у вас "работа исключительно в памяти", то у вас "чтение из нескольких столбцов листа"
Я не противоречил себе. Просто мой алгоритм сразу создает словарь уникальных по всем столбцам массива данных т.е. все данные сразу забрасываются в массив(память) и потом в памяти обрабатываются, без предварительной обработки данных на листе. Обращение к листу у меня аж 2 раза: для получения исходного массива для вывода итогового массива
Цитата
Алгори́тм — это точный набор инструкций, описывающих порядок действий некоторого исполнителя для достижения результата, решения некоторой задачи за конечное время.
Исходя из цитаты мой алгоритм одинаков для любого количества столбцов: 1.Считать все данные в один уникальный массив 2.Добавить столбец корректировки 3.Отсортировать по столбцу корректировки 4.Вывести итоговый массив в указанное место.
Ваш алгоритм для нескольких столбцов отличается от алгоритма для одного столбца: 1.Получить отдельный столбец со всеми данными(может также состоять из подпунктов) 2.Считать все данные в один уникальный диапазон 3.Добавить столбец корректировки 4.Отсортировать по столбцу корректировки 5.Удалить столбец сортировки
Исходя из личного опыта могу сказать, что работа с функциями листа медленнее, чем эта же работа в коде - при условии правильно подобранного кода
Как подтверждение: A1__1,011719 A2__1,03125 A3__1,039063 A4__1,050781
против S1 __0,5039063 S2 __0,515625 S3 __0,53125 S4 __0,5625
Где 1-4 - шаги. А - Ваш алгоритм S - мой Зеленые - шаги между которыми была сортировка. На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
Впрочем, что спорим-то? Вы показали решение своей задачи (состоящей из двух поздзадач, результаты одной - входные данные для другой), оптимизированной именно под словарь без дублей.
У меня точно так же как у Вас - две задачи решаются отдельно(просто не делал промежуточную выгрузку массива), если хотите - можете выгрузить несортированный массив - для этого добавьте строку вывода массива "arrDicKeys" на лист. SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 18:45
Какие-то странные замеры... Ладно, сделал сам. Я разбил оба теста на соответствующие операции. У вас - чисто работа в памяти, естественно, основной массив и словарь сделаны глобальными. У меня - чисто работа на листе. Так вот.
Тест S: 22:10:11 0,0625 - чтение данных с листа в массив 0,4140625 - создание словаря 0,015625 - создание массива из словаря + замена ё 0,015625 - сортировка 0,015625 - запись массива на лист
Тест A: 22:07:26 0,1015625 - копирование данных в другое, "рабочее" место, в принципе, необязательное 0,7890625 - удаление дубликатов + сборка данных в один столбец 0,015625 - создание ключа (замена ё) 0,015625 - сортировка 0,03125 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное
Тест A: 22:32:21 0,09375 - копирование данных в другое, "рабочее" место, в принципе, необязательное 0,765625 - удаление дубликатов + сборка данных в один столбец 0,015625 - создание ключа (замена ё) 0,0078125 - сортировка 0,015625 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное
Как мы видим, непосредственно сортировка, - везде наименее затратная операция А удаление дубликатов у меня занимает "настолько больше" времени только из-за тестирования "многостолбцовых данных". Если исходные данные расположить в одном столбце - тайминги сходных операций будут различаться на меньшие величины. Я ещё не проверял - но на больших объемах данных динамический SQL-запрос вполне может показать результаты ещё лучше ваших - он ведь все необходимое может проделать одной операцией
И да, не смешивайте "функции листа" и "методы объектов приложения". У меня в коде нет никаких функций листа.:)
P.S. Упс... Забыл у себя отключить .ScreenUpdating, исправил,старые замеры убрал под спойлер
Какие-то странные замеры... Ладно, сделал сам. Я разбил оба теста на соответствующие операции. У вас - чисто работа в памяти, естественно, основной массив и словарь сделаны глобальными. У меня - чисто работа на листе. Так вот.
Тест S: 22:10:11 0,0625 - чтение данных с листа в массив 0,4140625 - создание словаря 0,015625 - создание массива из словаря + замена ё 0,015625 - сортировка 0,015625 - запись массива на лист
Тест A: 22:07:26 0,1015625 - копирование данных в другое, "рабочее" место, в принципе, необязательное 0,7890625 - удаление дубликатов + сборка данных в один столбец 0,015625 - создание ключа (замена ё) 0,015625 - сортировка 0,03125 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное
Тест A: 22:32:21 0,09375 - копирование данных в другое, "рабочее" место, в принципе, необязательное 0,765625 - удаление дубликатов + сборка данных в один столбец 0,015625 - создание ключа (замена ё) 0,0078125 - сортировка 0,015625 - очистка "лишних" данных на "рабочем" месте, тоже, в принципе, необязательное
Как мы видим, непосредственно сортировка, - везде наименее затратная операция А удаление дубликатов у меня занимает "настолько больше" времени только из-за тестирования "многостолбцовых данных". Если исходные данные расположить в одном столбце - тайминги сходных операций будут различаться на меньшие величины. Я ещё не проверял - но на больших объемах данных динамический SQL-запрос вполне может показать результаты ещё лучше ваших - он ведь все необходимое может проделать одной операцией
И да, не смешивайте "функции листа" и "методы объектов приложения". У меня в коде нет никаких функций листа.:)
P.S. Упс... Забыл у себя отключить .ScreenUpdating, исправил,старые замеры убрал под спойлер AndreTM
Ничего странного. Просто Вы считали время между шагами и обнуляли его, а я делал накопительным итогом. В результате по Вашим замерам - получилось примерно так как и у меня - мой код в 1,5 - 2 раза быстрее
левый столбец - отдельные промежутки(Как Вы считали) - правый как я считал.
В своем примере я делил не на 5 шагов а на 4..., и немного по другому: 1 создание уникального списка и его переброс в одномерный массив 2 создание 2-го массива 3 сортировка массива 4 выгрузка массива на лист
Я же так и написал что сортировка у Вас:
Цитата
На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
(т.е. у меня)
P.S. предлагаю на этом спор закончить, все точки вроде расставлены - дальше каждый пускай выбирает что ему по душе. Мне ближе и понятнее мой код, кому-то Ваш. На то и право выбора
Ничего странного. Просто Вы считали время между шагами и обнуляли его, а я делал накопительным итогом. В результате по Вашим замерам - получилось примерно так как и у меня - мой код в 1,5 - 2 раза быстрее
левый столбец - отдельные промежутки(Как Вы считали) - правый как я считал.
В своем примере я делил не на 5 шагов а на 4..., и немного по другому: 1 создание уникального списка и его переброс в одномерный массив 2 создание 2-го массива 3 сортировка массива 4 выгрузка массива на лист
Я же так и написал что сортировка у Вас:
Цитата
На листе получилось быстрее, но отбор уникальных данных, и добавление доп столбца с заменой - быстрее в вба.
(т.е. у меня)
P.S. предлагаю на этом спор закончить, все точки вроде расставлены - дальше каждый пускай выбирает что ему по душе. Мне ближе и понятнее мой код, кому-то Ваш. На то и право выбора SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 21.10.2014, 23:44
У вас почему-то не все данные попадают в итоговый результат(на вставленных данных) , и странная сортировка В файле 3-й лист - сравнение данных. Отмечу особенность моего алгоритма - он числа сортирует как текст. Это может быть как плюсом, так и минусом. Чтобы сортировал числа как числа нужно в коде изменить 3 строчки
m = a(Round((i + j) \ 2), n) ---> If IsNumeric(m) Then m = a(Round((i + j) \ 2), n) * 1 Else m = a(Round((i + j) \ 2), n) Do While a(i, n) < m ---> Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m Do While a(j, n) > m ---> Do While IIf(IsNumeric(a(j, n)), a(j, n) * 1, a(j, n)) > m
У вас почему-то не все данные попадают в итоговый результат(на вставленных данных) , и странная сортировка В файле 3-й лист - сравнение данных. Отмечу особенность моего алгоритма - он числа сортирует как текст. Это может быть как плюсом, так и минусом. Чтобы сортировал числа как числа нужно в коде изменить 3 строчки
m = a(Round((i + j) \ 2), n) ---> If IsNumeric(m) Then m = a(Round((i + j) \ 2), n) * 1 Else m = a(Round((i + j) \ 2), n) Do While a(i, n) < m ---> Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m Do While a(j, n) > m ---> Do While IIf(IsNumeric(a(j, n)), a(j, n) * 1, a(j, n)) > mSLAVICK
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Данный код не проверял, но мне кажется, что на не числовых данных он быдет выдавать ошибку, т.к. в IIf производится оба вычисления, независимо от условий, а уже подставляется результат в зависимости от условия. по крайне мере выдается ошибка на строчке: [vba]
Код
a=iif(true,1,"a"*1)
[/vba] т.к. с текстом нельзя производить математические вычисления, и вместо a(i, n) * 1 лучше записать val(a(i, n)), но тоже есть определенные ограничения
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Данный код не проверял, но мне кажется, что на не числовых данных он быдет выдавать ошибку, т.к. в IIf производится оба вычисления, независимо от условий, а уже подставляется результат в зависимости от условия. по крайне мере выдается ошибка на строчке: [vba]
Код
a=iif(true,1,"a"*1)
[/vba] т.к. с текстом нельзя производить математические вычисления, и вместо a(i, n) * 1 лучше записать val(a(i, n)), но тоже есть определенные ограниченияMCH
Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?
Вы правы на 100%. Код сортировки писал не я - я его взял готовый из ссылки которую раньше выкладывал. Проверил - можно и без округления.
По поводу
Цитата
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Вы тоже правы - я проверял только на случайных числах
Просмотрел код. Проблема была в в "mas1" там столбец сортировки состоял только из текстовых значений - поскольку S string. Там можно сделать все намного проще: [vba]
Код
mas1(i, 2) = s 'нужно заменить на If IsNumeric(s) Then mas1(i, 2) = s * 1 Else mas1(i, 2) = s
[/vba] Спасибо за наблюдательность В приложении поправленный файл.
Интересно есть ли еще быстрее способ сортировать массивы чем "aQSort"? Из того что я проверял - самый быстрый. Но почему тогда сортировка на листе происходит быстрее? Может кто знает
Зачем здесь Round? пременные i и j целые, деление на 2 тоже целочисленное, зачем округлять результат?
Вы правы на 100%. Код сортировки писал не я - я его взял готовый из ссылки которую раньше выкладывал. Проверил - можно и без округления.
По поводу
Цитата
Do While IIf(IsNumeric(a(i, n)), a(i, n) * 1, a(i, n)) < m
Вы тоже правы - я проверял только на случайных числах
Просмотрел код. Проблема была в в "mas1" там столбец сортировки состоял только из текстовых значений - поскольку S string. Там можно сделать все намного проще: [vba]
Код
mas1(i, 2) = s 'нужно заменить на If IsNumeric(s) Then mas1(i, 2) = s * 1 Else mas1(i, 2) = s
[/vba] Спасибо за наблюдательность В приложении поправленный файл.
Интересно есть ли еще быстрее способ сортировать массивы чем "aQSort"? Из того что я проверял - самый быстрый. Но почему тогда сортировка на листе происходит быстрее? Может кто знает SLAVICK