Страницы: 1
RSS
Как узнать адрес вычисляемой ячейки в функции-макросе?
 
Добрый день!!

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

По другому вопрос. Можно ли узнать координаты ячейки в теле функции, относительно которой функция вызывается. Т.е. в ячейку пишу "=myFunc()", псевдо код функции

function myFunc(){
  int x = thisCell.x
  int y = thisCell.y
  ...
}

Решение: Application.ThisCell.Address
Изменено: zaratustra2016 - 30.03.2018 06:15:33
 
Цитата
zaratustra2016 написал: значение в ячейку, в которую вставлена функция
Зачем нужен адрес, если функция в этой ячейке?
 
Я хочу посчитать сумму ячеек в, вычисляемой строке, до ячейки, в которую вставлена функция. Если сумма =0, то скрыть всю строку, если >0 - написать значение  в ячейку, в которую вставлена функция-макрос.
Такая вот автосумма с сокрытием строки при "пустых" результатах. Применяется в сводной таблице.
Изменено: zaratustra2016 - 29.03.2018 14:58:19
 
Правила Вы не дочитали до конца... Файл-пример ускорит помощь.
 
псевдо решение
Код
function myFunc(){
  long x = ActiveCell.Row
  long y = ActiveCell.Column
  ...
}
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал:
псевдо решение
не очень хорошее, если пересчет книги будет на листе, отличном от того, в котором сама функция. Я более-менее подробно разбирал такую проблему в статье: Кто вызвал функцию или процедуру?
Если кратко - Application.Caller
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
zaratustra2016 написал:
скрыть всю строку
вот не уверен, что это получится сделать изнутри пользовательской функции. Они не умеют изменять свойства других ячеек.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий Щербаков написал:
если пересчет книги будет на листе, отличном от того, в котором сама функция
Возможно, но "координаты" ячейки в которой используется UDF точно не изменяться при пересчете.
Изменено: TheBestOfTheBest - 29.03.2018 15:22:47
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал:
"координаты" ячейки в которой используется UDF
Они-то не изменятся, а вот координаты ActiveCell - очень даже изменятся. Проведите эксперимент:
создайте две UDF:
Код
'возвращает адрес активной ячейки активного листа, даже если активная ячейка в другой книге
Function GetActCell()
    Application.Volatile True
    GetActCell = "'GetActCell' return address: " & ActiveCell.Address(0, 0, xlA1, True)
End Function
'возвращает всегда адрес той ячейки, в которой записана
Function GetActCell_Caller()
    Application.Volatile True
    GetActCell_Caller = "'GetActCell_Caller' return address: " & Application.Caller.Address(0, 0, xlA1, True)
End Function
запишите одну в ячейку A1, вторую в A2.
Теперь просто поперемещайтесь по листу, вводя в разные ячейки листа значения. И посмотрите, как будут изменяться возвращаемые значения каждой функции. При этом возвращаемое значение функции GetActCell будут изменяться даже если изменения были сделаны на другом листе другой книги - активной.
Во вложении файл с функциями. Пощелкайте на листе с функциями. Потом перейдите на любой лист этой же книги - измените там какую-нибудь ячейку. Вернитесь на лист с функциями и посмотрите, что там насчиталось. Так же можно перейти в другую книгу и изменить что-то там. Вернуться и посмотреть результат...
Изменено: Дмитрий Щербаков - 29.03.2018 15:41:30 (дополнил пример)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Всем спасибо!
Решение: Application.ThisCell.Address.
Дмитрий, спасибо за наводку.  
 
Цитата
Дмитрий Щербаков написал:
Application.Caller.Address(0, 0, xlA1, True)
Дмитрий, благодарю. Действительно активная ячейка может быть не той, в которой UDF.!
Неизлечимых болезней нет, есть неизлечимые люди.
Страницы: 1
Наверх