BUG: Sheets.removeByName() [Решено]

Автор eeigor, 7 марта 2020, 12:49

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

eeigor

OS: Linux Ubuntu 18.04 LTS
LO: 6.4.0.3

Что бы это значило и как обойти?
При вызове метода <ThisComponent.Sheets.removeByName(aName)> процедура скоропалительно завершается (без ошибки), как если бы на пути стоял оператор <End> (стек вызовов очищается).
<Xray ThisComponent.Sheets> говорит, что есть такой метод в объекте <com.sun.star.sheet.XSpreadsheets>, а API Reference (6.0) по поиску "removeByName" выдает следующие sheet-интерфейсы:
XDatabaseRanges
XDataPilotTables
XNamedRanges
XScenarios

Мы, вообще, как листы удаляем? Впрочем, лист удаляется нормально, только дальше дело нейдЁт.

Метод <ThisComponent.Sheets.insertNewByName(aName)>, например, вставляет пустой лист как положено.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Ну, я хотел управлять именем копируемого листа, для чего надо было предложить пользователю удалить имеющийся лист с таким же именем, чтобы они не множились.
Не получилось.
Пока поставил "заплатку": методом <ThisComponent.Sheets.copyByName(sName, sCopy, nDestination)> копирую лист, передавая в качестве имени копии пустую строку (sCopy:="").
Ошибку игнорирую, лист создаётся с именем по умолчанию (к имени исходного листа прибавляется очередной номер после символа "_").
Ненужные листы удаляются потом пользователем вручную.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

mikekaganski

Нужно больше информации.

Попробовал я с таким кодом:

Sub DelSheet
  ThisComponent.Sheets.removeByName("Sheet2")
  MsgBox "OK"
End Sub


В книге два листа, один с таким именем. Отрабатывает прекрасно, и строку с MsgBox отрабатывает. И с мастером, и с Version: 6.4.2.1 (x64)
Build ID: c92dba0b4728c0ec26c4b83e2c0fbf3284425375
CPU threads: 12; OS: Windows 10.0 Build 18363; UI render: GL; VCL: win;
Locale: ru-RU (ru_RU); UI-Language: en-US
Calc: CL

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

eeigor

#3
Подробностей (видимых) нет. То, что у Вас осуществляется переход к следующей строке, говорит о том, что моя проблема частная.
Я сейчас не готов переустанавливать офис. Но буду иметь в виду. Отпишусь позднее.
Спасибо.

P.S. Воссоздал Ваш пример. Хм... Всё работает, и сообщение появляется. Но видимых ошибок нет. Буду разбираться.
P.P.S. И так, и так пробовал... Иногда (редко) удаляет, но, в основном, нет.
Локализовать ошибку не удаётся. В общем, имейте в виду.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Цитата: eeigor от  7 марта 2020, 16:47В общем, имейте в виду.
что именно иметь ввиду? Нужен конкретный пример кода и файл, где не работает это код
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

#5
Это конкретный баг версии/среды (?).
Удалось локализовать ошибку:
если удаляемый лист последний, то после вызова метода <removeByName> происходит удаление, и управление передаётся в программу обратно, а если лист не последний - удаление происходит, но процедура завершается (стек вызовов очищается). Ошибки не происходит.

Поэтому перед удаление надо обеспечить положение этого листа последним в коллекции:
With ThisComponent.Sheets.
   .moveByName("Имя_листа", .Count)
   .removeByName("Имя_листа")
End With
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Цитата: eeigor от  8 марта 2020, 21:06
Это конкретный баг версии/среды (?)
установите более раннюю версию Либры и проверьте пожалуйста
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут