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

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

Запись от bedvit размещена 26.08.2019 в 16:35
Показов 3987 Комментарии 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
Просмотров: 587
Размер:	88.5 Кб
ID:	5524  
Метки com, vba
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru