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

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

26 Октябрь 2020, 12:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Пользовательские функции CALC вида =MYFUNCTION(B4)  (Прочитано 6987 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Стартовое сообщение: 18 Февраль 2013, 12:11 »

С появлением все более полной поддержки VBA (LibreOffice 4.0) стало возможным задавать в качестве аргумента пользовательской функции в CALC адрес ячейки, т.е. функции вида =MYFUNCTION(B4).
Для этого нужно просто добавить в начало модуля с определением этих функций строку
Option VBAsupport 1

Код:
REM  *****  BASIC  *****
Option VBAsupport 1

Function faddr(rn As Range) As Variant
faddr=rn.Address
End Function

Function addrtxt(rv)
addrtxt=rv.Text
End Function

Function addrv(rav As Range) As Variant
addrv=rav.Value
End Function

Теперь можно вставлять эти функции в ячейки таблицы и они работают.

Но!
Если закрыть документ с сохранением и затем снова открыть, то эти функции уже не работают!!!
(Опять разработчики что-то не допилили.)

Очень "корявым" способом эту проблему можно обойти.

Вставляем "фиктивную функцию", хотя бы такую
Код:
''' Фиктивная функция '''
Function fiction()
fiction=""
End Function
Закрываем документ.
Открываем документ - функции не работают.
Входим в редактор Basic.
Просто меняем название фиктивной функции, например, "fiction" на "fictionx".
Закрываем редактор Basic.
Нажимаем на листе с функциями F9 - функции работают!!!

Пример прилагаю.
Может быть кто-то найдет более изящный способ заставить эти функции работать.

PS. Без переименования фиктивной функции нажатие F9 ничего не дает.


[вложение удалено Администратором]
Записан
ALexey7ov
Участник
**
Offline Offline

Пол: Мужской
Расположение: г.Мелеуз
Сообщений: 17



WWW
« Ответ #1: 27 Март 2013, 07:56 »

Да, поведение не такое, какое ожидалось бы по логике. Улыбка Какой то косяк именно с VBAsupport, когда его отключаешь, функции начинают пересчитываться, не правильно, т.к. код VBA без его самого поддержки, но начинают. При вообще любом изменении в коде с VBASupport 1, даже добавления в комментарий одного символа, либо добавлении пробела перед или после знака равенства, функции на листе пересчитываются правильно.
Но немного подумав, я нашёл решение, хотя сам его до конца и не понял. В общем, вот то, что я понял: когда документ с внедрённой в него библиотекой Standard с модулем, содержащим необходимые функции, хоть в модуле и указано поддерживать VBA, но что то не так происходит. В свойствах самой внедренной библиотеки почему то VBACompatibilityMode стоит false. И вот после того, как я изменил его на true, нажав на F9 (пересчет ячеек) функции с VBASupport пошли. Может это и совпадение, но благодаря ему нужная цель достигаема. Поэтому, во внедренную библиотеку добавил ещё один модуль с макросом, который поставил в свойствах электронной таблицы выполняться при её открытии. Ваш пример, дополненный моим модулем прилагаю.

[вложение удалено Администратором]
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #2: 27 Март 2013, 10:51 »

Это хорошо.
И вот пример, работающий уже без этого макроса (в LO4).

Интересно, что структура библиотеки Standard поменялась - стала как в MSO (сравните).



[вложение удалено Администратором]
Записан
economist
Форумчанин
***
Offline Offline

Сообщений: 1 292


« Ответ #3: 2 Июнь 2016, 09:29 »

Что интересно, теперь можно реализовать кириллические аналоги самых популярных EXCEL-функций: СУММ, СУММЕСЛИ, ВПР, ЕСЛИ итп. Эти функции в народе используются так часто, что другие встречаются только в 5%.

Когда я 7 лет назад "разово", за выходной, перевел 250 человек на Calc - вопли, стоны и "попоболь" были исключительно из-за этого, и мне возможностей русификации функций  очень не хватало. Вот стабильно работающий пример для LibreOffice (после разового выполнения при старте
ThisComponent.BasicLibraries.VBACompatibilityMode=true 


Option VBASupport 1
Option Compatible
'-----------------------------------------------
Function СУММ(a as range) as double ' почти аналог SUM()
For each n in a
   s = s + n.value
Next n
СУММ=s
End Function
 

В свежих OpenOffice (4.1.2) - не работает.
В LibreOffice (Windows) - значение в настройках флажка "Использовать английские имена функций" ни на что не влияет.   
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Yakov
Администратор
**
Offline Offline

Сообщений: 2 547


WWW
« Ответ #4: 3 Июнь 2016, 22:26 »

А будут такие функции совместимы с Excel? Думаю, что не будут совместимы.
Записан

economist
Форумчанин
***
Offline Offline

Сообщений: 1 292


« Ответ #5: 6 Июнь 2016, 14:05 »

При сохранении в XLS-формате - код из поста #3 (см. выше) - вообще исчезает, независимо от флажков настроек в Сервис - Параметры - Загрузка/Сохра... - Свойства VBA.

Так что использовать можно только в формате ODS.
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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