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

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

Запись от bedvit размещена 26.08.2019 в 16:35
Обновил(-а) bedvit 28.10.2019 в 16:48

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

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

Интерфейс метода:
C++
1
    [id(6), 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);
Параметры метода:
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й - нельзя.

Примеры использования на 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
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 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.

Последние версии библиотек.
Миниатюры
Нажмите на изображение для увеличения
Название: BedvitCOM_VBA2.PNG
Просмотров: 241
Размер:	88.5 Кб
ID:	5524  
Размещено в Без категории
Показов 667 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.