CALC Ответьте пожалуйста

Автор And589, 14 декабря 2011, 05:49

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

JohnSUN

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

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

And589

JohnSUN

Спасибо за ответы и файлы. В последнем файле во второй добавленной функции после строчки If not oNamedRanges.hasByName(varName) Then oNamedRanges.addNewByName(varName, _
Пишет ошибку

Ошибка времени выполнения BASIC
Вызвано исключение
Type:com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection call!


Поставил перед строчкой On Error Resume Next. Ошибки нет, но цвета в поле при выборе не изменяются, заливка только красным цветом.

JohnSUN

Как говорят герои американских боевиков - "Срань Господня!.." "Oh! Worksheet..."
Я опять забыл проверить работу кода в ООо... Понимаешь, как-то очень быстро привык к LibreOffice, всё делаю в нём. И постоянно забываю, что ООо кое-чего не умеет, не знает, не хочет.
Напомни, ты в каком из офисов эксперименты ставишь?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

And589

#18
ЦитироватьНапомни, ты в каком из офисов эксперименты ставишь?
Установлен Openoffice 3.3.0, при переносе макроса полностью из твоего файла в новый документ без макросов, появляется это сообщение. Включение макроса установлено при открытии документа. В твоем документе ячейки изменяют цвет, но не изменяют при переносе макроса в другой документ без макросов, в таком же формате и с названием листов Лист1, Лист2, Лист3 с включением макроса при открытии документа.

Наверно, спрашиваю больше, чем обычно отвечают на форуме, но чтобы больше не спрашивать, если возможно еще добавить
а) Изменение цвета не через 5, а фиксировано - например сначала 4, потом 5, потом 6 или, например, 3, т.е. по выбору в переменных макроса.
б) После того, как заливка убрана, обрамление ячейки того цвета, какого была закрашена ячейка до удаления заливки.

JohnSUN

Друг мой, я же просил прикладывать проблемные файлы прямо к сообщению.
В данном случае, конечно, проблема обходится просто: нажми Ctrl+F3, введи имя cntClick (или как она там должна называться) и какое-нибудь значение.
Ошибка связана с СОЗДАНИЕМ именованного диапазона. Значит, чтобы избавиться от ошибки, нужно просто его создать.

а) Если сможешь разобраться с уже имеющимися тремя вариантами, то и с такой задачкой легко справишься. В воскресенье вечером как-то неохота задумываться над этим. Извини.
б) Ну, это тоже несложно. Но, наверное, не сегодня, ладно?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

neft

#20
Цитата: JohnSUN от 18 декабря 2011, 14:34Ошибка связана с СОЗДАНИЕМ именованного диапазона. Значит, чтобы избавиться от ошибки, нужно просто его создать.
А почему он сам не создается?

И нужен ли он?

JohnSUN

Ох, neft... Почему-почему... Да потому, что каждая последняя ошибка в программе всегда только предпоследняя.
Третьим параметром в методе "добавь новый диапазон по имени" идет структура "адрес ячейки". А я написал "ячейка живьем". Просто не дописал .getCellAddress().

А нужен ли? Может, и не нужен. Способов сохранить значение какой-нибудь глобальной статической переменной - масса. Именно этот мне нравится за относительную надежность и относительно короткий код.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

neft

Чтобы не возникало ошибок, нужно
If not oNamedRanges.hasByName(varName) Then oNamedRanges.addNewByName(varName, _
"-1",ThisComponent.getCurrentSelection().getCellByPosition(0, 0),0)

заменить на
If not oNamedRanges.hasByName(varName) Then oNamedRanges.addNewByName(varName, _
"$Лист3.$A$1", createUNOStruct("com.sun.star.table.CellAddress"), 0)

JohnSUN

Ну да... Я же и говорю - только предпоследняя... Не "$Лист3.$A$1", а "-1".
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

neft

#24
В учебных целях надо бы расписать эту строчку подробно
Dim oDoc, oSheet, oCell, oCellAddr As Object

oDoc=ThisComponent
oSheet=oDoc.Sheets.getByName("Лист1")
oCell=oSheet.getCellRangeByName("D8")
oCellAddr=oCell.CellAddress

If not oNamedRanges.hasByName(varName) Then oNamedRanges.addNewByName(varName, "-1", oCellAddr, 0)

Рыбка Рио

#25
[OFF]Кстати,
Цитата: neft от 18 декабря 2011, 21:36Dim oDoc, oSheet, oCell, oCellAddr As Object
Эта запись эквивалентна Dim oDoc As Variant, oSheet As Variant, oCell As Variant, oCellAddr As Object.REM  *****  BASIC  *****

Sub Main
Dim i,j As Object
msgbox TypeName(i) 'http://opengrok.libreoffice.org/xref/core/basic/source/runtime/rtlproto.hxx
msgbox TypeName(j)
End Sub


А ещё, On Error Resume Next носит глобальный характер, поэтому эту строчку нужно писать один раз вначале процедуры. Эта строчка означает переход к следующей строке как ни в чем не бывало, если случилась ошибка.
ubuntu 12.04 + LibO3.6.0

neft

Лень было расписывать, хотя надо было бы
Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim oCellAddr As Object

neft

Кстати,
Dim i
i - Variant (Empty), потому что пока не определен.
Sub Main
Dim oDoc
msgbox TypeName(oDoc)
oDoc=ThisComponent
msgbox TypeName(oDoc)
End Sub

Рыбка Рио

Цитата: neft от 19 декабря 2011, 10:54хотя надо было бы
Код:

Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim oCellAddr As Object
Либо
Dim oDoc As Object, oSheet As Object, oCell As Object, oCellAddr As Object

Цитата: neft от 19 декабря 2011, 11:18Кстати,
Dim i
i - Variant (Empty), потому что пока не определен.
Ага. Можно и так написать:
Dim oDoc, oSheet, oCell, oCellAddr
ubuntu 12.04 + LibO3.6.0

And589

Первое изменил, цвета разные, но второе, чтобы обрамление после заливки было цвета заливки, получилось только чтобы все обрамление получалось одним цветом последней заливки