Страницы: 1
RSS
Инструменты для работы с массивами COM (VBA) - ReDimPreserve для 2х измерений
 
Моё почтение, джентльмены!
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 - размер для следующего измерения

Код
Sub TestReDimPreserve2D()
    Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA")
    Dim arrV As Variant
    
    arrV = Worksheets("Стоп-слова").Range("A1:F2").Value2
    bVBA.ReDimPreserve2D arrV, 1, 7, 1, 3
   
End Sub


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, т.к. не нужно перераспределять данные в памяти, только изменение размерностей и границ (данные сохраняются в первоначальном порядке)

Код
Sub TestArrayDtoD()
    Dim bVBA As Object: Set bVBA = CreateObject("BedvitCOM.VBA")
    Dim arrV As Variant
    
    arrV = Worksheets("Стоп-слова").Range("A1:F2").Value2
    bVBA.ArrayDtoD arrV 'в одномерный массив с нижней границей по умолчанию = 0
    bVBA.ArrayDtoD arrV, 1 'в одномерный массив с нижней границей = 1
   
End Sub


Beta-версия

Код открыт (С/С++), выкладываю ниже, на случай, если у кого-то будут идеи по оптимизации
Скрытый текст
Изменено: bedvit - 22.10.2022 10:06:48
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Beta-версия
в архиве 3 файла и ещё один архив BedvitXLLv2 со своим набором файлов.
Вот и зачем так делать? К чему двусмысленность? Что брать?
Если у тебя архив "на все случаи жизни" лежит, то почему не сообщить, что нужно из него взять, чтобы протестировать данное решение?…
Изменено: Jack Famous - 24.10.2022 12:33:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Бери из корня архива. Во вложенном архиве еще одна версия, для теста, но она еще в разработке.
«Бритва Оккама» или «Принцип Калашникова»?
 
20/12/2022 BedvitXLL v4.4 beta
ReDimPreserve2D() переименован в  ArrayReDim2D()
Добавлена новая функция ArrayReDim()
Новый функционал отличается бОльшей универсальность, возможностью изменять как начало так и конец размерностей (поддерживается одномерные и двумерные массивы)
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit,
Хотел отсечь половину, но получаю ошибку. Что не так?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
ArrayDtoD не меняет данные. Используй ArrayReDim()
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: ArrayDtoD не меняет данные
не понял
А зачем тогда cElements? Опиши инструмент подробнее, пожалуйста…
А так работает быстро - для изменения нижней границы одномерного массива отлично подходит. Двумерный сейчас протестирую.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В первом сообщении жирным: 2)Новый инструмент: преобразование размерности и нижних границ без изменения и порядка данных (в рамках всего массива)
т.е. если тебе из двухмерного надо сделать одномерный с теми же данными (всеми, данные не удаляются). Или наоборот.
Количество элементов нужно, если ты из одномерного хочешь сделать двумерный, указываешь размер измерений
Изменено: bedvit - 21.12.2022 14:35:15
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Количество элементов нужно, если ты из одномерного хочешь сделать двумерный, указываешь размер измерений
довольно неочевидно. Добавь в описание. Плюс, укажи ограничения, ведь я так понимаю, что там не абы как можно количество элементов назначать. Добавь и примеры небольшие.
Тест
Работает мгновенно для одномерного массива в 1млн элементов 10 раз в цикле. Порядок элементов соблюдается и проверен.

Я так понимаю, что назначение ArrayDtoD:
    • изменение нижних границ
    • "деления" одномерного на "столбцы" двумерного
    • "сцепки столбцов" двумерного в одномерный (друг под другом)
Изменено: Jack Famous - 22.12.2022 10:25:20
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Не обязательно одномерного и двумерного. Размерность для сохраненных данных в массиве можно менять до 10. Главнаое правило, что бы размерности задавались так, что бы их общее произведение было равно первоначальному количеству элементов. Т.е. из одномерного массива в 100 элементов можно создать трехмерный 2*5*10. А из этого трехмерного, двумерный 25*4. А из этого двумерного одномерный  100. Он будет идентичен первому). Данные не удаляются и не обрезаются, а распределятся(остаются по факту как были) в том порядке, в котором были в изначальном масиве.
Изменено: bedvit - 22.12.2022 10:43:37
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, понял, спасибо. Тут написал, что много однообразных тем и нужно что-то делать…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх