Мое почтение, джентльмены.
«Бритва Оккама» или «Принцип Калашникова»?
17.07.2025 09:58:22
Всем привет.
Сейчас для массивов кроме уже существующих инструментов: +Сортировки +Фильтрации +Транспонирования +Преобразования регистра +Изменения размерности (добавление не только столбцов но и строк) +Сериализации +Шифрования +Преобразования в формат для выгрузки на лист Excel (числа как строки и т.д) Появились и новые: ++Удаление нужных столбцов или строк из массива ++Объединение двух массивов (количество столбцов может быть разное) ++Сравнение двух массивов (по размерности, количеству элементов в размерности, типу, значениям) ++UnPivot массива ++Объединение всех элементов через нужный разделитель в строку +++Есть возможность добавить в СОМ свой конструктор форм на win api с контролами и функционалом, которого нет в VBA, Здесь работы много, будет реализация если соберется необходимый минимум из спецов. Этот инструментарий я использую и готов поделится. Нужно лишь время для портирования в СОМ. Что из нового будет интересно и что стоит забросить в СОМ?
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
14.05.2025 22:43:20
Мое почтение, джентльмены.
Есть интерес послушать специалистов, почему Like в варианте 3 выдает True, а в последнем варианте ошибку?
Настолько впечатлен этим инструментом, что разместил вопрос и
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
17.04.2024 15:52:30
Моё почтение, джентльмены!
Инструмент для вставки данных на лист Excel без преобразования. т.е. "1" так и вставится как текст, а не как число. Не нужен апостроф, не нужен формат ячейки. Нужна надстройка Так же быстро заполняет диапазон одним значением. Использована функция Функция/Метод XLLcmdE12xlSet(XCHAR * param, LPXLOPER12 param2, LPXLOPER12 pxReference, LPXLOPER12 pxValue) param - командная строка XLL API - см. "XLL API": 1й параметр - Режим диалога для комманд меню XLL - см. "Диалог" param2 – зарезервирован pxReference - Прямоугольная ссылка (адрес), описывающая целевую ячейку или ячейки. Адрес должен описывать смежные ячейки. pxValue - Значение или значения, помещаемые в ячейку или ячейки. Аргумент pxValue pxValue может быть значением или массивом. Если это значение, этим значением заполняется весь диапазон назначения. Если это массив, элементы массива помещаются в соответствующие расположения в прямоугольнике. Если для четвертого аргумента используется горизонтальный массив, он дублируется вниз, чтобы заполнить весь прямоугольник. Если используется вертикальный массив, он дублируется вправо для заполнения всего прямоугольника. Если вы используете прямоугольный массив, и он слишком мал для прямоугольного диапазона, в который вы хотите его поместить, этот диапазон заполняется исходными данными размером с массив, а остальной диапазон заполняется #Н/Д. Если целевой диапазон меньше исходного массива, значения копируются до пределов целевого диапазона, а лишние данные из массива игнорируются. Чтобы очистить элемент прямоугольника назначения, используйте элемент массива типа Empty в исходном массиве. Чтобы очистить весь прямоугольник назначения, опустите четвертый аргумент. Ограничения Невозможно отменить xlSet . Кроме того, он удаляет все сведения об отмене, которые могли быть доступны ранее. XlSet может помещать в ячейки только константы, а не формулы. Максимальная длина помещаемой строки 8190 символов. Возвращает код ошибки: 0 - команда выполнена успешно и Error 2036, #NUM!, #ЧИСЛО! - если ошибка. Пример использования:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
11.01.2024 09:23:05
Мое почтение, джентльмены!
В продолжении темы Сделал инструменты шифрования алгоритмами AES данных на листе Excel и в коде VBA. Виды алгоритмов шифрования можно выбирать. В тесте работает алгоритм AES256:CBC. Функционал: 1. Можно шифровать как отдельные значения так и диапазоны/массивы. 2. Шифровать данные можно прям на листе Excel, с дальнейшей расшифровкой нужного диапазона или всего листа. 3. Зашифрованные данные можно хранить в XLL как в виде значений (value2), так и в виде формул (formula) 4. Алгоритм шифрования AES256:CBC. Использована библиотека 5. Пароль нигде не хранится, его знает только пользователь и при утере, расшифровать данные не получится никому ![]() 6. Зашифрованные диапазоны - независимые, т.е. можно каждый отдельный диапазон зашифровать со своим паролем, можно зашифровать диапазон дважды (для гиков ![]() 7. Для данных у которых упаковка будет экономить размер итоговой зашифрованной строки (для массивов и длинных строк) - используется алгоритм сжатия 8. Реализован механизм ( 9. Данные на листе Excel шифруются для каждой ячейки отдельно (для возможности хранить и расшифровывать данные независимо для каждой ячейки) с применением п,7. Для VBA (одно значение или массив) зашифровываются в один массив байт, что позволяет применять и п.7 и п.8 10. Итоговый результат шифрования (любого типа данных: строки, числа, ошибки и т.д.) - хранится в виде строки (массива зашифрованных байт). Шифрование на листе Excel и хранение данный в XLL: Шифрование данных VBA: Функции: 1. VARIANT stringProtect = VariantAES256Encrypt(VARIANT variantIn, BSTR password, BSTR salt, LONG mode) 2. VARIANT variantUnProtect = VariantAES256Decrypt(VARIANT byteArrayIn, BSTR password, BSTR salt, LONG mode) Можем обсудить, кому интересно, подробности и, возможно, внести новый функционал, если он нужен и не реализован. Надстройка:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
19.12.2023 12:47:07
Мое почтение, джентльмены!
Cериализация и десериализация типа данных Поддерживаются базовые типы и массивы. Объекты не сериализуются. В некоторой степени - аналог Использование простое, как обычная функция (предварительно подключив или открыв надстройку по ссылке чуть ниже и COM в автоматическом/ручном режиме):
Особенности: 1. Cериализация в байтовый массив 2. Размер массива не может превышать 2^32 элементов (около 4Гбайт). Это ограничение самого COM - массива. В С++ (в другом контейнере) сохранял файлы боле 4,5 Гб. 3. Реализован похожий механизм ( Надстройка
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
08.06.2023 08:13:56
Мое почтение, джентльмены!
т.к. в С/С++ нет Like, решил сделать свою реализацию. Аналог 100% (только бинарный режим) Она оказалось немногим быстрее штатной, делюсь. Прошу пользоваться, тестировать, добавлять свои шаблоны, и дать обратную связь по скорости и ошибкам, если таковые будут. Speed test... Pattern...'XYXZZXYXYXZZXY' Like '*X*X?*X*X?' Like 2,015625 bVBA.Like: 1,617188 Pattern...'XYXZZXYXYXZZXY123-#*[[]?!!19Aa--/!\#*[[]?!!19Aa--' Like '*X*X?*X*X?***###*[[]][?][!]!1[?1-5-9][!B-Z][A-Za-z][a-][-a]' Like 8,699219 bVBA.Like: 5,273438 Шаблон, на котором проводилось тестирование:
Обсуждение на
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
28.04.2023 13:17:23
Быстрая замена штатному Split
Split ( [in] BSTR stringIn, - входящая строка [in] BSTR delimiter, - разделитель (может быть несколько символов) [in, defaultvalue(0)] LONG setLowerBound, - нижняя граница массива (по умолчанию=0) [in, defaultvalue(0)] VARIANT_BOOL multiThreadingON, - режим многопоточности (по умолчанию отключен) [out, retval] VARIANT* arrayOut) - результат: массив Variant/BSTR ) Стенд:
Тайминги, секунд на 1 млн символов, 500 тыс. элементов в массиве: Split: 1,035156 bCOM.Split: 0,0625 bCOM.SplitMultithreading: 0,03125 Библиотека:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
16.01.2023 12:06:05
Моё почтение, джентльмены!
Начиная с BedvitCOM v3.4 и BedvitXLL v.4.5 Функция HashStringSHA(StringIn, VersionSHA) больше не поддерживается. Вносится новый функционал на основе кодирования строки в Юникод UTF-8
1. SHAstrUTF8(stringIn, versionSHA, charLower, stringOut) - Алгоритмы шифрования SHA. Параметры функции: 1.stringIn - входящая строка 2.versionSHA - версия алгоритма SHA 3.charLower - регистр символов Поддержка следующих алгоритмов (+ новейшие SHA3) : versionSHA = 1 , SHA1 versionSHA = 2224, SHA2_224bit versionSHA = 2256, SHA2_256bit versionSHA = 2384, SHA2_384bit versionSHA = 2512, SHA2_512bit versionSHA = 3224, SHA3_224bit versionSHA = 3256, SHA3_256bit versionSHA = 3384, SHA3_384bit versionSHA = 3512, SHA3_512bit 2. MDstrUTF8(stringIn, versionMD, charLower, stringOut) - Алгоритмы шифрования MD. Параметры функции: 1.stringIn - входящая строка 2.versionMD- версия алгоритма SHA 3.charLower - регистр символов Поддержка следующих алгоритмов : versionMD= 5, MD= 5 3. AES128strUTF8(stringIn, key, decrypt, mode, initializationVectorIV, str_format_hex, stringOut) - методы применения блочного шифра (алгоритма), позволяющий преобразовать последовательность блоков открытых данных в последовательность блоков зашифрованных данных. Параметры функции: 1.stringIn - входящая строка 2.key- ключ (размер 16, 32 byte) 3.decrypt- Рашифровка:encrypti=0, по умолчанию. Расшифровка:decrypt=1 4.mode- режимы работы -это методы работы блочного шифра. Вводится как числом, так и кодом (как удобнее), см.ниже 5.initializationVectorIV - вектор инициализации (для всех режимов, кроме ECB, см. ниже) 6.str_format_hex - формат вывода/ввода зашифрованной строки. По умолчанию Base64 = 0, Hex = 1 Поддержка следующих режимов работы mode: 0 - "ECB" 1 - "CBC" 2 - "OFB" 3 - "CFB" 4 - "CBC-CTS" 5 - "CTR" использована подробное описание mode: 1. 2. 3. Код:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
20.12.2022 16:36:38
Моё почтение, джентльмены!
Продолжение темы Новый функционал отличается бОльшей универсальность, возможностью изменять как начало так и конец размерностей (поддерживается одномерные и двумерные массивы) Информация сохраняется, если не обрезается принудительно. Для созданный блоков массива задаются значения Empty. Можно обрезать/добавлять элементы, как в начало, так и в конец любой размерности массива. ArrayReDim(VARIANT* arrayInOut, LONG lLboundRow, LONG rowStartChange, LONG rowEndChange, LONG lLboundCol, LONG colStartChange, LONG colEndChange) 1.arrayInOut - массив (Variant) 2.lLboundRow - новая нижняя граница для строк 3.rowStartChange - изменения для начала измерения строк ("-"обрезаем, "+"добавляем новые строки) 4.rowEndChange - изменения для конца измерения строк ("-"обрезаем, "+"добавляем новые строки) 5.lLboundCol - новая нижняя граница для столбцов 6.colStartChange - изменения для начала измерения столбцов ("-"обрезаем, "+"добавляем новые столбцы) 7.colEndChange - изменения для конца измерения столбцов ("-"обрезаем, "+"добавляем новые столбцы)
Прошу тестировать и дать обратную связь, если инструмент годный.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
21.10.2022 22:26:11
Моё почтение, джентльмены!
1)Новый инструмент: ReDim Preserve для 2х измерений (с возможностью изменять все два измерения и все две нижние границы). Порядок данных сохраняется в рамках измерения (т.к. как у стандартной ReDim Preserve). Данные тоже сохраняются. Beta-версия на тестирование. HRESULT ReDimPreserve2D([in, out] VARIANT* array_in_out, LONG lLbound0, LONG cElements0, LONG lLbound1, LONG cElements1); array_in_out-массив lLbound0 - нижняя граница для выбранного измерения cElements0 - размер для выбранного измерения lLbound1 - нижняя граница для следующего измерения cElements1 - размер для следующего измерения
2)Новый инструмент: преобразование размерности и нижних границ без изменения и порядка данных (в рамках всего массива) [id(26), helpstring("ArrayDtoD")] HRESULT ArrayDtoD([in, out] VARIANT* array_in_out, [in, defaultvalue(0)]LONG lLbound0, [in, defaultvalue(0)]LONG cElements0, [in, defaultvalue(0)]LONG lLbound1, [in, defaultvalue(0)]LONG cElements1, ...); array_in_out-массив, обязательно, остальное по умолчанию, если все=0, значит в одномерный массив с ниж.границей=0 lLbound0 - нижняя граница для выбранного измерения cElements0 - размер для выбранного измерения lLbound1 - нижняя граница для следующего измерения cElements1 - размер для следующего измерения ...до 10 измерений. Быстрее чем ReDimPreserve2D, т.к. не нужно перераспределять данные в памяти, только изменение размерностей и границ (данные сохраняются в первоначальном порядке)
Код открыт (С/С++), выкладываю ниже, на случай, если у кого-то будут идеи по оптимизации
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||||||
|
18.10.2022 14:08:09
Пока не знаю, будет ли отдельный проект по автоматизации для Python, но те, кто пользуется BedvitCOM.dll, могут использовать её в своем проекте и на Python (в т.ч. и для Excel, используя xlrd, xlwt, xlutils или openpyxl и т.д.)
Регистрируем, пользуемся.
Все строковые функции работают, работает длинная арифметика. Будет ли работать функционал меняющий данные на месте, массивы (сортировка, фильтр) - непонятно, нужно тестировать. Сейчас хочу попробовать подключить фильтр, протестировать, к примеру на задаче на фильтрацию по 2000 условиям. Пока вся сложность в массивах.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
17.10.2022 20:23:59
В общем-то ничего сложного: добавляем в ресурсы листа Excel (там же и код) и вызываем по мере необходимости.
Сделал простой пример, весь функционал в одном листе (код и ресурсы - упакованные библиотеки) Вообще, способов есть несколько. Был и второй, через класс - класс в деструкторе сам отключает библиотеку при завершении программы, но нужно переносить модуль класса, а в первом варианте только код листа "ByteSheet" Автоматическое подключение BedvitCOM.dll, без использования BedvitXLL (если будет интересно могу сделать пример/тему и для BedvitXLL). т.е. незаметно для пользователя, без лишних меню и без прав администратора (все под пользователем, и BedvitXLL, кстати так же работает и распаковывает BedvitCOM) Антивирусы не любят такую упаковку в VBA, да и вообще VBA Проверяю здесь по мере появления вопросов буду пояснять, что не понятно, если будет интересна данная тема. К обсуждению. Как испрльзовать: 1. Загрузить, удалить (обновить) библиотеки BedvitCOM32, BedvitCOM64 можно с помощью команды Start_Menu на листе ByteSheet. Этот лист нужен для хранения этих библиотек. Это единственное что нужно перенести в ваш проект, лист с кодом, всё. 2. Для раннего связывания нужно запускать интциализацию библиотеки в отдельной процедуре (см. код в кнопке). Для позднего можно все в одной. 3. Любой код можно писать в процедуре test и любых других, включив их в первоначальный код, где происходит инициализация.Это нужно для раннего связывания. Для позднего можно делать инициализацию библиотеки прямо в своем коде. Но прошу помнить, что жто время. Для увеличения быстродействия, библу лучше подключать один раз на весь период расчета. Не в каждой выполняемой фкнкции включать/выключать. Собственно всё просто. bedvit 2022.12.21 - Новый установщик Механизм регистрации BedvitCOM v2 упрощенный (без вызова Regsvr32), позднее связывание (не нужен доступ к объектной модели VBA) BedvitCOM регистрируется, но не удаляется. Проверки на уже зарегистрированную нет (каждый раз регистрируем заново)
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
20.09.2022 22:20:42
Мое почтение, джентльмены!
Новые инструменты для массива. Для массивов любого количества размерностей, типа - VARIANT. VERSION_COM L"BedvitCOM.dll_v2.0.2.0" VERSION_XLL L"BedvitXLL.dll_v3.2.2.0" Преобразование происходит "на месте" (штатным инструментом Для всех элементов массива, для которых возможны преобразования: 1.ArrayCharLowerV - преобразовать все символы строки в нижний регистр 2.ArrayCharUpperV - преобразовать все символы строки в ВЕРХНИЙ регистр 3.ArrayNumToCharV - преобразовать все данные в тип: String 4.ArrayCharToNumV - преобразовать все данные в тип: Double Пример:
Скачать можно
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
12.09.2022 16:22:28
Вывод списка фраз (273 000 строк), где не встречаются стоп-слова (список 2000 слов) = 11,5 секунд. Выводится примерно 271000 строк. Файл не могу приложить, написал генератор фраз и слов. Выкладываю код - тест.
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
25.08.2022 09:33:14
Моё почтение, джентльмены!
Готов инструмент фильтрации массива с любым количеством столбцов, по любым условиям. ArrayFilterV(VARIANT* array_in, VARIANT* array_parameters, VARIANT_BOOL array_out_index, VARIANT* array_out) 1. array_in - массив входящий (одномерный, двухмерный) 2. array_parameters - массив задаваемых параметров (6 параметров для любого столбца, можно для одного и того же, можно для разных). Количество условий не ограничено. Можно создать самому из списка, можно создать двухмерный массив и заполнить, можно забрать сразу с листа Excel. 3. array_out_index - режим вывода: 0- отфильтрованный массив, 1-массив индексов 4. array_out - массив результатов Условия в массиве параметров применяются в том же порядке, что и везде. Приоритет скобки, потом "И" и "ИЛИ" (одинаковый приоритет, выполняются в порядке следования) Параметры массива условий (сделал максимально просто для пользователя): 1-логические операторы (0-ИЛИ, 1-И) 2-скобка открывающая 3-столбец для фильтрации 4-операторы сравнения (//1-меньше, 2-равно, 4-больше, 8-содержит подстроку, 16-резерв(регулярки), 32- игнорировать регистр, 64-резерв(basic), 128-резерв(extended), 256 - LIKE (пока с символом подстановки "*"), 512-НЕ) 5-значение для фильтра 6-скобка закрывающая, Условия можно задавать как простые: 'фильтр по первому столбцу, значение = 9 Array(, , 1, Равно, 9, "") так и более сложные, к примеру выше Array(, "(((", 1, Содержит, "маша", , ИЛИ, , 1, Содержит, "вася", ")", И, , 1, НеРавно, "маша иванова", ")", ИЛИ, "(", 2, НеРавно, "'1", , ИЛИ, , 2, Равно, 1, "))", И, "(", 3, БольшеРавно, 12.5, , И, , 3, МеньшеРавно, 55.8, ")") или в таком виде (как удобнее) Array( _ , "(((", 1, Содержит, "маша", , _ ИЛИ, , 1, Содержит, "вася", ")", _ И, , 1, НеРавно, "маша иванова", ")", _ ИЛИ, "(", 2, НеРавно, "'1", , _ ИЛИ, , 2, Равно, 1, "))", _ И, "(", 3, БольшеРавно, 12.5, , _ И, , 3, МеньшеРавно, 55.8, ")" _ ) ArrayFilterV поиск по 10млн. строк с найденными 5 млн. - 4 сек. В улучшенном варианте (1 этап оптимизации) - 1,76 сек. Оптимизированный вариант: вывод отфильтрованного массива 5 млн строк (изначальный 10 млн) = 0,25 секунд вывод массива индексов 5 млн строк (изначальный 10 млн) = 0,17 секунд Простой пример (с замером скорости на 10 млн строк) и сложный (с выводом условий и результата):
Выложил
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
23.02.2022 21:39:50
Мое почтение, джентльмены...
Делал для себя инструмент позволяющий хранить уже наработанный VBA код и его исполнять из XLL. Но тут случился Омикрон и проснулся сумрачный гений или случился сон разума... скорее второе... Сон прошел, но вот что осталось... Своим VBA-решением можно поделится с коллегами. Они смогут его использовать, но не смогут посмотреть код. Функционал: +Создана форма для загрузки и выполнения загруженного VBA-кода (загружаемый код - с Option Explicit и другими операторами). +Можно запускать прямо с главной панели (выбрав из списка нужный) +Можно задавать пароль на просмотр (по умолчанию это слово "Пароль") +Можно смотреть VBA-код, если знаешь пароль. +Можно выполнять VBA-код, даже если не знаешь пароль. +Код хранится зашифрованный в файле сохранения настроек библиотеки (BedvitXLL.bin). +Пароль не хранится, а хранится его хеш +VBA-код может загрузить любой пользователь и любой пользователь его использовать, при условии включенного доступа к объектной модели проектов VBA. -пока работает только один модуль VBA -выполняется только Sub() без аргументов, или с аргументами по умолчанию в качестве стартовой процедуры. В самом коде нет ограничений. Просто вызов с кнопки, аргументы сейчас не передаются. Но доработать можно при наличии интереса. -нельзя использовать Function(), другими словами UDF. -функционал скромный, обрисовал только концепцию (на большее просто нет времени) -кнопка "сохранить в файл" для сохранения кода в формате С++(доп.функционал для автора, для пользователя не нужная), все настройки сохраняются автоматически при загрузке. или В библиотеки предзагруженный тестовый код с паролем по умолчанию (можно посмотреть - кнопка "показать код") Кому интересно, прошу протестировать. Автору так же интересен момент, есть ли дыры в защите. Пишите, заделаем бреши, если они есть (проект создан чисто из спортивного интереса)
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
10.12.2021 10:43:49
Всем привет!
Файл с количеством форматов более 64 тыс. (заполняются динамически) Получаю сообщение "Слишком много различных форматов ячейки." Удаляю все форматы, сообщение не пропадает. Если файл сохранить и открыть заново, сообщение не выводится. Как сбросить счетчик форматов ячеек, не переоткрывая файл?
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
10.12.2021 00:02:24
Мое почтение, джентльмены!
Дошли руки, доделал инструмент, теперь уже не только окраски всех повторов и поиска дубликатов, но и более подробной статистики по данным в диапазоне (в т.ч. и по типам данных, которые есть в диапазоне), см. скрин. Кнопка "Дубликаты" Работает шустро, библиотеку залил на Если будет годный инструмент, можно сделать реализацию под использование в VBA.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
31.08.2021 10:12:33
Всем привет!
Возможно ли создать формулу-аналог функции DAX: CONCATENATEX() для Excel 2013? т.к. CONCATENATEX() появился только в Excel 2016. Цель: сцепить строки по группам, в которых они находятся.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
06.08.2021 14:01:22
Мое почтение, джентльмены.
Появился следующий функционал, делюсь. Функции: 1.Array2Dto1D() - быстрое преобразования двухмерного массива в одномерный (данные не обрезаются, 2е измерение преобразуются в очередь) (v1.0.5.0 и выше) Параметры метода: 1.array_in_out - массив, который нужно преобразовать 2.lLbound1 - нижняя граница нового массива (по умолчанию=0) 2.Array1Dto2D() - быстрое преобразование одномерного массива в двухмерный (данные не удаляются) (v1.0.5.0 и выше) Параметры метода: 1.array_in_out - массив, который нужно преобразовать 2.lLbound1 - нижняя граница нового массива, 1е измерение (по умолчанию=0) 3.lLbound2 - нижняя граница нового массива, 2е измерение (по умолчанию=0) 4.cElements1 [/B ] - размер, первой размерности - кол-во столбцов (по умолчанию=1). Вторая рассчитывается автоматически (начиная с v2.0.0.2). Размер для размерности должен задаваться так, что бы общее количество элементов массива было кратно задаваемому размеру Использование:
Результат: Преобразование массива из [B]1 млн строк из двухмерного в одномерный и наоборот 1 млн. раз = 0,1210938 sec. начиная с v2.0.0.2
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||
|
27.05.2021 17:13:37
Мое почтение, джентльмены.
Родилась идея завернуть один из стандартных контейнеров С++ Идея понравилась и реализована (часть методов будет добавлена при необходимости). Особенности: - -это хеш-таблица, а поэтому: поиск, вставка и удаление элементов имеют среднюю постоянную сложность. -стабильно быстрее в разы/порядки Collection и Dictionary Новая реализация позволяет создавать любое количество хеш-таблиц и автоматом удаляет их при завершении работы процедуры/функции Test_Collection_vs_Dictionary_vs_UnorderedMap
Результаты на 1 млн строк, с 1 млн итераций: Внесение данных, Collection.Add = 13,09766 Внесение данных, Dictionary.Add = 73,87109 Внесение данных, U.TryEmplace = 0,9726563 Поиск верных данных, Collection.Item = 4,703125 Поиск верных данных, Dictionary.Item = 72,79688 Поиск данных, U.Find = 0,8007813 Итого элементов в UnorderedMap 1000000 Как использовать? -Так же как и словарь или коллекцию
Если будет интерес - будем развивать проект.
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||||||
|
20.04.2021 12:49:51
Открою новый блок: Функционал C API Excel для VBA.
Напрямую использовать не предусмотрено, поэтому буду делать функции-обертки. Что это дает и зачем это нужно? Дает кратный прирост скорости (в некоторых случаях). Нужно для максимальной производительности кода в Excel, использую не самый быстрый VBA. Минусы: -Определенные ограничения самого C API Excel -Нужна XLL (можно напилить самому или использовать стороннюю с таким функционалом) -Нужно время спеца (который будет этим заниматься) для подготовки функций-оберток Будет интерес и время - посмотрим, что из этого может получится. В качестве тестового примера реализовал функцию поиска на листе нужных данных. Функция: FindValuesXLL Аргументы (см.ниже код): 1.Нужный диапазон - Range ( у меня выделенное - Selection, можно любой Range, в т.ч. и несколько Areas) 2.Искомое значение (может быть и числом и текстом) 3.Параметр сравнения (1 -меньше искомого значения, 2 - равно, 4 - больше, 8 - содержит (для строк)) параметры можно смешивать через OR (к примеру "1 or 2" ). Можно будет добавить еще параметров сравнения, при взаимном интересе к теме. Возвращаемый результат: Range (до 32767 Areas, см. ниже особенности) Особенности: >Сейчас реализован результат - как максимальный стек из 32767 Areas, т.е. будет найдено не более 32767 отдельно стоящих прямоугольников (в прямоугольнике может быть любое количество ячеек). Если будет нужно больше - можно рассмотреть. >Функция автоматически объединяет соседние по вертикали блоки в один (оптимизация по количеству Areas) >Строки сравниваются с учетом регистра. Есть возможность сделать без учета, если будет интерес.
Результат поиска на примере одного из быстрейших Всего ячеек - 170 000 Найдено отдельно стоящих ячеек -127 450 PRDX time total: 2,703 sec FindValuesXLL: 0,020 sec Итого разница боле чем в 100 раз. Прошу тестировать:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|||
|
04.12.2020 13:49:18
Мое почтение, джентльмены.
Хочу понять будет ли профит и какой. Давайте для начала рассмотрим какое либо простое решение на VBA, что бы я переложил в XLL и сравним результаты. Если результат порадует, можно будет переложить в XLL что-то нужное для всех. Будет копилочка быстрых решений для форума (если будет время и интерес).
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|
19.11.2020 19:03:23
Наконец добрался до возможности взаимодействия xll с пользователем посредством графического интерфейса.
И здесь, к сожалению вариантов мало и все они мало где освещены. Информацию по биту доставал. C VBA все отлично, там элементарно делается Ribbon на XML и вперед. в xll на С++ так не сделать. Рассматривал такие варианты: 1. Программное создание меню через Excel C++ API (добавляются команды на вкладку "ADD-IN") 2. Создание на чистом С++ COМ-интерфейса и использование СОМ-модели Excel для создания панели (программно). Похож на первый вариант, но можно добавлять иконки. 3. Создание Ribbon XML через управляемый код и интегрировать это все в xll (собственно это и есть Ribbon как в VBA, но прослойка из управляемого кода еще тот торт) Начал с первого варианта. Версия Какое окошко вам больше нравится? WIN API, с диалогом перехода на сайт Или Excel API, со справкой (перехода на сайт) Также будет транспонирование массива на месте, пока только вывод тестовых данных сделал. Если есть инфо по теме, буду рад изучить. Что использовал:
Изменено:
«Бритва Оккама» или «Принцип Калашникова»?
|
|
|