Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как правильно перенести данные из массива в комментарий, оптимизация макроса
 
Здравствуйте!

Подскажите, пожалуйста, можно напрямую выгружать данные из массива в комментарии диапазона ячеек? Или как-то оптимизировать мой макрос (см. последовательность работы ниже), к примеру, избавиться от пункта 2 (перебор по ячейкам).

Имеем диапазон
r1 = Range("A1:D10")
arr1 - массив с уникальными элементами (для каждой ячейки диапазона r1 будут свои данные)

Сейчас я использую следующую последовательность:
1) Данные из массива выгружаются в диапазон ячеек
Код
    r1.Resize(1, UBound(arr1, 2)) = arr1
2) Цикл по всем ячейкам диапазона -> перенос данных из непустых ячеек в комментарий этих ячеек
Код
    For Each c In r1
    On Error Resume Next
           c.Comment.Delete
           If c <> "" Then
              c.AddComment CStr(c.Value)
           End If
    Next

Прошу прощения, если описал сумбурно и не очень понятно (допишу, если будут какие-то вопросы).
Изменено: Fylhtqq - 05.12.2021 18:34:45
Объединение множества массивов в один массив
 
Здравствуйте!

Сразу прошу прощения за "стену текста", познаю VBA недавно. Хочется не только получить результат, но и понять логику разработки.

Есть "х" листов с разным количеством заполненных строк и одинаковым количеством заполненных столбцов. Т.е. первая размерность разная, вторая одинаковая.
Необходимо собрать данные со всех листов в один массив

Должно получиться так (на примере двух листов):
+ : arr1 :  : Variant/Variant(1 to 26, 1 to 200) - массив с первого листа
+ : arr2 :  : Variant/Variant(1 to 29, 1 to 200) - массив со второго листа
+ : arr3 :  : Variant/Variant(1 to 55, 1 to 200) - "массив массивов"

Для решения задачи (и подтверждения того, что "массив массивов" подойдет) был использован код с перебором значений (под спойлером).
Работает, но проблема заключается в том, что нужно использовать не 2 листа, а, к примеру, 20 или 50 (количество постоянно меняется).
Скрытый текст

На данном форуме удалось найти единственный, похожий на мою ситуацию, совет-ответ, к большому сожалению, без самого кода:
Цитата
The_Prist написал:
Вообще, для сокращения кол-ва строк кода можно собирать в отдельные массивы данные с книг. Сами массивы помещать в один общий массив(в котором будут эти массивы). Иными словами создать массив массивов. А потом все это выгружать или объединить в один массив.
Как алгоритм:
1. Создаем динамический массив массивов(avMain)
2. Идем циклом по книгам и собираем данные в промежуточные массивы(avBook_1, avBook_2 ... avBook_n). Попутно в отдельную переменную плюсуем размерность каждого массива: lResCnt = lResCnt + Ubound(avBook1,1)
3. Определяем размерность результирующего массива(avRes): ReDim avRes(1 to lResCnt, 1 to lColsCnt)
4. Осталось только пройтись циклом по avMain и по очереди выгрузить циклами данные из этих массивов в avRes.
Решение вроде понятное, но как его преобразовать в макрос не могу сообразить.
1) создать динамический массив массивов - разве его можно создать первым пунктом, без понимания размерности?
2) идем циклом по листам и собираем данные в промежуточные массивы - я понимаю, как задать цикл по листам, но как автоматически задать каждому листу новый-уникальный массив?
3) ...

К сообщению прикрепил файл с примером. Голые данные, без макросов.
Если необходимо  
Изменено: Fylhtqq - 09.10.2021 19:03:00
Макрос поиска значения по заданным условиям и обработка результата, ускорение работы макроса
 
Здравствуйте, уважаемые!

Сразу хочу извиниться за "стену текста", но описать проблему в два предложения не смог. Хочется не только решить конкретную задачу, но и понять принцип работы экселя и взаимосвязь "дополнительное условие в проверке = дополнительное время на обработку данных"

У меня есть два файла (прикрепил их к сообщению).
Из файла Свод в файл Итог макросом переносятся данные. Макрос найден на просторах интернета и немного переработан под мою задачу, есть вероятность, что он не совсем правильно работает. Проблема заключается в том, что для получения результата необходимо ждать очень много времени.

Как работает макрос и что нужно получить:
Скрытый текст

Ранее не сталкивался с формированием таких больших отчетов, не уверен, что правильно понимаю принцип работы экселя/макросов.
В примере 17 строк по 153 ячейки в каждой, т.е. 2601 ячейка.
Если я задаю проверку через строку (ниже), макрос завершает свою работу через 20 секунд
Код
If arr2(1, i) = arr(n, 57) And arr(n, 46) = m And arr(n, 3) = gg Then
Если я задаю проверку через строку (ниже), макрос завершает свою работу через 40 секунд
Код
If arr2(1, i) = arr(n, 57) And arr2(1, i) >= c1 And arr2(1, i) <= c2 And arr(n, 46) = m And arr(n, 3) = gg Then
Т.е. из-за дополнительной проверки двух переменных макрос начинает работать в 2 раза дольше
Код
arr2(1, i) >= c1 And arr2(1, i) <= c2
Рабочий файл должен содержать более 60 тыс обрабатываемых ячеек (30 листов с результатами). Грубый математический расчет дает понять, что 60 тыс ячеек будут обрабатываться: 1 вариант - 7,5 минут, 2 вариант - 15 минут
Первый вариант близок к нормальному времени, но не выполняет свою задачу на 100%. Второй вариант занимает слишком много времени.

Вопросы:
1) Мой макрос написан плохо или это нормально, что на обработку 2600 ячеек уходит 20 секунд?
2) Как можно улучшить текущий макрос (или как должен выглядеть новый) для более быстрой обработки результатов?
Изменено: vikttur - 05.10.2021 21:42:13
Страницы: 1
Loading...