Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

15 Апрель 2021, 17:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: [Решено] Calc: Как получить адрес ячейки, из которой вызвана функция?  (Прочитано 459 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Стартовое сообщение: 27 Февраль 2021, 23:21 »

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

В 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…"), но я здесь попытался ответить.


* Снимок экрана от 2021-02-28 00-07-45.png (6.57 Кб, 213x152 - просмотрено 1 раз.)
« Последнее редактирование: 28 Февраль 2021, 16:26 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Ответ #1: 28 Февраль 2021, 14:13 »

"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".

Если других предложений нет, то тему можно закрывать, так и не начав обсуждение…
« Последнее редактирование: 28 Февраль 2021, 14:19 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #2: 28 Февраль 2021, 15:02 »

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

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Ответ #3: 28 Февраль 2021, 15:20 »

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

Upd:
"Элегантности" данный код не прибавил, но хотя бы не надо передавать 3 лишних параметра (SHEET(), ROW(), COLUMN()), а также не надо заключать ссылку в кавычки.
C5: =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
Выглядит "вполне прилично". Всё работает.


* Снимок экрана от 2021-02-28 16-03-02.png (9.99 Кб, 286x160 - просмотрено 2 раз.)
« Последнее редактирование: 28 Февраль 2021, 16:45 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #4: 28 Февраль 2021, 16:32 »

Ребята, которые прописывали свойства объекта 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
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Ответ #5: 28 Февраль 2021, 16:47 »

Только в вашем примере ссылка на ячейку будет в стиле Excel, у меня - в стиле LO Calc.
Разобрались. @sokol92, спасибо.
« Последнее редактирование: 28 Февраль 2021, 16:53 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #6: 28 Февраль 2021, 17:24 »

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

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Ответ #7: 28 Февраль 2021, 17:32 »

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

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #8: 28 Февраль 2021, 17:38 »

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

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 513



« Ответ #9: 28 Февраль 2021, 17:50 »

когда подключается еще и Михаил
Это верно. Я ему иногда шлю прямо не предложенную им почту, иногда он сам сюда заглядывает. Теперь реже. @JohnSUN тоже ушёл на заслуженный отдых. Их отсутствие сказывается... Но мы "копаем", если не вглубь, то в ширину  Улыбка
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #10: 28 Февраль 2021, 17:53 »

@JohnSUN тоже ушёл на заслуженный отдых

20 минут назад был здесь. Смеющийся
Записан

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!