Автор Тема: OOo Basic  (Прочитано 4475 раз)

ska

  • Гость
OOo Basic
« : 24.01.2012 14:53:30 »
Разбираясь в офисных макросах столкнулся с такой проблемой. Нужно заполнить диапазон ячеек числовыми значениями с определенным шагом (типа прогрессии). Вот я и решил сначала поместить эти ячейки в массив и уже в нем перебором добавлять значения. Почитав кой-какой литературы) приступил... Однако не один день уже потратил, а ничего лучше вот этого не написалSub Main

Dim oRange ()
oRange=array(thiscomponent.sheets(2).getCellRangeByName ("c3:c10"))

print oRange(3)

End Sub

Т.е. пытаясь увидеть 4 элемент в массиве (а им как мне кажется должна быть ячейка с адресом С6), получаю ошибку
Недопустимое значение или тип данных
Индекс за пределами установленного диапазона

В общем чего не так и как ячейки поместить в массив?

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 946
    • Домашняя страница
    • Email
Андрей Черепанов (cas@)

ska

  • Гость
Re: OOo Basic
« Ответ #2 : 24.01.2012 17:22:05 »
Спасибо, дошло)
Sub fillCellIsByRange
Dim myTable as Object

xSheet = ThisComponent.Sheets(2)

myTable = xSheet.getCellRangeByName("c3:c10")
i=0
for rn=0 to 7
myTable.getCellByPosition(0,rn).value=i
i=i+0.1
next rn
End Sub
А еще какой-нибудь способ есть?

ska

  • Гость
Re: OOo Basic
« Ответ #3 : 25.01.2012 13:57:19 »
Другой пример.
Таким же способом, как выше, хочу заполнить диапазон ячеек формулой. В формуле 2 абсолютных и одна относительная ссылка. После выполнения макроса на листе весь диапазон d3:d10 выглядит как #ИМЯ? , а в строке состояния ошибка: недопустимое имя. Кликаю на ячейку диапазона - в строке формул формула выглядит корректно (например так =$A$3 * COS($B$3 * 3,14 / 180) * C10). Не понимаю, почему формула не выводит результат. Однако если затем кликнуть на кнопку мастер функций а потом сразу на ок, то в ячейке появляется результат и ошибка исчезает. Как с этим бороться?
myTable = xSheet.getCellRangeByName("d3:d10")
i=3
for rn=0 to 7
myTable.getCellByPosition(0,rn).Formula="=$A$3 * COS($B$3 * 3,14 / 180) * C"&i
  i=i+1
next rn

ska

  • Гость
Re: OOo Basic
« Ответ #4 : 25.01.2012 14:00:34 »
Извиняюсь, поспешил. Просто в макросе нужно было указать вместо 3,14   3.14 - изменить запятую на точку.

ska

  • Гость
Re: OOo Basic
« Ответ #5 : 27.01.2012 16:03:47 »
Теперь надо запустить макрос по клику на кнопке. На рабочем листе рисую кнопку. Далее правой кнопкой выбираю Элемент управления и на вкладке События там, где Нажатие указываю макрос. Однако при клике по кнопке макрос не выполняется. Как это делается? Что не так?

ska

  • Гость
Re: OOo Basic
« Ответ #6 : 30.01.2012 08:24:42 »
Ну и почему никто не сказал, что в качестве события для кнопки нужно выбирать Выполнить действие, а не Нажатие клавиши. В чем разница?

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 946
    • Домашняя страница
    • Email
Re: OOo Basic
« Ответ #7 : 30.01.2012 12:04:04 »
Ну и почему никто не сказал, что в качестве события для кнопки нужно выбирать Выполнить действие, а не Нажатие клавиши. В чем разница?
Потому что никто не занимается макросами OpenOffice.
Андрей Черепанов (cas@)

ska

  • Гость
Re: OOo Basic
« Ответ #8 : 16.02.2012 14:24:49 »
Тем не менее продолжаю колдовать над созданием кроссворда в calc. В принципе нехитрый макрос проверки ответа уже готов). Решил добавить еще код очистки ячеек перед закрытием документа. И здесь вопрос. Разумеется, мне хочется сохранить этот макрос в библиотеке документа, в котором создается кроссворд, чтобы на любом компьютере можно было бы пользоваться. При выборе макроса и клике Назначить я выбираю в Событиях Документ будет закрыт, затем клик по Назначить Макрос и в следующем окне вижу только две библиотеки Мои Макросы и Макросы OpenOffice.org. Понятно, что при сохранении макроса в этих библитеках, он не будет выполняться, если я перемещу документ на другой компьютер. Вопрос. Как выполнить макрос перед закрытием документа и при этом иметь возможность перемещать документ между разными компьютерами.
« Последнее редактирование: 16.02.2012 14:28:39 от ska »

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 461
    • Email
Re: OOo Basic
« Ответ #9 : 17.02.2012 21:27:19 »
...И здесь вопрос. Разумеется, мне хочется сохранить этот макрос в библиотеке документа, в котором создается кроссворд, чтобы на любом компьютере можно было бы пользоваться...
Для этого, как минимум, саму библиотеку надо сохранить в документе...

Сервис -> Макросы -> Управление макросами -> OpenOffice.org Basic (к примеру, или другой язык)

В окне макросов -> "Управление..." -> перейти на вкладку библиотеки -> в выпадающем списке выбрать имя файла.
После всех изменений, сохранить сам документ!

...Как выполнить макрос перед закрытием документа и при этом иметь возможность перемещать документ между разными компьютерами.
Между выполнением макроса и закрытием документа обязательно должно быть сохранение (с запросом или без).

Есть ещё другой способ — сохранить макрос как расширение и на другом компьютере устанавливать отдельно от файла.
Собственно, любые фичи OOo/Libre более принято реализовывать именно как расширение (что очень несложно делается), таскать документы с макросами  — это для M$O, в OOo/Libre оно не нужно. Поэтому и благодаря наличию намного большего количества встроенных инструментов, макросы в OOo не особо развиваются.
« Последнее редактирование: 19.02.2012 00:00:24 от stranger573 »

ska

  • Гость
Re: OOo Basic
« Ответ #10 : 19.02.2012 06:57:13 »
...И здесь вопрос. Разумеется, мне хочется сохранить этот макрос в библиотеке документа, в котором создается кроссворд, чтобы на любом компьютере можно было бы пользоваться...
Для этого, как минимум, саму библиотеку надо сохранить в документе...

Сервис -> Макросы -> Управление макросами -> OpenOffice.org Basic (к примеру, или другой язык)

В окне макросов -> "Управление..." -> перейти на вкладку библиотеки -> в выпадающем списке выбрать имя файла.
После всех изменений, сохранить сам документ!
В том-то и дело, что этого нельзя сделать. Не получается у меня сохранить в документе. Т.е. макрос сохранить в библиотеке документа я могу. Но вот назначить событие для макроса, сохраненного в библиотеке документа не получается (вопрос именно в этом). Пошагово:
В окне управления макросами выделяю свой макрос, сохраненный в библиотеке текущего документа. Далее кликаю на кнопку Назначить. Появляется окно Настройка с тремя вкладками Меню, Панели инструментов и События. Выбираю вкладку События, выбираю событие, например, Документ будет закрыт. Кликаю на кнопку назначить Макросс... В следующем окне вижу только 2 библиотеки, Мои макросы и Макросы опенофис.орг, библиотеки документа нет.
Цитировать
Есть ещё другой способ — сохранить макрос как расширение и на другом компьютере устанавливать отдельно от файла.
Интересно узнать подробности. Хотя этот способ не годится. Нужно чтобы дети разгадывали кроссворд а не занимались установкой чего-либо. Т.е. открыл файл srossword.ods, прочитал вопросик, ввел нужную буковку, нажал кнопку проверить (получил результат), нажал крестик (закрыл программу)-все ячейки очистились и файлик сохранился в первозданном виде).
P.S. может код есть какой секретный), чтобы можно было обойтись без кнопки назначить событие и вручную ввести этот код в свой макрос?
« Последнее редактирование: 19.02.2012 07:03:36 от ska »

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 461
    • Email
Re: OOo Basic
« Ответ #11 : 19.02.2012 21:20:42 »
В том-то и дело, что этого нельзя сделать. Не получается у меня сохранить в документе. Т.е. макрос сохранить в библиотеке документа я могу. Но вот назначить событие для макроса, сохраненного в библиотеке документа не получается (вопрос именно в этом)...
Понятно. Это лучше делать через "Сервис" -> "Настройка" -> вкладка "События", тогда будут показаны и библиотеки документа.

Цитировать
Есть ещё другой способ — сохранить макрос как расширение и на другом компьютере устанавливать отдельно от файла.
Интересно узнать подробности...
Да это, собственно, там же. На вкладке "Библиотеки" в "Управлении макросами" есть кнопка "Экспорт" -> "Экспортировать как расширение". В данном случае будет создан файл .oxt и выбранные библиотеки макросов можно будет устанавливать (и обновлять) с помощью механизма расширений.
   Вообще Ваш кроссворд, как расширение, может выглядеть так:
Вопросник, макросы, кнопки и прочая обвязка могут быть запакованы в расширение.
Для того, чтобы воспользоваться — запускаем Calc, жмём на панели инструментов кнопку "Кроссворд", отвечаем на вопросы получаем баллы (которые, кстати, могут быть автоматически отправлены в какой нибудь журнал учителю на комп) или что_там_у_Вас, жмём кнопку "Выход" и всё. Не надо открывать и закрывать никаких файлов, к тому же расширение можно будет обновлять с единого удалённого источника.
   Нечто подобное можно посмотреть тут, сайт расширений ООо, к сожалению, в последнее время жутко глючит, если сразу не получается зайти на страницу — понажимайте кнопку "Попробовать снова", с нескольких раз получается.
   Кстати гуголь на вопрос "кроссворд для calc" выводит 720000 ссылок. К примеру. Варианты вообще без применения макросов не редкость.

P.S. может код есть какой секретный), чтобы можно было обойтись без кнопки назначить событие и вручную ввести этот код в свой макрос?
Да можно. Код совсем не секретный. Может Вам поможет это или это. Есть специализированные форумы.

P.S. Если я правильно ошибаюсь, Вам надо закрыть документ так, чтобы он сохранился в исходном виде? Так для этого в запросе на сохранение при закрытии достаточно сказать "Не сохранять", тогда не потребуется никакой макрос.
   Есть и другой способ — сохранить Ваш документ как шаблон и открывать не файл, а шаблон. Тогда при закрытии, если выбрали "Сохранить", то будет сохранён файл с изменениями, но сам шаблон останется неизменным, соответственно при выборе "Не сохранять" не будет сохранено ничего. Для этого тоже не надо никаких макросов.
« Последнее редактирование: 20.02.2012 02:14:53 от stranger573 »

ska

  • Гость
Re: OOo Basic
« Ответ #12 : 20.02.2012 03:34:48 »
В том-то и дело, что этого нельзя сделать. Не получается у меня сохранить в документе. Т.е. макрос сохранить в библиотеке документа я могу. Но вот назначить событие для макроса, сохраненного в библиотеке документа не получается (вопрос именно в этом)...
Понятно. Это лучше делать через "Сервис" -> "Настройка" -> вкладка "События", тогда будут показаны и библиотеки документа.
то, что нужно, спасибо

ska

  • Гость
Re: OOo Basic
« Ответ #13 : 20.02.2012 04:13:47 »
   Нечто подобное можно посмотреть тут,
не поддаюсь на провокации)

ska

  • Гость
Re: OOo Basic
« Ответ #14 : 20.02.2012 11:51:29 »
   Кстати гуголь на вопрос "кроссворд для calc" выводит 720000 ссылок. К примеру. Варианты вообще без применения макросов не редкость.
может гуголь  и выводит, но покажите хоть одну ссылку как сделать кроссворд в calc на макросах. Вряд ли найдете. Либо excell либо условное форматирование, что как-то неинтересно)
Цитировать

P.S. Если я правильно ошибаюсь, Вам надо закрыть документ так, чтобы он сохранился в исходном виде? Так для этого в запросе на сохранение при закрытии достаточно сказать "Не сохранять", тогда не потребуется никакой макрос.
   Есть и другой способ — сохранить Ваш документ как шаблон и открывать не файл, а шаблон. Тогда при закрытии, если выбрали "Сохранить", то будет сохранён файл с изменениями, но сам шаблон останется неизменным, соответственно при выборе "Не сохранять" не будет сохранено ничего. Для этого тоже не надо никаких макросов.
смысл затеи с очисткой содержимого перед сохранением в том, чтобы дети(справившиеся с кроссвордом) "не поделились" готовыми (сохраненными) работами с товарищами
Вот так получилось у меня. Может учителям пригодится)
'проверка результата
Sub Main
xSheet = ThisComponent.Sheets(0)
'myTable = xSheet.getCellRangeByName("B5:T22")

for nCol=0 to 10
 for nRow=0 to 10
  oCell=oCell & xSheet.getcellbyposition(nCol,nRow).String
 next
next

if oCell="jbrugbydaodarmsciinfnotsootennis" then
 msgBox ("Правильнo", 0, "Ответ")
  else
  msgBox ("Неверно",0, "Ответ")
end if
End Sub

'очистка ячеек
Sub ClearCells
xSheet = ThisComponent.Sheets(0)
cellRange=xSheet.getCellRangeByName("B5:T22")
cellRange.clearContents(5)
End Sub