В процессе реализации идеи по «автоматизации отчета» узнал о существовании функции:
Application.Caller.Address
Которая позволяет узнать адрес ячейки, для которой выполняется вычисление функции.
Вопрос: возможно ли использовать ее для модификации содержимого ячейки?
Важные замечание!
Само формирование такого вопроса ошибочно, потому что нарушает требования к написанию кода: исполняемая функция не должна производить побочное действие.
Все возможности, описанные ниже не стоит использовать, потому что:
- функции реализуют побочное действие
- код трудно сопровождать и поддерживать
- без детальной документации будет проблематично вспомнить о том, что происходит
Код приводится только для примера того как не надо делать!
Ошибочно написанная функция такого вида:
Function a() a = 1 Cells(1, 1) = 1 End Function
будет исполняться в редакторе кода. Однако в случае вызова из ячейки выполнение функции будет остановлено и показано сообщение об ошибке:
Трюк, позволяющий изменить значение в ячейке, вызывающей функцию
Для реализации функции, удаляющей содержимое вызвавшей ее ячейки необходимо:
- создать функцию
Function deleteCellValue(pCell) Application.Volatile pCell.Value = "" End Function
- выбрать на листе ячейку, в которую нужно поместить функцию
- создать именованную формулу (задаются через «Диспетчер имен» в поле «Диапазон»), вызывающую функцию, передавая ей адрес ячейки
- создать функцию, вызывающую именованную формулу
Function deleteSelf() Application.Volatile [del] End Function
- добавить вызов функции deleteSelf в ячейку
После ввода формулы ее содержимое будет очищено.
Данная реализация бесполезна, гораздо практичнее воспользоваться условной функцией, которая будет удалять содержимое ячейки только при выполнении какого-то критического условия (в примере 1=-1)