[Решено] Calc: Как получить адрес ячейки, из которой вызвана функция?

Автор eeigor, 27 февраля 2021, 23:21

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Есть ли такая возможность?

В Excel VBA это можно сделать через Application.Caller.Address.
    Dim Q$  'Single [Q]uote or vbNullString

   With Application.Caller
       Q = IIf(InStr(.Parent.Name, " ") > 0, "'", "")
       GetCallerAddress = Q & .Parent.Name & Q _
        & "!" & .Address(False, False)  'Relative reference
   End With


Upd:
Передать дополнительным аргументом само имя ячейки?
C5: =UDF(Arg1;Agr2;CELL("ADDRESS";C5))
Function UDF(Arg1, Arg2, Optional Caller)
   Print Caller
End Function


Однако, если дополнить ссылку на ячейку именем листа, то CELL возвращает имя листа только в том случае, если ссылка указывает на другой лист. То есть в рассматриваемом случае ссылка получается неполной. Это противоречит описанию: имя листа должно возвращаться. Значит, надо ещё и имя листа передавать?

Будут другие предложения?
Ссылка на обсуждение 10-летней давности. Или здесь*... Но, может, что-то изменилось.

Upd1:
Может возникнуть вопрос, зачем всё это нужно?
Написана своя реализация (обёртка) функции REGEX с расширенными возможностями (естественно, с опорой на встроенный "движок"), которая дополнительно может выводить отладочную информацию с количеством и позициями всех совпадений (да, всех, а не первого или заданного), если установлен соответствующий параметр. Если для функции оставить это параметр включенным, то при загрузке файла начинают всплывать сообщения, и не всегда ясно, где находится сама функция (на каком листе? в какой ячейке?), вызвавшая UDF. Для удобства. Ищем то, к чему когда-то привыкли. Зачем-то же в Excel VBA присутствует такая возможность... И не только для этого.

Upd2:
* По ссылке выше наш @JohnSUN задаёт небезосновательные вопросы по поводу того, зачем это нужно и нужно ли ("Why do you need this? Do not produce essences beyond what is necessary..."), но я здесь попытался ответить.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#1
"If you know that SHEET(), ROW() and COLUMN() without parameters can return sheet-row-column numbers, then just pass them as parameters when calling your UDF".

"Of course I had already thought of passing these things as parameters but I'm sure you'll agree that such a solution is not the most elegant".

Если других предложений нет, то тему можно закрывать, так и не начав обсуждение...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Добрый день! Мы же только что обсуждали, как передавать информацию о ячейке (диапазоне ячееек) с помощью одного параметра. С тех пор даже версия LO не изменилась. :)
Что касается аналога свойства Application.Caller, то, да, у меня оно отмечено, как не имеющее аналога в LO Calc.
Владимир.

eeigor

@sokol92, да, или так: в режиме совместимости передать ссылку на саму ячейку (C5) без кавычек и извлечь Range.Parent.Name & Range.Address (Excel). Как вариант.

Upd:
"Элегантности" данный код не прибавил, но хотя бы не надо передавать 3 лишних параметра (SHEET(), ROW(), COLUMN()), а также не надо заключать ссылку в кавычки.
Цитата: eeigor от 27 февраля 2021, 23:21C5: =UDF(Arg1;Agr2;CELL("ADDRESS";C5))
C5: =UDF(Arg1;Agr2;C5)

Только если уточню, что Range.Parent оказался пустым объектом (VBA), скриншот.
Поэтому получаем абсолютный адрес ячейки с именем листа через "родной" объект CellRange
Option VBASupport 1

Function UDF(Arg1, Arg2, Optional Caller)
    If Not IsMissing(Caller) Then
        sCallerName = Caller.CellRange.AbsoluteName
        Print sCallerName
    End If
End Function

Выглядит "вполне прилично". Всё работает.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Ребята, которые прописывали свойства объекта Range (в режиме совместимости), вероятно, посчитали Parent ненужным, поскольку есть Worksheet. :)
Так должно работать:
Option VbaSupport 1
Function UDF(arg, arg2, Optional caller)
  If Not IsMissing(caller) Then
    Msgbox "Вызов из " & caller.address(External:=True)
    Msgbox "Имя листа " & caller.Worksheet.name   
  End If 
End Function
Владимир.

eeigor

Только в вашем примере ссылка на ячейку будет в стиле Excel, у меня - в стиле LO Calc.
Разобрались. @sokol92, спасибо.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Согласен, при условии, что метод CellRange корректно обрабатывает не только одиночную ячейку, но и диапазоны. Сейчас посмотрел, вроде это так, спасибо!
Владимир.

eeigor

Да. А учитывая, что у меня изначально стояла задача получения доступа к заданному пользователем диапазону (в режиме совместимости с VBA), то решение с получением ячейки, в которой размещена вызывающая функция, оказалось вполне оправданным и лёгким. Гораздо лучшим, чем предлагалось в Сети. Однако, я туда это добавил (две ссылки в стартовом сообщении, теперь с нашим решением).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

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

eeigor

Цитата: sokol92 от 28 февраля 2021, 17:38когда подключается еще и Михаил
Это верно. Я ему иногда шлю прямо не предложенную им почту, иногда он сам сюда заглядывает. Теперь реже. @JohnSUN тоже ушёл на заслуженный отдых. Их отсутствие сказывается... Но мы "копаем", если не вглубь, то в ширину  :)
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

Владимир.