Пользовательские функции CALC вида =MYFUNCTION(B4)

Автор Hasim, 18 февраля 2013, 13:11

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

Hasim

С появлением все более полной поддержки 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

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

[вложение удалено Администратором]

Hasim

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

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



[вложение удалено Администратором]

economist

Что интересно, теперь можно реализовать кириллические аналоги самых популярных 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

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

economist

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

Так что использовать можно только в формате ODS.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...