Страница 2 из 3

Re: OpenOffice

Добавлено: 24 ноя 2007, 16:50
vvb
Aent писал(а): Так же умиляет что для доступа к ячейке таблицы используются РАЗНЫЕ методы
в зависимости от того строковое или числовое значение она содержит ...
И никакого нездорового полиморфизма.
О рекордере нужно забыть вообще. Он записывает вызовы UNO. Код получается крайне не эффективный.
Вобщем, написал я несколько макросов на StarBasic. Прикинул свои временые затраты и легко убедил заказчиков, что экономия на ОО мнимая (если конечно
используются макросы или мало мальски сложные документы). За пару месяцев работы они заплатили мне значительно больше чем если бы сразу купили
MS OFFICE и проект шёл бы в нормальном EXCEL.
Спасибо за примеры. Мне нужно переделывать под Calc свою небольшую программу на фирме, которая тоже не хочет платить за MS Of.

Но вот что я прочитал на Саранском форуме:
"Я обожаю SuSE и Novell. В их ОО уже встроена поддержка VBA, вам нужно просто поставить опцию
Код
Option VBASupport 1
в начале модуля и работать с внутренним языком как с языком VBA. Забудьте о всяких там thisComponent и прочих заморочках, работайте так, как вам нравится!"

(Адрес форума http://forum.saransk.ru/index.php?showtopic=50768)

Наверное, это несколько иной ООо и, наверняка, не локализованнный. Ссылки выводят на неких программистов, которые заявляют о выходе продукта, но дальше неясно.

Re: OpenOffice

Добавлено: 24 ноя 2007, 20:05
vvb
"Продвинулся" немного. Получил аналог Nstr=ActiveCell.Row

Sub RetrieveTheActiveCell()'номер строки, в которой находится выделенная ячейка (с ограничением: номер столбца не более одной Буквы)
Dim oActiveCell
Dim oConv
Dim oRow as string
dim Nstr as string
oActiveCell = ThisComponent.CurrentSelection
oConv = ThisComponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv.Address = oActiveCell.getCellAddress
Print oConv.UserInterfaceRepresentation
Nstr=mid(oConv.UserInterfaceRepresentation,2)
Print Nstr 'аналог: Nstr=ActiveCell.Row, всего-то, делов!
End Sub

Уверен, что это можно написать короче. Но как?

Re: OpenOffice

Добавлено: 24 ноя 2007, 22:59
Aent
&quot писал(а):Option VBASupport 1
в начале модуля и работать с внутренним языком как с языком VBA. Забудьте о всяких там thisComponent и прочих заморочках, работайте так, как вам нравится!"
Если бы ... Эта опция в OO давольно давно.
НО! VBA то поддерживается, а большинство объектов и методов Excel - нет. :(

Re: OpenOffice

Добавлено: 24 ноя 2007, 23:41
Aent
&quot писал(а):Уверен, что это можно написать короче
Если выбрана одна ячейка можно просто писать

Код: Выделить всё

 
NStr = ThisComponent.getCurrentSelection.CellAddress.Row + 1
(Помня, что эти !@#!#@ нумеруют строки и столбцы в коде с 0)

Re: OpenOffice

Добавлено: 25 ноя 2007, 10:00
vvb
Aent писал(а):Если выбрана одна ячейка можно просто писать

Код: Выделить всё

 
NStr = ThisComponent.getCurrentSelection.CellAddress.Row + 1
(Помня, что эти !@#!#@ нумеруют строки и столбцы в коде с 0)
Еще раз спасибо.
Путь от сложного к простому возникает когда книжки приходится читать не сначала, а с середины. Чем я и занимаюсь. Но первые 20% кода уже работают.

Re: OpenOffice

Добавлено: 25 ноя 2007, 14:30
vvb
Ещё один интересный момент. В VBA в модуле можно размещать множество процедур и запускать в пошаговом исполнении любую из них. В SB всегда начинает работать первая процедура. Какой смысл заложен в такой реализации?

Re: OpenOffice

Добавлено: 25 ноя 2007, 21:54
Aent
Cреда разработки OO значительно менее интегрирована с OpenBasic чем VBE c VBA.
Это объясняется тем, что языков на которых написан скрипт для ОО может быть много. Например это могут быть Питон или REXX (в стандарт не входит). Cоответственно, среда просто передаёт файл с модулем соответствующему
скриптовому интерпретатору. Отладчик же просто интерпретирует по строке (оператору) за раз. Идеология, по видимому, подразумевает что вкаждом модуле есть главная процедура с которой начинается интерпретация. Все остальные должны вызываться из неё. :(
Ещё раз рекомендую (если вы читаете по английски) посмотреть книжку
"Learn OpenOffice.org spreadsheet macro programming" Dr.Mark Alexander Bain
http://www.rapidshare.ru/478587/ ~8M
Пролежит она там полагаю недолго ...

Re: OpenOffice

Добавлено: 26 ноя 2007, 19:56
vvb
Aent писал(а):Cреда разработки OO значительно менее интегрирована с OpenBasic чем VBE c VBA.
Это объясняется тем, что языков на которых написан скрипт для ОО может быть много. Например это могут быть Питон или REXX (в стандарт не входит).
Догадываюсь.
Aent писал(а): Ещё раз рекомендую (если вы читаете по английски) посмотреть книжку
"Learn OpenOffice.org spreadsheet macro programming" Dr.Mark Alexander Bain
http://www.rapidshare.ru/478587/ ~8M
Пролежит она там полагаю недолго ...
Спасибо. Надеюсь, наступят светлые времена по части чтения книжек. А иначе в голове ничего не осядет.
Но, тем не менее, основной блок закончил. Вместо 95 строк на VBA получилось 145 на BS. Не такое уж большое увеличение объема кода.
Пользовался простыми примерами от Дм. Рудника.
Нигде не нашел внятного описания, как написать аналог
"Worksheets("Лист1").activate".
Возможно, будет предложение переделать под Calc мою же VBA-программу объемом около 6000 строк кода. Не вдохновляет. Похоже, проще будет на VB.

Re: OpenOffice

Добавлено: 26 ноя 2007, 22:03
Aent
&quot писал(а):Нигде не нашел внятного описания, как написать аналог
Worksheets("Лист1").activate".
Это не проблема.

Код: Выделить всё

Dim oSheet as Object
oSheet = ThisComponent.Sheets.getByName("Лист1")
ThisComponent.CurrentController.SetActiveSheet(oSheet)
Можно и в строчку, без промежуточной переменной ...

Re: OpenOffice

Добавлено: 27 ноя 2007, 01:09
vvb
Aent писал(а):Это не проблема.

Код: Выделить всё

Dim oSheet as Object
oSheet = ThisComponent.Sheets.getByName("Лист1")
ThisComponent.CurrentController.SetActiveSheet(oSheet)
Можно и в строчку, без промежуточной переменной ...
Спасибо. Я нашел книгу, где сопоставляются коды VBA и BS. Сразу полегчало.
Показываю одно из своих творений. Криво, конечно, потому что не знаю, как поставить печать двух экземпляров. Написано "в лоб". Не стал бы показывать, если бы не вопрос: Пока не поставил ожидание после каждой печати - печатался только один первый документ и программа завершалась. Почему?

Sub Pech_Vse()
Dim oDoc As Object, ListPrint As Object
Dim mPrintopts1()
oDoc=ThisComponent
ListPrint=oDoc.Sheets.getByName("Прил_1")'получение доступа к листу
ThisComponent.CurrentController.setActiveSheet(ListPrint)'активизация листа
oDoc.Print(mPrintopts1()) 'печать текущего листа
Wait 1000
oDoc.Print(mPrintopts1())
Wait 1000
ListPrint=oDoc.Sheets.getByName("Дог_1")'получение доступа к листу
ThisComponent.CurrentController.setActiveSheet(ListPrint)
oDoc.Print(mPrintopts1()) 'печать текущего листа
Wait 1000
oDoc.Print(mPrintopts1())
Wait 1000
ListPrint=oDoc.Sheets.getByName("Дог_2")'получение доступа к листу
ThisComponent.CurrentController.setActiveSheet(ListPrint)
oDoc.Print(mPrintopts1()) 'печать текущего листа
Wait 1000
oDoc.Print(mPrintopts1())
End Sub

Пробовал сделать основу для этого макрорекордером. Получилось, но также, ппосле первой печати завершение программы. Пока не поставил "Wait"