Форум программистов, компьютерный форум, киберфорум
bedvit
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Библиотека COM (OLE Automation). Часть 2 - ArraySort (Variant)

Запись от bedvit размещена 26.08.2019 в 16:35
Показов 3952 Комментарии 0
Метки com, vba

Часть библиотеки BedvitCOM
...и продолжение темы Библиотека COM (OLE Automation). Часть 1 - ArraySort (String)

В классе "VBA" добавил новый метод "ArraySortV" - сортировка любого типа данных.
Метод "ArraySort" переименован в "ArraySortS".
Функционал: "ArraySortS" - сортировка данных (String) в одномерном/двухмерном массиве.
"ArraySortV" - сортировка данных (Variant) в одномерном/двухмерном массиве.
Использованы параллельные алгоритмы сортировки. (библиотеки PPL от Мicrosoft)

Интерфейс метода:
C++
1
    [id(7), helpstring("Array sort (Variant)")] HRESULT ArraySortV([in, out] VARIANT* array_in_out, [in, defaultvalue(0)] LONG key_1, [in, defaultvalue(0)] VARIANT_BOOL sort_order1, [in, defaultvalue(0)] LONG key_2, [in, defaultvalue(0)] VARIANT_BOOL sort_order2, [in, defaultvalue(0)] LONG key_3, [in, defaultvalue(0)] VARIANT_BOOL sort_order3, [in, defaultvalue(L"")] BSTR key_and_sort_order_next);
Параметры метода:
1.array_in_out - указатель на массив (ввод/вывод)
2.key_1 - ключи сортировки (порядковый номер столбца, начиная с 1), по умолчанию - первый столбец.
3.sort_order1 - порядок сортировки для key_1 : 0-по возрастанию (по умолчанию для всех), 1-по убыванию
4.key_2 - по умолчанию - не участвует
5.sort_order2 - порядок сортировки для key_2
6.key_3 - по умолчанию - не участвует
7.sort_order3 - порядок сортировки для key_3
Ключи задаются по порядку, т.е. сразу указать 3й - нельзя.
Начиная с версии 1.0.5.3
8.key_and_sort_order_next - дает возможность отсортировать любое количество полей с индивидуальным порядком сортировки для каждого. Задается текстовой строкой, в том же формате, как и первые 3 параметра ("номер столбца, порядок сортировки" - пример: "4, 0, 5, 0, ..."). Тестовый пример см. ниже.


Примеры использования на VBA и сравнение с предыдущем методом:
Visual Basic
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
Sub Test_arr_sort()
'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 i, t, arrTmpV
 
Dim ArrS: ReDim ArrS(0 To testSize) As String
Dim ArrV1: ReDim ArrV1(0 To testSize)
Dim ArrV2: ReDim ArrV2(0 To testSize, 0 To 3)
 
For i = 0 To testSize
    ArrS(i) = Format$(Int(Rnd * 1000), "0000")
    ArrV1(i) = Format$(Int(Rnd * 1000), "0000")
    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
 
'0й способ по 1х массиву STRING
t = Timer
bVBA.ArraySortS ArrS
Debug.Print "Простая сорт. STRING 1х массива, по возрастанию (по умолч.): " & Timer - t & " сек."
 
'1й способ по 1х массиву VARIANT
t = Timer
bVBA.ArraySortV ArrV1
Debug.Print "Простая сорт. VARIANT 1х массива, по возрастанию (по умолч.): " & Timer - t & " сек."
 
'2й способ по 2х массиву VARIANT
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV
Debug.Print "Простая сорт. VARIANT 2х массива, по возрастанию (по умолч.): " & Timer - t & " сек."
 
'3й способ по 2х массиву VARIANT, по двум полям
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV, 1, 1, 2, 0
Debug.Print "Простая сорт. VARIANT 2х массива, по убыванию по первому ключу и по возрастанию по второму: " & Timer - t & " сек."
 
'4й способ по 2х массиву VARIANT, по двум полям
arrTmpV = ArrV2
t = Timer
bVBA.ArraySortV arrTmpV, 1, 0, 2, 0, 3, 0
Debug.Print "Простая сорт. VARIANT 2х массива, по возрастанию по трём ключам: " & Timer - t & " сек."
 
'5й способ - данные с листа
arrTmpV = [a1:c200]
t = Timer
bVBA.ArraySortV arrTmpV, 1, 1, 3, 1
Debug.Print "Простая сорт. VARIANT 2х массива, по убыванию, по первому столбцу и третьему: " & Timer - t & " сек."
[d1:f200] = arrTmpV
 
End Sub
Результаты на 2 млн. строк (тестовый стенд: ЦП-QuadCore Intel Core i7-3770, ОЗУ-16ГБ (DDR3-1600 DDR3 SDRAM), WIN7x64, MS Office2016x64):
Простая сорт. STRING 1х массива, по возрастанию (по умолч.): 0,2109375 сек.
Простая сорт. VARIANT 1х массива, по возрастанию (по умолч.): 0,2539063 сек.
Простая сорт. VARIANT 2х массива, по возрастанию (по умолч.): 0,4960938 сек.
Простая сорт. VARIANT 2х массива, по убыванию по первому ключу и по возрастанию по второму: 0,9101563 сек.
Простая сорт. VARIANT 2х массива, по возрастанию по трём ключам: 1,0625 сек.

Видно, что VARIANT незначительно отстает от STRING.

Update: 11/12/2021 - v1.0.5.3
Начиная с версии 1.0.5.3 сортировка по любому количеству полей с индивидуальным порядком сортировки для каждого.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Test_arr_sort_10_key()
'Dim a As BedvitCOM.VBA: Set a = New BedvitCOM.VBA 'ранее связывание
Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA") 'позднее связывание
Dim i, j, t, testSize As Long: testSize = 1000000
 
Dim ArrV: ReDim ArrV(0 To testSize, 0 To 9)
 
For i = 0 To testSize
    For j = 0 To 9
    ArrV(i, j) = CLng(Rnd * 2)
    Next
Next
 
t = Timer
bVBA.ArraySortV ArrV, 1, 0, 2, 0, 3, 0, "4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0"
Debug.Print "Cортировка VARIANT 2х массива, по возрастанию по 10 ключам: " & Timer - t & " сек."
[a1:j1000000] = ArrV
 
End Sub

Последние версии библиотек.
Миниатюры
Нажмите на изображение для увеличения
Название: BedvitCOM_VBA2.PNG
Просмотров: 581
Размер:	88.5 Кб
ID:	5524  
Метки com, vba
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru