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

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

15 Май 2021, 08:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Есть ли способ вернуть ошибку в ячейку с UDF?  (Прочитано 613 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Стартовое сообщение: 8 Апрель 2021, 22:13 »

Вот так это делается в Excel, чтобы, к примеру, отобразить в ячейке #ЗНAЧ! (#VALUE!):

Код:
Function UDF
    On Error GoTo Failed
    <...>

Failed:
    UDF = CVErr(xlErrValue)
Exit Function

Это будет ошибка, а не текст, имитирующий ошибку.

А в LO Calc? Обсуждение было здесь...

UPD:
Обходной путь весьма странный, чтобы вернуть "Err:502" в ячейку:
=MAKENUMBER(B3;C3)&IF(LEFT(CURRENT();1)=":";SQRT(-1);0)
Примечание. Ошибку вызывает SQRT(-1), если UDF - MAKENUMBER вернёт ":fail:".

Есть другие варианты?


* Снимок экрана от 2021-04-08 23-45-07.png (23.31 Кб, 732x198 - просмотрено 7 раз.)
« Последнее редактирование: 8 Апрель 2021, 23:46 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 404


WWW
« Ответ #1: 9 Апрель 2021, 10:37 »

Устанавливает в ячейке ошибочное значение #Н/Д:

Код:
ThisComponent.Sheets(0).getCellByPosition(0,0).setDataArray Array(Array(Empty))
Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Ответ #2: 9 Апрель 2021, 10:56 »

@sokol92, а если #VALUE! или в формате Err:502
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 404


WWW
« Ответ #3: 9 Апрель 2021, 13:00 »

Можно формулой:

Код:
ThisComponent.Sheets(0).getCellByPosition(0,0).formula="=SQRT(-1)"

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

Владимир.
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 080


« Ответ #4: 9 Апрель 2021, 19:20 »

Единственный способ, который я знаю, сделать это в пользовательской функции Basic - вернуть Array().

Интересно было бы попробовать поиграться с возвратом NaN - но тут нужен питон.
Записан

С уважением,
Михаил Каганский
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Ответ #5: 9 Апрель 2021, 19:36 »

mikekaganski, всегда рад услышать!
Я работаю над этой темой.
Затем можно избавиться от формулы, скопировав в буфер обмена и вставив как значение.
@sokol92, подскажите, как покороче скопировать/вставить ошибку, чтобы убрать "формулу". После этого в ячейке действительно оказывается ранее заданная ошибка. oCell.DataArray = oCell.DataArray => get/set замещает ошибку. Макрос ниже нет. Активна одна ячейка, работаем с ней.
Запись макроса
Код:
sub Main2
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$D$39"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(5) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Flags"
args3(0).Value = "SVD"
args3(1).Name = "FormulaCommand"
args3(1).Value = 0
args3(2).Name = "SkipEmptyCells"
args3(2).Value = false
args3(3).Name = "Transpose"
args3(3).Value = false
args3(4).Name = "AsLink"
args3(4).Value = false
args3(5).Name = "MoveMode"
args3(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())
end sub

UPD:
Ошибку #VALUE! даёт, к примеру, формула: =SIGN(".")
С неё и началась эта тема...


* Снимок экрана от 2021-04-09 19-36-51.png (11.88 Кб, 684x50 - просмотрено 6 раз.)
« Последнее редактирование: 9 Апрель 2021, 20:02 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 404


WWW
« Ответ #6: 9 Апрель 2021, 19:54 »

Специальную вставку еще в UNO не перенесли, как и копирование диапазона ячеек.
Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Ответ #7: 9 Апрель 2021, 20:00 »

Однако, странно: почему простое копирование (как у меня выше) замещает результат ошибки, а копирование/вставка диспетчером - нет?

UPD:
Вот так покороче будет.
Код:
' Copies and pastes data into the selection.
Sub CopyPasteData
Dim document As Object, dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args(0) As New com.sun.star.beans.PropertyValue
args(0).Name = "Flags"
args(0).Value = "SVD"
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args())
End Sub

И как подавить вывод стандартного сообщения перед вставкой данных?

UPD: Исправлена ошибка в коде.


* Снимок экрана от 2021-04-09 20-36-11.png (21.27 Кб, 757x181 - просмотрено 6 раз.)
« Последнее редактирование: 9 Апрель 2021, 21:44 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 404


WWW
« Ответ #8: 9 Апрель 2021, 20:41 »

Записал в ячейке D39 формулу
=1/0

Выполнил макрос из #5 - формула заменилась на ошибочное значение.
Проверил на Win10 и Ubuntu.

Upd. Уберите "птичку" в сообщении и больше Вы это сообщение не увидите. На самом деле, это регулируется параметром Calc Общие/Показывать предупреждение о перезаписи данных при вставке.
« Последнее редактирование: 9 Апрель 2021, 20:51 от sokol92 » Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Ответ #9: 9 Апрель 2021, 21:27 »

Спасибо.
Наверное, пока так: другого не придумали. Но мне в UDF нужна только одна ошибка - это ошибка при возвращении результата.
Как уже говорил: ошибку #VALUE! даёт, к примеру, формула: =SIGN("."), которая ожидает число.
Можно остановиться...
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 550



« Ответ #10: 9 Апрель 2021, 21:43 »

В чём разница? Работает и без параметров.

'   Dim args(0) As New com.sun.star.beans.PropertyValue
'   args(0).Name = "Flags"
'   args(0).Value = "SVD"
'   dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args())

   dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

UPD1:
Я ошибся: работает именно вариант #5 (#7) с .uno:InsertContents.
UPD2: Или вот так
   dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
   dispatcher.executeDispatch(document, ".uno:PasteOnlyValue", "", 0, Array())
« Последнее редактирование: 9 Апрель 2021, 23:24 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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