| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование, связанное с MS Office > Макрос и функция |
| Автор: YahоО 27.11.2024, 18:47 |
| Интересует запуск макроса из функции vba в Excel. Макрос может использовать функции. А если наоборот - функция должна запустить макрос? Если в ячейке А1 имеется некая функция vba, выполняющая например сложение значений двух соседних ячеек (или еще какие то вычисления), и существует Макрос1 который просто печатает в ячейке А10 слово "Привет", при условии что результат вычислений суммы двух ячеек в функции будет равен 10, но если сумма будет равна 100, то будет запускаться какой то иной МакросХ, который например изменит серый цвет заливки в 100 строке на красный. Не важно что будет считать функция, и какую работу будет выполнять макрос, главное чтобы при каждом пересчете листа и книги и соответственно при пересчете результатов данной функции каждый раз запускался нужный макрос, зависящий от результата вычислений функции. И для этого не нужно будет отдельно вызывать макрос из меню, или каждый раз клацать кнопку на листе, и вообще без каких либо кнопок, т.е. все должно работать в автоматическом режиме. Такое возможно? |
| Автор: Akina 30.11.2024, 17:53 |
Описанное - невозможно. Функция (а равно и вызываемые из неё функции и процедуры) не имеет право изменения содержимого листа или иного взаимодействия с визуальны интерфейсом.. |
| Автор: YahоО 2.12.2024, 23:40 |
| Жаль что Описанное - невозможно, остается лишь обходной путь таймер - но так делать конечно не супер. Akina, благодарю за ответ! |
| Автор: YahоО 24.12.2024, 21:17 |
| Для решения именно описанной задачи достаточно формулы и условного форматирования - но это всего лишь схема действия что может произойти из того что мы ожидаем: Например, в какой то ячейке (A1) имеется значение ( =ТДАТА() ), в другой ячейке этакая функция ( =tadam(A1) ) берущая входным аргументом значение из первой ячейки. Функция сверяет аргумент с своими критериями и выбирает какой из макросов запустить, или не запускать ничего, и так происходит всякий раз когда в ЛЮБОЙ из ячеек книги меняется значение. Так в первой ячейке значение вторник, ну а если будет пятница и время под конец рабочего дня, то нужный макрос включит нам Мендельсона. Можно это же самое проверять по таймеру, но таймер будет работать постоянно что не есть хорошо. Возможное применение: Вы много поработали с данным файлом и он очень сложный (или содержит практические точные данные), передаете его кому то другому и хотите подстраховать(ся) от поломки (защита от дурака), в этом случае и пригодится контролирующий макрос, что то типа "контрольной суммы". Разница макроса и функции - функция это всего лишь функция, и ничего то она не делает кроме как возвращает значение. В том и состоит смысл задачи: заставить работать функцию не слабее макроса, причем не задействуя Workbook_SheetCalculate, Workbook_SheetChange и др. |
| Автор: Akina 25.12.2024, 08:50 | ||
Во-первых, есть защита ячеек. Если дураку дать доступ только туда, где он ничего не испортит, то он ничего и не испортит. А если он пробьёт такую защиту, то это не дурак, а диверсант либо саботажник, и там совсем другие расклады. Во-вторых, защищаться от дурака надо в момент, когда он всё испортит - а это событие Workbook_BeforeSave. Именно в этом методе нужно проверить, что дурак ничего не поломал, а если поломал, то либо откатить, либо запретить сохранение, либо потребовать сохранение с новым именем (если ему так хочется, пусть портит копию, но не трогает оригинал). |
| Автор: YahоО 25.12.2024, 16:28 |
| надо в момент, когда он всё испортит - а это событие Workbook_BeforeSave - ну нет конечно, потому что до этого ОН может что то посчитать, получить результат, скопировать и сохранить в других файлах. В таком случае BeforeSave практически бесполезно. Но все же есть и иной вариант применения)) Пример навскидку, и может быть не совсем удачным, файл должен работать до какого либо времени (что то типа лицензии), потом он скукоживается (шифруется, или обрезается до неупотребимого вида), но может быть восстановлен в рабочее состояние путем предъявления ключа-восстановителя. Ключ может быть проверен запросом на сайт, и уже его ответ позволит макросу все восстанавливать. Других примеров пока нет, но заставить работать функцию не слабее макроса все же до сих пор любопытно. |
| Автор: YahоО 25.12.2024, 22:14 |
Akina Вы опираетесь на отсутствие такой встроенной фишки Excel, и потому уверенно можете опровергать все мои направления и примеры. А если бы наоборот, Вы хотели бы "пробить" стену невозможности и сами захотели поиметь эффект использования функции с возможностями макроса, то какой бы Вы привели пример практического использования? |
| Автор: Akina 26.12.2024, 07:57 | ||||||
Ну так это его ответственность, не твоя. Инструкция по использованию есть? если нет - напиши и вставь в файл первым листом.
Я бы использовал не функцию листа, а соответствующий модуль. Это не я же ввёл такое странное ограничение:
|
| Автор: YahоО 26.12.2024, 21:10 |
| Вы как всегда правы, без события невозможно запустить макрос. А заставить работать функцию не слабее макроса ... )))) Akina Вы так терпеливы в объяснении того что должно быть очевидным |
| Автор: Akina 27.12.2024, 07:59 |
... невозможно из-за наличия у функции дополнительных ограничений по сравнению с макросом. |