Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458

Глобальный или локальный пересчет?

30.09.2016, 12:37. Показов 1000. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги,

1. есть самописная формула a()
2. она стоит во многих ячейках книги/листа

1. вариант - нажат Ентер на ячейке с этой формулой, что вызовет пересчет ячейки
2. вариант - нажато Ctrl+Shift+Alt+F9, что вызовет глобальный пересчет

Вопрос - как узнать в коде, какой из типов пересчета запущен пользователем? (без ловли чейнджев и чейнджев селектов листов)

Далее сложно, но можно пропустить:
Проблема в том, что перед основной работой a() в начале кода функции (при первом вызове) считываются некоторые данные справочников других листов (которые опять же рассчитываются на каких-то других формулах (но уже) экселя) и содержимое этих справочников сохраняется в глобальный внутренний контейнер

Фишка экселя: а в случае глобального пересчета, эксель для начала простраивает общее дерево пересчетов и не всегда(вернее в 99% НЕ ставит) ставит вызов моей функции после вызова формул справочников, которой для нормальной работы требуется полный пересчет формул справочников ДО вызова моей функции
В противном случае, ячейки со всеми формулами, которые пока еще не пересчитались имеют пустое значение даже если ранее эти ячейки имели какое-то насчитанное значение.

- Пытался это смоделировать на простейших примерах, чтобы добавить в тему по проф. советам - не получается. Проблемы начинаются после определенной сложности и веса файла. (потому, пока эту проблему более нигде не расписывал)
- Есть гипотетический вариант указывать в аргументах формулы ссылки на те ячейки и области, которые будут требоваться при работе этой формулы, что конечно даст более корректное дерево пересчетов, но 1. поверьте - при и так большом и сложном файле ссылки на области значительно усложняют работу пересчетов и порой ТОЛЬКО перестройка (при таком варианте ссылочности) может нагружать эксель до 5(и более) минут только на работу построения дерева пересчетов и только потом уже идут все пересчеты!!! 2. При указании ссылок на области в аргументах формулы не всегда понятно - какие из областей потребуются коду ... а указывать все (на все) - опять не вариант.
- Есть еще один вариант - строить глобальное дерево расчетов самому и пересчитывать его руками(своим кодом), но до этого пока не подобрался.

Т.е. при глобальном пересчете желательно ничего не читать и не считать, а просто вернуть какое-то значение типа "ошибка рассчетов", дабы не столкнуться некорректностью результатов (и искать варианты решений и пересчетов потом).
При варианте пересчета ячейки Ентером дерево вновь не простраивается, все справочники не пересчитываются и значения формул(ячеек) спокойно читаются, что собственно делать можно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2016, 12:37
Ответы с готовыми решениями:

Локальный или глобальный массив векторов
Везде в литературе рекомендуется создавать локальные объекты. Основные аргументы - они легче оптимизируются и безопаснее. У меня такия...

Как совместить глобальный и локальный стиль
Добрый день! У меня есть глобальный стиль, который перерисовывает все textBox в проекте. <Style...

Что содержат массивы (глобальный, локальный блоки)
Что содержат sa, ia, sa2, ia2 ? Только сразу скажу, что меня не интересует, что выведет компилятор. string sa; int ia; int...

2
 Аватар для KoGG
5640 / 1622 / 418
Регистрация: 23.12.2010
Сообщений: 2,430
Записей в блоге: 1
30.09.2016, 13:50
Наверное лучше менять всю архитектуру проекта,
пересчет делать процедурой,
отказаться от пользовательских функций листа.

Полумера:
при любом пересчете использовать событие Application.AfterCalculate
Затем пройтись по всем ячейкам, где Ваша функция, и сделать пересчет конкретно этих ячеек.
1
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
30.09.2016, 14:28  [ТС]
Менять не получится - так уже работает не один проект. Кроме того, и функций много и разных и по всем листам, а еще все они используют результаты друг друга, а еще все что-то пытаются кешировать и кеши эти надо править в результате каких-то других пересчетов ... кхе-кхе ... какие-то проекты писались на скорость, а какие-то осознанно по безвыходности других вариантов ...

А вот за идею с AfterCalculate - спасибо! есть мысль попробовать, а перед этим в ходе калькулейта выстроить свое дерево расчетов СВОИХ функций(отдавая к примеру "ошибка рассчетов") и после AfterCalculate уже пройтись по нему - дорого, но зато незаметно для пользователя и решает множество проблем!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2016, 14:28
Помогаю со студенческими работами здесь

Оптимизация, градиент, штрафная функция, локальный и глобальный минимум
Решается оптимизационная задача по поиску минимума функции.Целевая Функция S зависит от переменной U4, k: S(U4,k). Глобальный минимум...

Пересчет координат или нет?
У меня есть графический редактор, который может увеличивать масштаб изображения при помощи кода: image.Width := Trunc(FirstWidth * (1 +...

Пересчет PR или новогодний глюк?
Только что, у нескольких сайтов заметил изменение PR, что думаете начался пересчет? Проверился на http://www.seochat.com/ похоже...

Пересчет тИЦ и пересчет позиций
Скажите пожалуйста, как по времени соотносятся между собой пересчет тИЦ и пересчет позиций. Это происходит одновременно? Или сперва тИЦ,...

Дан массив. Найти в нем глобальный минимум или максимум
Помогите пожалуйста! Очень нужно решение Дан массив А(М). Найти в нем глобальный минимум или максимум.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru