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

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

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

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Помогите перевести  (Прочитано 8071 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Graveworm
Участник
**
Offline Offline

Сообщений: 12


« Стартовое сообщение: 28 Декабрь 2011, 12:08 »

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

Сообщений: 1 678


« Ответ #1: 28 Декабрь 2011, 12:26 »

Думаю так:

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
« Последнее редактирование: 28 Декабрь 2011, 12:28 от Клио » Записан

ubuntu 12.04 + LibO3.6.0
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #2: 28 Декабрь 2011, 13:16 »

+1

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

И не забыть, что в Excel (в VBA) эти параметры в скобках обозначают "строка-столбец", а в Calc'е (в StarBasic) - "колонка-строка". То есть, не забывать менять местами.
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Graveworm
Участник
**
Offline Offline

Сообщений: 12


« Ответ #3: 28 Декабрь 2011, 15:04 »

Спасибо, работает! А подскажите еще что прописать для копирования ячейки с одного листа на другой?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #4: 28 Декабрь 2011, 15:26 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Graveworm
Участник
**
Offline Offline

Сообщений: 12


« Ответ #5: 28 Декабрь 2011, 15:44 »

да у меня задача очень простая: диапозон из 3 ячеек с одной страницы на другую скопировать при нажатии на кнопку:)
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 28 Декабрь 2011, 15:53 »

В фиксированное место? Или в первую пустую строку?
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Graveworm
Участник
**
Offline Offline

Сообщений: 12


« Ответ #7: 28 Декабрь 2011, 15:56 »

в фиксированное место
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 28 Декабрь 2011, 17:26 »

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

(Если мигает слишком быстро и ничего не понятно - кликни по картинке, там более медленная пошаговая версия есть)
« Последнее редактирование: 28 Декабрь 2011, 17:30 от JohnSUN » Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Graveworm
Участник
**
Offline Offline

Сообщений: 12


« Ответ #9: 29 Декабрь 2011, 11:03 »

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
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #10: 29 Декабрь 2011, 11:34 »

"Продолжаем разговор..." (с) Тот же Карлсон.
А до нажатия кнопки, что находится в 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
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #11: 29 Декабрь 2011, 12:09 »

Можно  так:

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
Участник
**
Offline Offline

Сообщений: 12


« Ответ #12: 29 Декабрь 2011, 12:13 »

Итого:
Код:
Sub Main
oSheets = ThisComponent.getSheets()
oSheet1 = oSheets.getByName("Sheet1")
oSheet2 = oSheets.getByName("Sheet2")
oSheet2.getCellRangeByName("A1").String = oSheet1.getCellRangeByName("B2").String
End Sub
Вроде бы все работает. Если что-то не дописал, поправить пожалуйста. Благодарю, Вы мне очень помогли  Подмигивающий
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #13: 29 Декабрь 2011, 13:04 »

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

С наступающим вас всех!  Всё хорошо
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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