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

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

Запись от bedvit размещена 26.08.2019 в 16:35
Показов 3550 Комментарии 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
Просмотров: 530
Размер:	88.5 Кб
ID:	5524  
Метки com, vba
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru