Calc: ArrayFormulaLocal ?

Автор eeigor, 21 марта 2020, 13:51

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

rami

Цитата: eeigor от 10 апреля 2020, 17:58А избыточная информация вредна, и пример здесь не нужен. Но вот умение абстрагироваться от ненужных деталей – весьма кстати.
eeigor, вы хорошо знаете какая информация полезна, а какая вредна и умеете абстрагировать других от не нужных деталей, но вопросы по LibreOffice почему-то задаёте вы, а не mikekaganski.

eeigor

Хорошо. Я учту. Не будем ссориться.

Вопросы у меня будут, надеюсь на участие.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#17
Цитата: mikekaganski от 10 апреля 2020, 00:47Моя проблема в том, что я никак не могу найти там ни одной запятой, хотя в ответе #3 говорится, что они там водятся. Помогите
mikekaganski, у Вас в примере (который приложен к сообщению #9) диапазон сплошной. Вот он (A1:B5): $Sheet1.$A$1:$B$5
Поэтому и разделителей Вы не увидели.

У меня Вы всё увидите сами. Я помещаю здесь усечённый пример. Вопрос мой был по системным разделителям списка значений и только в этом смысле может быть связан с общим заголовком темы (хотя теперь связь весьма условная, но я решил не создавать новой темы).
Дело выеденного яйца не стоит.

Есть такое свойство:
oChart.EmbeddedObject.UsedRangeRepresentations

которое в прилагаемом примере возвращает массив адресов поддиапазонов диаграммы по каждой из осей координат X и Y.

И для визуального контроля работы программы, ибо исчезновение точки на диаграмме не всегда заметно (точки, которую пользователь самолично исключил, грубо разорвав диапазон на поддиапазоны), все поддиапазоны выводятся на лист (увидите). А с целью повышения читабельности текста из строки с поддиапазонами удаляются ссылки на имя листа, знаки $ (абсолютной адресации) и после РАЗДЕЛИТЕЛЯ СПИСКА вставляется ПРОБЕЛ.
Право, первое лучше второго: A1:B5 vs $Sheet1.$A$1:$B$5  'зд. Ваш пример без разделителей

У студента физтеха - Macbook, LO Calc не русифицированный (если смена языка на что-то влияет), в качестве разделителя - ЗАПЯТАЯ, а у меня на Linux Ubuntu, LO Calc русифицированный - ТОЧКА С ЗАПЯТОЙ.
За кадром остались: две сигмы, метод наименьших квадратов и прочая "физика с математикой"... которые мне в данном случае были, ну, совершенно неинтересны. Моя задача заключалась "в обеспечении возможности исключать явно отклонившиеся точки из области полученных данных". Отсюда разрывы, отсюда и разделители... которые имеют "системное" происхождение и с моими ручками никак не связаны.

Вопрос не имеет особого практического значения, поскольку решён путём использовании константы, в которой хранится разделитель, и у каждого теперь он свой (кроссплатформенный  >:(). Вопрос чисто теоретический...
Надеюсь, что я расставил все точки над i, и теперь повторю ещё раз сам вопрос: как получить значение системного разделителя списка применительно к данному примеру (свойству) в условиях разных платформ.

P.S. Я перешёл на Linux с Windows (где использовал бы Win API, но в условиях разных платформ этот способ не работает) и не знаю, можно ли это сделать средствами самого LO Calc или нужно использовать функции операционной системы (и как это сделать в Linux я тоже не знаю).

P.P.S. Кстати, в прилагаемом примере почему-то при загрузке включается режим разработки (и кнопка не работает), а в других случаях сохраняется ранее выбранный режим. Что я делаю не так? Как зафиксировать режим выполнения (а не разработки) при старте программы?
См. Сервис - Формы - Режим разработки
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Хм. Иногда я готов согласиться с товарищем Lupp с ask.libreoffice.org насчёт ужасов локализации.

Здесь используется разделитель списка параметров функции (см. lcl_convertTokensToString). И если он задан явно, то получить его можно из registrymodifications.xcu с помощью вызова

GetRegistryKeyContent("org.openoffice.Office.Calc/Formula/Syntax/").getByName("SeparatorArg")

(это требует загрузки библиотеки Tools).
Проблема в том, что по умолчанию там пусто, и тогда начинаются волшебные вещи.

Во-первых, базовой настройкой по умолчанию является точка с запятой. Далее, если язык локали (не UI!) русский, так и остаётся. В противном случае считываются разделители из встроенных данных текущей локали (название локали можно было бы узнать с помощью GetStarOfficeLocale из библиотеки Tools). Проверяется десятичный разделитель (и альтернативный десятичный разделитель), и если первый - точка, либо первый - не запятая, а второй - точка, то разделитель списка параметров становится запятой. Если же первый - запятая, а второй - точка, то используется снова точка с запятой.

Затем если локаль - de_CH, снова восстанавливается точка с запятой. И в конце концов, если так случилось, что разделитель списка совпал с десятичным разделителем, и это не точка с запятой, то опять же восстанавливается точка с запятой.

Лично я из всего этого вынес одно: нужно писать свою функцию, в которой создавать виртуальную формульную ячейку, в неё записывать примитивную формулу в стандартном синтаксе (например, "=SUM(1;1)"), а затем считывать локализованную формулу для выдирания оттуда получившегося разделителя, и это уже использовать в макросе.

И кто придумал использовать локализованные вещи в API? Хотел бы я ему в глаза поглядеть.

Или есть уже что-то готовое для этого? @rami?
С уважением,
Михаил Каганский

kompilainenn

Цитата: mikekaganski от 11 апреля 2020, 12:47И кто придумал использовать локализованные вещи в API? Хотел бы я ему в глаза поглядеть.
немец, который начинал писать офис в лохматых 90х годах прошлого века?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

mikekaganski

Цитата: kompilainenn от 11 апреля 2020, 13:02
Цитата: mikekaganski от 11 апреля 2020, 12:47И кто придумал использовать локализованные вещи в API? Хотел бы я ему в глаза поглядеть.
немец, который начинал писать офис в лохматых 90х годах прошлого века?

Нет. Не в 90х :P В 80х.
С уважением,
Михаил Каганский

eeigor

Рад общению. Буду посмотреть. Я с библиотеками не сталкивался

Спасибо
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

rami

Цитата: mikekaganski от 11 апреля 2020, 12:47Или есть уже что-то готовое для этого? @rami?

Есть готовое ;D, вот:
Цитата: mikekaganski от 11 апреля 2020, 12:47Код:
GetRegistryKeyContent("org.openoffice.Office.Calc/Formula/Syntax/").getByName("SeparatorArg")

Осталось передать полученный параметр в переменную DELIMITER (в макросе UpdateChartRange), а константу DELIMITER убрать. (всего лишь добавить две строчки кода)

mikekaganski

Цитата: rami от 11 апреля 2020, 14:22
Цитата: mikekaganski от 11 апреля 2020, 12:47Или есть уже что-то готовое для этого? @rami?

Есть готовое ;D, вот:
Цитата: mikekaganski от 11 апреля 2020, 12:47Код:
GetRegistryKeyContent("org.openoffice.Office.Calc/Formula/Syntax/").getByName("SeparatorArg")

Осталось передать полученный параметр в переменную DELIMITER (в макросе UpdateChartRange), а константу DELIMITER убрать. (всего лишь добавить две строчки кода)

Хехе... по умолчанию там пусто. По крайней мере в некоторых конфигурациях.
С уважением,
Михаил Каганский

rami

Рассуждая логически, там пусто быть не может, иначе откуда берутся разделители? Я не смог обнаружить "пустоту". А в каких случаях пусто?

mikekaganski

Например, после сброса профиля.
С уважением,
Михаил Каганский

rami

Сбросил, запустил:
Sub Main
GlobalScope.BasicLibraries.LoadLibrary("Tools")
msgbox GetRegistryKeyContent("org.openoffice.Office.Calc/Formula/Syntax/").getByName("SeparatorArg")
End Sub

Всё равно показывает разделитель "точка с запятой" (LibreOffice 6.4.1.2).

А если после сброса открыть "Параметры", окошки настроек разделителей будут пустые? У меня есть разделители (;, ;, |)

mikekaganski

Нет, окошки будут заполнены. А настройка будет пустой - по крайней мере у меня в русской Win 10 и версии 6.4.3.1
С уважением,
Михаил Каганский

eeigor

#28
GetRegistryKeyContent("org.openoffice.Office.Calc/Formula/Syntax/").getByName("SeparatorArg")
У меня этот метод вернул мою точку с запятой. На другой машине проверю позже (отправил).
Я что могу менять этот параметр (скриншот ниже)?

Не сразу нашел окошко с разделителями в параметрах.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

С уважением,
Михаил Каганский