Помогите перевести

Автор Graveworm, 28 декабря 2011, 13:08

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

Graveworm

Помогите пожалуйста перевести для OO
Cells(6, 5) = Cells(2, 1)
Cells(6, 6) = Cells(6, 1)
Процедура или функция не определена пишет.

Рыбка Рио

#1
Думаю так:

Sub Main
Sheet = ThisComponent.CurrentController.ActiveSheet
Sheet.getCellByPosition(6,5).Formula = Sheet.getCellByPosition(2,1).Formula
Sheet.getCellByPosition(6,6).Formula = Sheet.getCellByPosition(6,1).Formula
'можно ещё так
'Sheet.getCellRangeByName("G6").Formula = Sheet.getCellRangeByName("B2").Formula
End Sub
ubuntu 12.04 + LibO3.6.0

JohnSUN

+1

При желании можно использовать не Formula, а String или Value. В зависимости от того, что хочется получить.

И не забыть, что в Excel (в VBA) эти параметры в скобках обозначают "строка-столбец", а в Calc'е (в StarBasic) - "колонка-строка". То есть, не забывать менять местами.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Graveworm

Спасибо, работает! А подскажите еще что прописать для копирования ячейки с одного листа на другой?

JohnSUN

Всего одной? Это скучно  ;D Давай сразу диапазонами копировать, а?
А если серьёзно - всё то же самое. Только Sheet будет разный.
Получить лист из документа можно через .getSheets().getByIndex(<номер листа>) (Внимание! Нумерация с нуля, не с единицы!)
И в присвоении просто указываются разные объекты-листы. Но этот способ очень (ОЧЕНЬ!) медленный. Поэтому если нужно копировать много, то пользуются другими способами...
Расскажи чуть больше про задачу - расскажем чуть больше про код  ;D
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Graveworm

да у меня задача очень простая: диапозон из 3 ячеек с одной страницы на другую скопировать при нажатии на кнопку:)

JohnSUN

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

Graveworm

в фиксированное место

JohnSUN

#8
"Ну, я так не играю..." (с) Карлсон
Для этого макрос не нужен. Просто знак равенства и адрес ячейки, из которой хочешь получить значение...

(Если мигает слишком быстро и ничего не понятно - кликни по картинке, там более медленная пошаговая версия есть)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Graveworm

no, no...
i want that when i pressed the form-button, information from a1, a2, a3 of sheet1 will be copied to a1, a2, a3 of sheet2.

JohnSUN

"Продолжаем разговор..." (с) Тот же Карлсон.
А до нажатия кнопки, что находится в a1, a2, a3 of sheet2? (Классный суржик у нас получается. Давай, наверное, вернемся к русскому, а? То что мультик был с "не нашими" комментариями - так я его просто изначально рисовал для "них").

Сам код очень простой.
То есть, сначала помним, что текущий документ, из которого запускается макрос, называется ThisComponent
Если это электронная книга, то у документа есть свойство Sheets (в VBA обзывается Worksheets - можно подумать, что бывают NotWorkSheets). Получить этот набор можно через .get
Так и пишем oSheets = ThisComponent.getSheets()
Из этого набора выдергиваем нужные нам листы - как ты написал, "sheet1" и "sheet2". Можем дернуть по абсолютному номеру, можем по имени. Для этих целей есть свои .get'ы
oSheet1 = oSheets.getByIndex(0)
oSheet2 = oSheets.getByName("sheet2")
Первый способ будет глючить, если какая-то шибко продвинутая умница поменяет порядок листов. Ну, зацепит ярлык мышкой и рукой дёрнет...
Второй способ взглюкнет, если та же самая умница переименует sheet2 в, например, "Отчет".
Ну, а нужные ячейки в этих листах мы получать уже умеем - getCellByPosition или getCellRangeByName. (см. ответ Клио)
А значения полученных ячеек можно рассматривать триедино - или как формулу, которая там записана, или как значение, которое там получилось, или как строку, которая там отображается. Соответственно, свойства Formula, Value или String. Можно обращаться к ним напрямую, можно через соответствующие .get/.set.
Надеюсь, этого достаточно, чтобы записать всё целиком... Если еще вопросы остались - спрашивай быстрее, пока не началось...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Рыбка Рио

Можно  так:

Sub Main
Doc = ThisComponent
Sheet1 = Doc.Sheets.getByName("Лист1")
Sheet2 = Doc.Sheets.getByName("Лист2")
Sheet2.getCellRangeByName("B2:B5").setDataArray(Sheet1.getCellRangeByName("A1:A4").DataArray)
End Sub


[вложение удалено Администратором]
ubuntu 12.04 + LibO3.6.0

Graveworm

Итого:
Sub Main
oSheets = ThisComponent.getSheets()
oSheet1 = oSheets.getByName("Sheet1")
oSheet2 = oSheets.getByName("Sheet2")
oSheet2.getCellRangeByName("A1").String = oSheet1.getCellRangeByName("B2").String
End Sub

Вроде бы все работает. Если что-то не дописал, поправить пожалуйста. Благодарю, Вы мне очень помогли  ;)

JohnSUN

Да нет, нечего поправлять - верно написано. Не хватает еще двух строчек для оставшихся ячеек (речь-то шла о трёх?).
Может быть само присвоение было бы честнее написать через set/get какoSheet2.getCellRangeByName("A1").setString(oSheet1.getCellRangeByName("B2").getString())Это на случай, если в какой-нибудь из следующих версий офиса закроют прямой доступ к свойствам.
И нужно предупредить, что такой способ перезаписи значений допустим только для небольшого количества ячеек: две-три, ну десять - еще терпимо. А если, скажем, в цикле перебирать тысячу-другую ячеек, то тормоза неизбежны. В таких случаях нужно использовать прием, который только что показал Клио - одним махом слизать все данные из целого диапазона (.getDataArray()) и точно так же, в полпинка, заслать все эти данные в новое место (.setDataArray()).
Для перемещения ячеек между листами есть еще куча быстрых и надежных способов. Через буфер обмена, например, с помощью диспетчера. Такой макрос вообще записывается через макрорекордер - выглядит ужасно, работает только в точно указанных ячейках, но ведь работает же... Или через .insertTransferable() и .getTransferable(). А еще у этого самого объекта Sheet есть метод .copyRange(<начиная с какой ячейки>,<какой диапазон ячеек вставить>).
Словом, возможностей масса... Но об этом уже в Новом году.

С наступающим вас всех!  :beer:
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне