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

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

Запись от bedvit размещена 26.08.2019 в 16:35. Обновил(-а) bedvit 14.10.2022 в 21:01 (v.1.0.5.3)
Показов 3109 Комментарии 0

Часть библиотеки 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
Просмотров: 444
Размер:	88.5 Кб
ID:	5524  
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Как отменить слияние (merge) в Git
bytestream 23.01.2025
В процессе разработки программного обеспечения часто возникают ситуации, когда необходимо отменить слияние веток в системе контроля версий https:/ / www. cyberforum. ru/ git/ "]Git. Эта операция может. . .
Как узнать какой процесс блокирует файл или каталог в Windows
bt_guru 23.01.2025
При работе с операционной системой Windows пользователи нередко сталкиваются с ситуацией, когда система отказывается выполнять определенные действия с файлами или каталогами, сообщая, что они. . .
Как в curl узнать код статуса HTTP запроса. Коды состояния HTTP
bt_guru 23.01.2025
Коды состояния HTTP играют значимую роль в обеспечении эффективного взаимодействия между клиентами и серверами. При работе с веб-сервисами важно не только отправлять запросы, но и правильно. . .
Как сортировать вывод команды ls в Linux
bt_guru 23.01.2025
В операционной системе Linux команда ls является одним из наиболее часто используемых инструментов для просмотра содержимого директорий. При работе с файловой системой пользователи регулярно. . .
Как сделать POST запрос с помощью curl
bt_guru 23.01.2025
curl - это мощный инструмент командной строки позволяет отправлять и получать данные через различные протоколы, включая HTTP, HTTPS, FTP и множество других. Особенно полезным curl становится при. . .
Прокрутка в tmux с помощью мыши и клавиатуры
bt_guru 23.01.2025
Tmux представляет собой мощный терминальный мультиплексор, который позволяет пользователям создавать и управлять несколькими терминальными сессиями внутри одного окна. Одной из важнейших функций tmux. . .
Как проверить, содержит ли массив значение в JavaScript. Поиск в массиве
bytestream 23.01.2025
Эффективный поиск значений в массивах становится критически важным навыком для разработчиков, использующих JavaScript. Процесс поиска элементов в массиве может показаться простым на первый взгляд,. . .
Как удалить тег Git в удалённом репозитории (remote)
bytestream 23.01.2025
Одним из важнейших механизмов организации версий в Git являются теги, которые позволяют помечать определенные точки в истории проекта как значимые. Теги часто используются для маркировки релизов,. . .
Чем отличаются URL, URI и URN
bytestream 23.01.2025
Системы идентификации представляют собой фундаментальный механизм, позволяющий однозначно определять местоположение и характеристики различных информационных объектов в глобальной сети. Эти системы. . .
Как центрировать div внутри другого div с помощью CSS. Управление расположением элементов в CSS
bytestream 23.01.2025
Позиционирование элементов играет ключевую роль в создании качественных и профессиональных интерфейсов. Одной из наиболее часто встречающихся задач является центрирование элементов на веб-странице,. . .
Что означают различные символы в синтаксисе PHP
bytestream 23.01.2025
PHP (Hypertext Preprocessor) представляет собой один из наиболее широко используемых языков программирования для веб-разработки, который обладает богатой и интересной историей развития. Изначально. . .
Способы клонирования объектов в JavaScript
bytestream 23.01.2025
В современной разработке на JavaScript работа с объектами является фундаментальной частью создания любого приложения. При манипуляции объектами часто возникает необходимость создавать их копии для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru