Calc: ArrayFormulaLocal ?

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

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

eeigor

Есть у диапазона свойства:

Formula  'формулы по-английски, разделитель списка параметров - запятая  (или нет?)
FormulaLocal  'формулы по-русски, разделитель списка параметров - точка с запятой

ArrayFormula  'формулы по-английски, разделитель списка параметров - точка с запятой

У меня на разных машинах - разные версии: на линуксе - локализованная, на маке - оргигинальная.
Работаю на линуксе. Вот не пробовал, но думаю, что мой файл не пойдёт на маке в оригинальной версии из-за разделителя.

Вероятно, из соображений аналогии, должно существовать свойство, указанное в теме сообщения.
А из соображений синтаксиса точку с запятой следует заменить на запятую. Не думаю, что формулы массива в коде сильно распространены у русскоязычных пользователей. Поправят.

И вы меня поправьте, если я не прав.
Во всяком случае в Excel - это не так, как здесь...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от 21 марта 2020, 13:51Formula  'формулы по-английски, разделитель списка параметров - запятая  (или нет?)
Или нет. Это "каноническое" представление формулы, независимое от локали. Разделитель - точка с запятой. И нужно пользоваться именно этим свойством (и ArrayFormula), если только не взаимодействуете с пользовательским вводом.
С уважением,
Михаил Каганский

eeigor

#2
Спасибо. Просто в Excel разделитель – запятая, а текст формулы уже на листе в локализованной версии транслируется в вариант по-русски и с точкой с запятой.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#3
Цитата: eeigor от 21 марта 2020, 16:30Разделитель - точка с запятой.
Столкнулся с разделителями...
oChart.EmbeddedObject.UsedRangeRepresentations

Хоть и свойство другое, но суть вопроса та же.
У меня в локализованной версии свойство UsedRangeRepresentations использует в качестве разделителя точку с запятой ";", но в оригинальной версии на Mac'е это же свойство использует запятую ",".
Ну, вот неправильно это!.. Везде должна быть запятая.

По крайней мере, подскажите, как узнать тип разделителя и подставить нужный самостоятельно?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от  9 апреля 2020, 23:53но в оригинальной версии на Mac'е
Что такое "оригинальная версия"? (кмк, Вы полагаете, что если она переведённая - то она "неоригинальная?")

И отсюда
Цитата: eeigor от  9 апреля 2020, 23:53Везде должна быть запятая
Да нет, вероятнее всего, везде должна быть именно точка с запятой. Но это лирика, а фактически Вы не предоставили ни файла-примера, ни хотя бы строк, которые Вы видите. Я, например, в примитивной диаграмме вижу только четыре строки безо всяких запятых:

"$Sheet1.$A$5"
"$Sheet1.$A$6:$A$9"
"$Sheet1.$B$5"
"$Sheet1.$B$6:$B$9"


так что я даже не представляю, о каких там говорится разделителях.
С уважением,
Михаил Каганский

eeigor

#5
Так ведь "UsedRangeRepresentations"!
У меня вот так:
oChart.Ranges = oXYAddresses()

Просто диапазонов может быть несколько. Но речь только о разных разделителях в разных версиях Calc'а. Они действительно разные.
Так как его, разделитель, считать из системных настроек?

Для примера (UsedRangeRepresentation):
"$'Анализ данных'.$C$2;$'Анализ данных'.$C$4:$C$5;$'Анализ данных'.$C$27"
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Цитата: eeigor от 10 апреля 2020, 00:26
Так ведь "UsedRangeRepresentations"!
У меня вот так:
oChart.Ranges = oXYAddresses()

Просто диапазонов может быть несколько. Но речь только о разных разделителях в разных версиях Calc'а. Они действительно разные.
Так как его, разделитель, считать из системных настроек?

Это было что? ответ на что? и что это вот должно было кому сообщить? Это пример документа с диаграммой? или пример строк, которые возвращает метод? да и вообще какой теперь метод обсуждается? UsedRangeRepresentations или Ranges? и при чём тут нечто с названием "oXYAddresses"?

Цитата: eeigor от 10 апреля 2020, 00:26Для примера (UsedRangeRepresentation):

Ох. Или теперь уже без завершающей s?
С уважением,
Михаил Каганский

eeigor

В Ranges присваивается массив диапазонов точек (x, y), а UsedRangeRepresentations(0) возвращает диапазоны только координат X, и UsedRangeRepresentations(1) - для Y.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: eeigor от 10 апреля 2020, 00:26"$'Анализ данных'.$C$2;$'Анализ данных'.$C$4:$C$5;$'Анализ данных'.$C$27"
На Mac'е в английской версии вместо точки с запятой будет запятая. Вот только в этом вопрос.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Вот как выглядел бы мой вопрос:

"В приложенном примере есть простая диаграмма и макрос, который выводит сообщения со строками из свойства UsedRangeRepresentations этой диаграммы. Моя проблема в том, что я никак не могу найти там ни одной запятой, хотя в ответе #3 говорится, что они там водятся. Помогите, как мне изменить диаграмму или код, чтобы получить там запятые или точки с запятой!"
С уважением,
Михаил Каганский

eeigor

Просто я пишу с телефона.
Макрос действительно выводит сообщения со строками из свойства UsedRangeRepresentations диаграммы.
Всё работает. Диапазонов много (из-за разрывов – исключенных точек). Однако для наглядности и визуального контроля дополнительно выводится строка с включёнными диапазонами из вышеуказанного свойства. Для сокращения текста и повышения читабельности из этой строки удаляются ссылки на имя листа, знаки $ (абсолютной адресации) и после РАЗДЕЛИТЕЛЯ СПИСКА вставляется ПРОБЕЛ. Но когда я передаю приложение другому пользователю, возникает проблема с разделителем. Поэтому надо изменить значение константы DELIMITER (= ","). Вот я и спросил: как избавиться от этого шага, и решить проблему с разными разделителями.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Как мне получить значение системного разделителя?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Послушайте, eeigor, это уже слишком.

Попробую перевести то, что я понял из Вашего "объяснения", на русский:

Цитата: eeigor от  9 апреля 2020, 23:53
Задам-ка я вопрос про разделители, и начну его с того, что упомяну свойство, в котором этих разделителей вообще нет. Пусть все погадают, зачем я это свойство сюда засунул, вот смеху-то! Итак, вот оно:
oChart.EmbeddedObject.UsedRangeRepresentations

А теперь я ещё больше всех запутаю: напишу, как будто эти самые разделители в этом свойстве таки есть:
У меня в локализованной версии свойство UsedRangeRepresentations использует в качестве разделителя точку с запятой ";", но в оригинальной версии на Mac'е это же свойство использует запятую ",".
Ну, вот неправильно это!.. Везде должна быть запятая.

И теперь задам собственно вопрос.
По крайней мере, подскажите, как узнать тип разделителя и подставить нужный самостоятельно?

Цитата: eeigor от 10 апреля 2020, 00:26
Так, меня попросили представить пример файла или данных. Почему не поиграть в загадки дальше! Пусть попытаются отгадать, зачем я выделяю красным окончание множественного числа в этом свойстве!
Так ведь "UsedRangeRepresentations"!
Ну, продолжим-с. Добавим в микс нечто неожиданное: упоминание свойства "Range" (неизвестного интерфейса: в отличие от UsedRangeRepresentations, они даже не смогут понять, о чём идёт речь, потому что свойство это есть у множества объектов в модели ООо/ЛО, да и тип его различный... и присвоим ему значение неопределённой функцией. Пусть оно выглядит абсолютно чужеродно и не связано с предыдущим текстом - так загадочнее!)
У меня вот так:
oChart.Ranges = oXYAddresses()

Но шутки шутками, а мне, похоже, до сих пор не ответили на мой такой загадочный вопрос. Что они, совсем непонятливые, что ли? Ну и что, что я не задал его внятно. Я считаю, что они должны уже были всё понять и ответить (независимо от того, что разделителей на самом деле несколько: разделитель аргументов функций в Calc, разделители столбцов и строк в инлайновых массивах Calc... я могу не знать всего этого, но я всё равно не считаю, что я должен прикладывать какие-то усилия, чтобы формулировать задачу внятно).
Просто диапазонов может быть несколько. Но речь только о разных разделителях в разных версиях Calc'а. Они действительно разные.
Так как его, разделитель, считать из системных настроек?

А, да! Всё же давай-ка я отредактирую и приведу вариант строки. Правда, они всё равно не догадаются, откуда эта строка взялась. Заодно приведу название свойства немного "подредактированным", чтоб увлекательность сохранить:
Для примера (UsedRangeRepresentation):
"$'Анализ данных'.$C$2;$'Анализ данных'.$C$4:$C$5;$'Анализ данных'.$C$27"

Цитата: eeigor от 10 апреля 2020, 00:42
Так, он всё равно не понимает. Да и как он может понять, дитё неразумное. Напишу-ка я "объяснение", которое никак не прояснит, при чём тут разделители, о которых собственно вопрос, и как связаны между собой эти свойства: ведь из того, что я напишу ниже, связь никак не следует. Зачем указывать, например, какой вообще объект имеется ввиду (каким кодом он получен) - так можно будет догадаться, что ожидает программа в этом свойстве, и было бы слишком просто!
В Ranges присваивается массив диапазонов точек (x, y), а UsedRangeRepresentations(0) возвращает диапазоны только координат X, и UsedRangeRepresentations(1) - для Y.

Цитата: eeigor от 10 апреля 2020, 00:44
Повторюсь для тупых. Он, наверное, всё ещё не понял, что там запятая меняется на точку с запятой в зависимости от ... чего-то (я же не говорю даже, как эта точка с запятой там появилась, и куда она потом идёт. Я думаю, что мой вопрос простой, несмотря на игру в шарады; моё незнание того, что и разделителей несколько, и зависеть они могут от разного, не извиняет глупости отвечающего, который до сих пор не воспользовался ясновидением, чтобы понять наконец что мне нужно!)
Цитата: eeigor от 10 апреля 2020, 00:26"$'Анализ данных'.$C$2;$'Анализ данных'.$C$4:$C$5;$'Анализ данных'.$C$27"
На Mac'е в английской версии вместо точки с запятой будет запятая. Вот только в этом вопрос.

Цитата: eeigor от 10 апреля 2020, 08:46
А теперь я приведу этот вот убийственный аргумент, который звучал как-то уже несколько месяцев назад. Дело в том, что у меня есть какие-то невнятные проблемы - я пишу на какой-то ультрабезопасной системе, не подключённой к интернету, а задаю вопросы с телефона. И это извиняет весь тот бред, который я пишу, и моё неумение задавать вопросы, и нежелание приготовить тестовые примеры, скажем, дома или у друга (где есть интернет), и вообще пусть мои проблемы станут вашими проблемами!
Просто я пишу с телефона.
Макрос действительно выводит сообщения со строками из свойства UsedRangeRepresentations диаграммы.
И вот он, час X! Открою, наконец, что "разделители" были не связаны изначально с UsedRangeRepresentations, и я, кажется, добавляю их сам ... для чего? Напишу, что "для наглядности и визуального контроля". Опять напишу "с включёнными диапазонами из вышеуказанного свойства" (нет, я не умею писать "с включёнными диапазонами из свойства X": ведь "вышеуказанное" звучит круто и загадочно, а указать конкретно, пусть и с повторами, было бы слишком точно, что для программиста - страшный грех!).
Всё работает. Диапазонов много (из-за разрывов – исключенных точек). Однако для наглядности и визуального контроля дополнительно выводится строка с включёнными диапазонами из вышеуказанного свойства. Для сокращения текста и повышения читабельности из этой строки удаляются ссылки на имя листа, знаки $ (абсолютной адресации) и после РАЗДЕЛИТЕЛЯ СПИСКА вставляется ПРОБЕЛ.
Ну а теперь, когда я создал впечатление, что строка эта с разделителями нужна число визуально, как упомянуто, "для наглядности и визуального контроля", снова поставлю всех в тупик: оказывается, не всё так просто (ну, казалось бы, какая разница в визуальном контроле: запятая или точка с запятой? ан нет, "возникает проблема". Какая проблема, спросите вы? нееее, я не такой простачок, чтобы внятно писать "создаю строку конкатенацией строк из массива UsedRangeRepresentations объекта Z разделителем Y; записываю полученную строку в свойство K объекта M; на системе с локалью A и языком B это работает, а если локаль C и язык интерфейса D - выдаёт ошибку "..."." Просто напишу "проблема с разделителем". И код макроса целиком - это слишком жирно (я с телефона, не помните, что ли???))
Но когда я передаю приложение другому пользователю, возникает проблема с разделителем. Поэтому надо изменить значение константы DELIMITER (= ","). Вот я и спросил: как избавиться от этого шага, и решить проблему с разными разделителями.

Короче, я признаюсь: я слишком глуп, чтобы играть в весёлую игру, предложенную уважаемым eeigor. Но если бы моя восьмилетняя дочь выражала свои мысли подобным образом, я серьёзно задумался бы о необходимости нанять репетитора.
С уважением,
Михаил Каганский

eeigor

#13
Смело... но не умно. Зато умнó. А избыточная информация вредна, и пример здесь не нужен. Но вот умение абстрагироваться от ненужных деталей – весьма кстати.

LO Calc позволяет считать значение свойства ниже:
oChart.EmbeddedObject.UsedRangeRepresentations

Там ничего интересного нет: просто перечислены адреса диапазонов... через разделитель списка.
У меня в русифицированной версии – это точка с запятой, а у соседа в англоязычной (я её называю «оригинальной») – ЗАПЯТАЯ.

Как узнать, что будет использовать LO Calc в качестве разделителя списка? Вот и весь вопрос. Требования примера выглядят маниакальными. Как и желание узнать/угадать, зачем мне это нужно.
В общем, поговорили...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Хорошо. Объясняю для тех, кто знает, что другим нужно для ответа.

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

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

Но есть люди, которые знают точно, что именно нужно другим, чтобы ответить. Я очень рад за этих людей и за их умение абстрагироваться от лишних деталей.
С уважением,
Михаил Каганский