Ошибка #МАКРОС? при отображение результата формулы

Автор Aleksandr H., 6 сентября 2016, 10:42

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

Aleksandr H.

в результате работы кода
oSheet.GetCellByPosition(3,oRowCount).formula = "=ceiling(sumif(S$1:S$" & oRowCount & ";""" & "1" & """;D$1:D$" & oRowCount & ")/90*1.3;10;1)"
oSheet.GetCellByPosition(3, oRowCount).NumberFormat = 1

в ячейке Dx получаю значение "#МАКРОС?"
Если нажать "Помощник по функциям" то в окне результат отображается нормально.


В чем может быть проблема?

rami

Вы наверно оформили этот код как функцию? В открываемом документе функции выполняются раньше, чем загружается библиотека макросов.

economist

И пользовательские функции не работают в OpenOffice Calc. А в LibreOffice - работают.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

rami

Цитата: rami от  6 сентября 2016, 11:19
Вы наверно оформили этот код как функцию? В открываемом документе функции выполняются раньше, чем загружается библиотека макросов.
Не угадал с первой попытки :(

Вторая попытка: назначаете макрос на открытие документа?

Aleksandr H.

LibreOffice 5.0.6.3

это не UDF!

есть у меня макрос Upakowanie , который запускается с листа "Упак38", и делает разделение целого на составные части. Например: изделие 021 выпустили 1440 шт с разбитием посменно (см. скрин верхняя часть)
и теперь это изделие надо спаковать в разные модели (090N (468 шт), 090 (432 шт), 6185(540 шт)). Макрос разделит на нужное количество. (см. скрин нижняя часть. строки 18-21).

Вот в конце работы макроса и вставляется формула.


economist

Почему бы не пересчитать нужное в самом коде, тем более что функции ceiling и sumif легко реализуются перебором ячеек в цикле? Обратите внимание на несвежий LibreOffice. Я после линейки 5.0. забраковал многие ранее работавшие методы.

Видимо у вас циклическа ссылка, только они могут давать такие непонятки.
Вот этот код работает (+ см. файл)


Sub Main
oSheet=ThisComponent.Sheets.getByName("Лист1")
oRowCount=5
oSheet.GetCellByPosition(3, oRowCount-4).formula = "=ceiling(sumif(E$2:E$" & oRowCount & ";""" & "1" & """;D$2:D$" & oRowCount & ")/90*1.3;10;1)"
oSheet.GetCellByPosition(3, oRowCount-4).NumberFormat = 1
End Sub
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Aleksandr H.

Цитата: economist от  6 сентября 2016, 08:48Обратите внимание на несвежий LibreOffice.
Имел проблемы с новыми сборками

oSheet.GetCellByPosition(3,oRowCount).formula = "=ceiling(sumif(S$1:S$" & oRowCount & ";""" & "1" & """;D$1:D$" & oRowCount & ")/90*1.3;10;1)"
зациклить можно только при использования oRowCount. Но как? В GetCellPosition как строку назначения получу oRowCount+1 строку(считаем с 1), а в формуле будет строка №oRowCount.





rami

Цитата: Aleksandr H. от  6 сентября 2016, 10:08Вот в конце работы макроса и вставляется формула.
И причём совершенно без проблем.

Пробовал на LibreOffice 5.0.6 и LibreOffice 4.4.7 и Apache OpenOffice 4.1.1. Ни разу не выскочил #МАКРОС?.

economist

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

rami

Цитата: economist от  6 сентября 2016, 11:27Если был бы весь код - можно было бы понять где возникает ошибка.
Если что-то не видите, то оно вам не нужно... ;D (документ в четвёртом ответе)

economist

Пошел, умылся кружечкой кофе. Попробовал - макрос отработал за 2 минуты, ошибок вообще никаких нет.
LO 5204 Portable с Portableapps.com. Использую его в продакшене, видимо сборщики игнорят какие-то минорные релизы, или у них чутье - еще не было такого, чтобы получалось совсем нерабочее Portable-решение.
Могу посоветовать попробовать его, благо что он ничего не испортит.   

И еще грустно немного стало: на VBA код был бы в 4 раза компактнее и понятнее.
Если задумываете переписывать, в верх модуля надо добавить и выполнить один раз Startonce - после этого даже пользовательские UDF  и что-то вида Apllication.Clean начинают работать. Причем можно гонять смесь Starbasic+VBA.


Option VBASupport 1
Option Compatible
'-----------------------------------------------
Sub Startonce
ThisComponent.BasicLibraries.VBACompatibilityMode=true 
End sub

Sub Upakowka
'
End sub

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