|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
Здравствуйте! Есть таблица. По колонкам - дни. По строкам - представлены данные: исходные и расчетные. Пусть в данном примере для понимания расчетные данные будут как кумулятивные. Суть здесь расчетов в том, что они цепные: начинают считать с первого дня по текущий. Для решения данной проблемы создал пользовательские функции. Каждая расчетная мера имеет свою пользовательскую функцию, где в аргументе протягивается диапазон. Диапазон выбирается таким образом, что по строкам выбирается: Дата, Исходная Мера1 и Исходная Мера2. И по колонкам: с начальной даты по текущую ячейку. См вложенный файл. Потом каждая пользовательская функция вызывают главную функцию, но с двумя аргументами: диапазон и меру, которую нужно возвратить. В общей функции для каждой ячейки идет считывание данных, и цепной расчет. Потом результат возвращается на ячейку, в зависимости какая вызвала пользовательская функция. Для временного хранения данных по дням создал класс со свойствами. Возьмем, для примера, Расчетную меру1. Для ячейки 02.09.2017 и он сложит Исходную Мера1 за 01.09.2017 и 02.09.2017. Для ячейки 03.09.2017 сложит туже меру за 01.09.2017, 02.09.2017 и 03.09.2017. и т. д. Данный пример простой, считает быстро. Можно менять исходные данные и происходит перерасчет для каждой ячейки. В рабочем примере алгоритм сложный: использовано больше строк (для исходных данных) с вложенные циклами, даже возвращается к ранним итерациям для перерасчетов. И таких табличных блоков, скажем, около 20. И тут возникает проблема: долго пересчитывается. Ведь пересчет идет для каждой ячейки, и для последующей ячейки, получается повторяет расчеты для предыдущих ячеек и плюс для текущего дня. Включая еще считывание данных с диапазона. Не обращайте внимание, что в макросе переменные на русском языке. Специально, чтобы проще Вам было понять код. Не уверен, что решение для данной задачи подобрано оптимально. Будто не в ту сторону иду. 1. Подскажите, как оптимально использовать пользовательские функции для данной задачи, чтобы меньше повторять расчеты и уменьшить время перерасчета? 2. Для данной задачи для временного хранения данных лучше использовать Класс или Пользовательский тип? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2017, 15:42 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2017, 15:46 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk, Посмотрите в сторону отсоединенных Recordset вместо массивов. Ощущение, что с ними побыстрей будет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 12:18 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
big-dukeferzmikk, Посмотрите в сторону отсоединенных Recordset вместо массивов. Ощущение, что с ними побыстрей будетRecordset знаю что это. Но что значит отсоединенных Recordset? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2017, 13:04 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk, Это рекордсет, который не связан с источником данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2017, 16:33 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
Наверно как вариант можно использовать пользовательскую функцию вне таблицы, где на входе диапазон (включая дату и исходные меры) и в результате меняет значения в расчетных мерах. Только при изменении значении в одной ячейки исходных мер - пересчитаются все ячейки расчетных мер. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 11:55 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikkпересчет идет для каждой ячейки, и для последующей ячейки, получается повторяет расчеты для предыдущих ячеек и плюс для текущего дня. Включая еще считывание данных с диапазона. Можно заменить функцию на обработчик события Worksheet_Change , который будет следить за изменением ячеек в диапазоне "исходных мер" и менять ячейки "расчетных мер". Поскольку вычисления будут производиться в одном вызове процедуры, считывать данные можно один раз и не повторять расчеты для предыдущих ячеек. Примерно то же самое можно сделать, если переписать функцию так, что ее аргументом является весь диапазон "исходных мер", а результатом работы - массив "расчетных мер", и ввести ее в диапазон "расчетных мер" как формулу массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 22:40 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
КазанскийМожно заменить функцию на обработчик события Worksheet_Change , который будет следить за изменением ячеек в диапазоне "исходных мер" и менять ячейки "расчетных мер". Поскольку вычисления будут производиться в одном вызове процедуры, считывать данные можно один раз и не повторять расчеты для предыдущих ячеек. Как вариант, только на листе не одна такая табличка. Важно, чтобы макрос понимал в каких ячейках находятся исходные данные и для какой таблицы выводить расчетные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 07:46 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk, в этот обработчик передается ссылка на диапазон, который был изменен. В простейшем случае можно различить таблицы так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 09:30 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ПОПРАВКА Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 09:31 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
Казанский, ОК, хорошо! А как быть, если со временем таблицы добавляются, удаляются, сдвиг строк, то в коде динамически как это учесть? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 10:07 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk, можно использовать именованные диапазоны. Допустим, они называются "tabl1", "tabl2" и т.д. Макрос может перебирать эти имена, пока очередное не вызовет ошибку, и проверять принадлежность Target к этим диапазонам. Так получается даже удобнее, чем с формулами: вставили в какой-то участок листа данные, дали диапазону имя - и макрос их обрабатывает без дополнительных усилий. Или сделать диапазоны "умными таблицами" и перебирать в макросе коллекцию ListObjects. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2017, 20:27 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk2. Для данной задачи для временного хранения данных лучше использовать Класс или Пользовательский тип? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2017, 09:26 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
ferzmikk, Пользовательский тип быстрее, но не дружит с Variant. Класс дружит с Variant, но медленнее, если использовать Public переменные. А если использовать Property Let/Property Get, то ваще мрак. С другой стороны, если идет речь об эффективности вычислений, то Variant противопоказан. Только Double и Long. Так что пользовательский тип. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2017, 12:48 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
Казанскийferzmikk, Пользовательский тип быстрее, но не дружит с Variant. Класс дружит с Variant, но медленнее, если использовать Public переменные. А если использовать Property Let/Property Get, то ваще мрак. С другой стороны, если идет речь об эффективности вычислений, то Variant противопоказан. Только Double и Long. Так что пользовательский тип.Добавлю. У класса есть возможность свои методы добавлять, например, для перерасчетов внутри текущего экземпляра или предыдущих экземпляров. А для пользовательских типов придется отдельные процедуры прописывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2017, 14:53 |
|
Оптимальное использование пользовательский функций
|
|||
---|---|---|---|
#18+
КазанскийА если использовать Property Let/Property Get, то ваще мрак.при отладке видим переменные без и с приставкой m. Это как бы усложняет отладку: табло насыщается дублирующей информацией. Возможно ли сделать так, чтобы переменные с приставкой m не были видны в отладчике? Или по своей логике работы они должны быть видны? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2017, 14:55 |
|
|
start [/forum/topic.php?fid=61&msg=39544128&tid=2172512]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 284ms |
total: | 415ms |
0 / 0 |