powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимальное использование пользовательский функций
16 сообщений из 16, страница 1 из 1
Оптимальное использование пользовательский функций
    #39539890
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть таблица. По колонкам - дни. По строкам - представлены данные: исходные и расчетные. Пусть в данном примере для понимания расчетные данные будут как кумулятивные. Суть здесь расчетов в том, что они цепные: начинают считать с первого дня по текущий.

Для решения данной проблемы создал пользовательские функции. Каждая расчетная мера имеет свою пользовательскую функцию, где в аргументе протягивается диапазон. Диапазон выбирается таким образом, что по строкам выбирается: Дата, Исходная Мера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. Для данной задачи для временного хранения данных лучше использовать Класс или Пользовательский тип?
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39539891
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39540970
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Посмотрите в сторону отсоединенных Recordset вместо массивов.
Ощущение, что с ними побыстрей будет
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39541007
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeferzmikk,

Посмотрите в сторону отсоединенных Recordset вместо массивов.
Ощущение, что с ними побыстрей будетRecordset знаю что это. Но что значит отсоединенных Recordset?
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39541901
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

Это рекордсет, который не связан с источником данных.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39543113
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверно как вариант можно использовать пользовательскую функцию вне таблицы, где на входе диапазон (включая дату и исходные меры) и в результате меняет значения в расчетных мерах. Только при изменении значении в одной ячейки исходных мер - пересчитаются все ячейки расчетных мер.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39543571
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikkпересчет идет для каждой ячейки, и для последующей ячейки, получается повторяет расчеты для предыдущих ячеек и плюс для текущего дня. Включая еще считывание данных с диапазона.
Можно заменить функцию на обработчик события Worksheet_Change , который будет следить за изменением ячеек в диапазоне "исходных мер" и менять ячейки "расчетных мер". Поскольку вычисления будут производиться в одном вызове процедуры, считывать данные можно один раз и не повторять расчеты для предыдущих ячеек.
Примерно то же самое можно сделать, если переписать функцию так, что ее аргументом является весь диапазон "исходных мер", а результатом работы - массив "расчетных мер", и ввести ее в диапазон "расчетных мер" как формулу массива.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39544128
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КазанскийМожно заменить функцию на обработчик события Worksheet_Change , который будет следить за изменением ячеек в диапазоне "исходных мер" и менять ячейки "расчетных мер". Поскольку вычисления будут производиться в одном вызове процедуры, считывать данные можно один раз и не повторять расчеты для предыдущих ячеек. Как вариант, только на листе не одна такая табличка. Важно, чтобы макрос понимал в каких ячейках находятся исходные данные и для какой таблицы выводить расчетные данные.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39544169
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
в этот обработчик передается ссылка на диапазон, который был изменен. В простейшем случае можно различить таблицы так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Select Case Target.Row
  Case 1 To 4
    'работа с первой таблицей
  Case 10 To 13
    'работа со второй таблицей
  'и т.д.
  End Select
End Sub
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39544170
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПОПРАВКА
Код: vbnet
1.
Private Sub Worksheet_Change(ByVal Target As Range)
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39544202
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанский,

ОК, хорошо! А как быть, если со временем таблицы добавляются, удаляются, сдвиг строк, то в коде динамически как это учесть?
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39544860
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
можно использовать именованные диапазоны. Допустим, они называются "tabl1", "tabl2" и т.д. Макрос может перебирать эти имена, пока очередное не вызовет ошибку, и проверять принадлежность Target к этим диапазонам. Так получается даже удобнее, чем с формулами: вставили в какой-то участок листа данные, дали диапазону имя - и макрос их обрабатывает без дополнительных усилий.

Или сделать диапазоны "умными таблицами" и перебирать в макросе коллекцию ListObjects.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39548730
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk2. Для данной задачи для временного хранения данных лучше использовать Класс или Пользовательский тип?
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39548885
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
Пользовательский тип быстрее, но не дружит с Variant. Класс дружит с Variant, но медленнее, если использовать Public переменные. А если использовать Property Let/Property Get, то ваще мрак.
С другой стороны, если идет речь об эффективности вычислений, то Variant противопоказан. Только Double и Long.
Так что пользовательский тип.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39549010
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казанскийferzmikk,
Пользовательский тип быстрее, но не дружит с Variant. Класс дружит с Variant, но медленнее, если использовать Public переменные. А если использовать Property Let/Property Get, то ваще мрак.
С другой стороны, если идет речь об эффективности вычислений, то Variant противопоказан. Только Double и Long.
Так что пользовательский тип.Добавлю. У класса есть возможность свои методы добавлять, например, для перерасчетов внутри текущего экземпляра или предыдущих экземпляров. А для пользовательских типов придется отдельные процедуры прописывать.
...
Рейтинг: 0 / 0
Оптимальное использование пользовательский функций
    #39549014
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КазанскийА если использовать Property Let/Property Get, то ваще мрак.при отладке видим переменные без и с приставкой m. Это как бы усложняет отладку: табло насыщается дублирующей информацией. Возможно ли сделать так, чтобы переменные с приставкой m не были видны в отладчике? Или по своей логике работы они должны быть видны?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Оптимальное использование пользовательский функций
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]