Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Макрос и функция


Автор: YahоО 27.11.2024, 18:47
Интересует запуск макроса из функции vba в Excel.


Макрос может использовать функции. А если наоборот - функция должна запустить макрос?

Если в ячейке А1 имеется  некая функция vba,  выполняющая например сложение значений двух соседних ячеек (или еще какие то вычисления),
и существует Макрос1 который просто печатает в ячейке А10 слово "Привет", при условии что результат вычислений суммы двух ячеек в функции будет равен 10,
но если сумма будет равна 100, то будет запускаться какой то иной МакросХ, который например изменит серый цвет заливки в 100 строке на красный.

Не важно что будет считать функция, и какую работу будет выполнять макрос, 
главное чтобы при каждом пересчете листа и книги и соответственно при пересчете результатов данной функции каждый раз запускался нужный макрос, зависящий от результата вычислений функции.
И для этого не нужно будет отдельно вызывать макрос из меню, или каждый раз клацать кнопку на листе, и вообще без каких либо кнопок, т.е. все должно работать в автоматическом режиме.
Такое возможно?



Автор: Akina 30.11.2024, 17:53
Цитата(YahоО @  27.11.2024,  19:47 Найти цитируемый пост)
Такое возможно?

Описанное - невозможно. Функция (а равно и вызываемые из неё функции и процедуры) не имеет право изменения содержимого листа или иного взаимодействия с визуальны интерфейсом..

Автор: YahоО 2.12.2024, 23:40
Жаль что Описанное - невозможно, остается лишь обходной путь таймер - но так делать конечно не супер.
Akina, благодарю за ответ!


Автор: Akina 3.12.2024, 09:12
Цитата(YahоО @  27.11.2024,  19:47 Найти цитируемый пост)
Если в ячейке А1 имеется  некая функция vba,  выполняющая например сложение значений двух соседних ячеек (или еще какие то вычисления),
и существует Макрос1 который просто печатает в ячейке А10 слово "Привет", при условии что результат вычислений суммы двух ячеек в функции будет равен 10,
но если сумма будет равна 100, то будет запускаться какой то иной МакросХ, который например изменит серый цвет заливки в 100 строке на красный.

Я, признаться, не понимаю смысла в том, чтобы делать всё это кодом. Для решения именно описанной задачи достаточно формулы и условного форматирования.

Автор: YahоО 24.12.2024, 21:17
Для решения именно описанной задачи достаточно формулы и условного форматирования - но это всего лишь схема действия что может произойти из того что мы ожидаем:

Например, в какой то ячейке (A1)  имеется значение  ( =ТДАТА()  ), в другой ячейке этакая функция ( =tadam(A1) )  берущая входным аргументом значение из первой ячейки.
Функция сверяет аргумент с своими критериями и выбирает какой из макросов запустить, или не запускать ничего, и так происходит всякий раз когда в ЛЮБОЙ из ячеек книги меняется значение.
Так в первой ячейке значение вторник, ну а если будет пятница и время под конец рабочего дня, то нужный макрос включит нам Мендельсона.

Можно это же самое проверять по таймеру, но таймер будет работать постоянно что не есть хорошо.
Возможное применение: Вы много поработали с данным файлом и он очень сложный (или содержит практические точные данные), передаете его кому то другому и хотите подстраховать(ся) от поломки (защита от дурака), в этом случае и пригодится контролирующий макрос, что то типа "контрольной суммы".
Разница макроса и функции - функция это всего лишь функция, и ничего то она не делает кроме как возвращает значение. В том и состоит смысл задачи: заставить работать функцию не слабее макроса, причем не задействуя Workbook_SheetCalculate, Workbook_SheetChange и др.

Автор: Akina 25.12.2024, 08:50
Цитата(YahоО @  24.12.2024,  22:17 Найти цитируемый пост)
передаете его кому то другому и хотите подстраховать(ся) от поломки (защита от дурака)

Во-первых, есть защита ячеек. Если дураку дать доступ только туда, где он ничего не испортит, то он ничего и не испортит. А если он пробьёт такую защиту, то это не дурак, а диверсант либо саботажник, и там совсем другие расклады.
Во-вторых, защищаться от дурака надо в момент, когда он всё испортит - а это событие 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оО @  25.12.2024,  17:28 Найти цитируемый пост)
до этого ОН может что то посчитать, получить результат, скопировать и сохранить в других файлах

Ну так это его ответственность, не твоя. Инструкция по использованию есть? если нет - напиши и вставь в файл первым листом. 

Цитата(YahоО @  25.12.2024,  23:14 Найти цитируемый пост)
А если бы наоборот, Вы хотели бы "пробить" стену невозможности и сами захотели поиметь эффект использования функции с возможностями макроса, то какой бы Вы привели пример практического использования?

Я бы использовал не функцию листа, а соответствующий модуль. Это не я же ввёл такое странное ограничение:
Цитата(YahоО @  24.12.2024,  22:17 Найти цитируемый пост)
В том и состоит смысл задачи: заставить работать функцию не слабее макроса, причем не задействуя Workbook_SheetCalculate, Workbook_SheetChange и др.



Автор: YahоО 26.12.2024, 21:10
Вы как всегда правы, без события невозможно запустить макрос.

А заставить работать функцию не слабее макроса ... ))))


Akina Вы так терпеливы в объяснении того что должно быть очевидным smile

Автор: Akina 27.12.2024, 07:59
Цитата(YahоО @  26.12.2024,  22:10 Найти цитируемый пост)
А заставить работать функцию не слабее макроса

... невозможно из-за наличия у функции дополнительных ограничений по сравнению с макросом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)