Страницы: Пред. 1 2 3 4 5 6 7 8
RSS
Сортировка в двумерном массиве VBA Excel, Написал тут небольшую процедурку, может кому будет полезна
 
bedvit, у меня была основная головная боль - это не забыть что и когда поместил в стек (push/pop - поместить/извлечь). Т.к. в стек также попадают адреса откуда вызывается процедура, то может случиться ОЙ и все накроется медным тазом. Как таковых переменных там нет, их роль выполняют регистры и ячейки памяти. Все привычные типы данных в виде чисел с плавающей точкой и текстовых строк, а также и все варианты целых чисел представляют из себя просто набор байтов, и что и где начинается/заканчивается - загадка. Во всяком случае так было 20 лет назад и на той платформе, для которой писал утилиты. ДАже не было умножения и деления, не говоря о всяких корнях/степенях и пр. - все делалось в циклах по условному переходу по метке. В общем та еще песня, но зато работало (если работало) все очень быстро.
 
Anchoret, познавательно! но для меня это слишком низкоуровнево, слишком круто! :)

BedvitDLL v1.0.1.2 - теперь в ArraySortV три ключа сортировки. Тестируйте.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, посмотрел мануал) как по мне, одного ключа всегда достаточно, т.к. всегда можно нужные поля сцепить в "поле сортировки" в массиве кода (влияет на скорость) или на листе (практически не влияет на скорость, только длина ключа), но, если это не замедляет основную процедуру, то, конечно, лишним не будет
Респектую  :idea:
Изменено: Jack Famous - 28.08.2019 22:26:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
На скорость влияет количество ключей, если один или по умолчанию без ключей (первый столбец) это макс. скорость. Она осталась такая же как и в предыдущем варианте с одним ключом.
Изменено: bedvit - 29.08.2019 00:27:25
«Бритва Оккама» или «Принцип Калашникова»?
 
BedvitDLL v1.0.1.3 - теперь в ArraySortV три ключа сортировки и для каждого отдельный порядок сортировки. Тестируйте.
Цитата
Jack Famous написал:
как по мне, одного ключа всегда достаточно, т.к. всегда можно нужные поля сцепить в "поле сортировки"
Если нужна сортировка в разных направлениях это не поможет.
Изменено: bedvit - 29.08.2019 11:37:21
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: нужна сортировка в разных направлениях
просто ни разу не сталкивался с такой необходимостью)) лишним не будет)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Так же для возможности сортировать строки или столбы - сделал новый функционал в библиотеке:
Transpose- быстрое транспонирование двухмерного массива (на месте).

Код
Sub Test_Transpose()
'Dim a As BedvitCOM.VBA: Set a = New BedvitCOM.VBA 'ранее связывание
Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA") 'позднее связывание
Dim testSize As Long: testSize = 2000000

Dim ArrV2: ReDim ArrV2(-5 To testSize, -2 To 3)

For i = 0 To testSize
    ArrV2(i, 0) = Format$(Int(Rnd * 1000), "0000")
    ArrV2(i, 1) = Format$(Int(Rnd * 1000), "0000")
    ArrV2(i, 2) = Format$(Int(Rnd * 1000), "0000")
Next

'стандартный
arrTmpV = ArrV2
t = Timer
arrTmpV = Application.Transpose(ArrV2)
Debug.Print "Application.Transpose: " & Timer - t & " сек."

'библиотека
arrTmpV = ArrV2
t = Timer
bVBA.Transpose arrTmpV
Debug.Print "bVBA.Transpose: " & Timer - t & " сек."

'библиотека - лист
arrTmpV = [a1:j20]
t = Timer
bVBA.Transpose arrTmpV
Debug.Print "bVBA.Transpose - Лист" & Timer - t & " сек."
[m1:af10] = arrTmpV

End Sub


Результат
Application.Transpose: 3,207031 сек.
bVBA.Transpose: 0,140625 сек.

+
Application.Transpose не выводит более 34 тыс столбцов.
Изменено: bedvit - 30.08.2019 12:13:22
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Application.Transpose не выводит более 34 тыс столбцов
у неё гораздо более серьёзные ограничения имеются. Не сравнивали с VBA-версией?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Test VBA-версией.
Скрытый текст

Результаты:
bVBA.Transpose : 0,1445313 sec.
TransposeArray : 4,554688 sec.

т.е. вариант на VBA в 33 раза медленнее .
Изменено: bedvit - 30.08.2019 12:24:41
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Test VBA-версией
а если подшаманить функцию и передавать более корректно?))
Стенд
у меня 1,5 сек отрабатывает (библиотеку не подключал)
плюс не понял, откуда у вас нулевые и отрицательные границы в двумерном массиве…С листа такой не получить
Изменено: Jack Famous - 30.08.2019 13:16:31
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Тест:
Скрытый текст
Итоги:
ArrayCreate : 8,753906 sec.
TransposeArray : 1,527344 sec.
bVBA.Transpose: 0,0703125 sec.

Уже лучше, всего в 22 раза отстаёт.

Цитата
Jack Famous написал:
ткуда у вас нулевые и отрицательные границы в двумерном массиве…
Это тест на правильное определение и транспонирование отрицательных значений в индексах границ массива. Они могут быть и отрицательными.
Изменено: bedvit - 30.08.2019 15:23:57
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Уже лучше, всего в 22 раза отстаёт
ну вот — совсем другое дело  :D
Цитата
bedvit: Они могут быть и отрицательными
ну у меня не могут, т.к. все двумерные массивы связаны с листом (взяты с него или готовятся для выгрузки на него), а так я понял.
Полезная процедурка, однако, получилась  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: Пред. 1 2 3 4 5 6 7 8
Наверх