|
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
|
|
| 30.09.2016, 12:37 | |
|
Ответы с готовыми решениями:
2
Локальный или глобальный массив векторов
|
|
|
|
| 30.09.2016, 13:50 | |
|
Наверное лучше менять всю архитектуру проекта,
пересчет делать процедурой, отказаться от пользовательских функций листа. Полумера: при любом пересчете использовать событие Application.AfterCalculate Затем пройтись по всем ячейкам, где Ваша функция, и сделать пересчет конкретно этих ячеек.
1
|
|
|
1069 / 107 / 4
Регистрация: 19.12.2012
Сообщений: 458
|
|
| 30.09.2016, 14:28 [ТС] | |
|
Менять не получится - так уже работает не один проект. Кроме того, и функций много и разных и по всем листам, а еще все они используют результаты друг друга, а еще все что-то пытаются кешировать и кеши эти надо править в результате каких-то других пересчетов ... кхе-кхе ... какие-то проекты писались на скорость, а какие-то осознанно по безвыходности других вариантов ...
А вот за идею с AfterCalculate - спасибо! есть мысль попробовать, а перед этим в ходе калькулейта выстроить свое дерево расчетов СВОИХ функций(отдавая к примеру "ошибка рассчетов") и после AfterCalculate уже пройтись по нему - дорого, но зато незаметно для пользователя и решает множество проблем!
0
|
|
| 30.09.2016, 14:28 | |
|
Помогаю со студенческими работами здесь
3
Оптимизация, градиент, штрафная функция, локальный и глобальный минимум
Пересчет PR или новогодний глюк? Пересчет тИЦ и пересчет позиций Дан массив. Найти в нем глобальный минимум или максимум Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|