Журнал LinuxFormat - перейти на главную

LXF84:OOo Basic

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
м (Испытайте на своем дистрибутиве)
м
 
Строка 6: Строка 6:
 
Мы подходим к концу данной серии уроков, и вы уже знаете, что можно автоматизировать любые задачи с помощью
 
Мы подходим к концу данной серии уроков, и вы уже знаете, что можно автоматизировать любые задачи с помощью
 
макросов OpenOffice.org Basic. На этот раз мы рассмотрим
 
макросов OpenOffice.org Basic. На этот раз мы рассмотрим
возможность использования Windows-эквивалента, VBA, в OOo – и
+
возможность использования Windows-эквивалента, VBA, в OOo — и
 
увидим, что не все OpenOffice.org одинаковы.
 
увидим, что не все OpenOffice.org одинаковы.
  
Строка 13: Строка 13:
 
Mega, с Windows XP. Я воздержался от установки на него Linux, и
 
Mega, с Windows XP. Я воздержался от установки на него Linux, и
 
попытался найти способ запустить Linux через Windows. Скажете,
 
попытался найти способ запустить Linux через Windows. Скажете,
кощунство? Объясняю: у компьютера имеется TV-карта, а у меня
+
кощунство? Объясняю: у компьютера имеется TV-карта, а у меня -
 
странное ощущение, что я останусь без Freeview, если мигрирую.
 
странное ощущение, что я останусь без Freeview, если мигрирую.
 
Поэтому я установил Cygwin, а затем использовал Cygserver, чтобы
 
Поэтому я установил Cygwin, а затем использовал Cygserver, чтобы
Строка 24: Строка 24:
  
 
=== Камень преткновения в Excel ===
 
=== Камень преткновения в Excel ===
[[Изображение:Img 84 59 1.png|thumb|250px|(Рис. 1) Код VBA не вызовет затруднений – OOo просто его закомментирует.]]
+
[[Изображение:Img 84 59 1.png|thumb|250px|(Рис. 1) Код VBA не вызовет затруднений — OOo просто его закомментирует.]]
 
Начнем с простого. Если вы попытаетесь открыть таблицу Microsoft
 
Начнем с простого. Если вы попытаетесь открыть таблицу Microsoft
Excel в OOo Calc, то все пройдет гладко – Calc откроет ее без вопросов,
+
Excel в OOo Calc, то все пройдет гладко — Calc откроет ее без вопросов,
 
ибо OpenOffice.org не страдает предрассудками. А ну как в таблицу
 
ибо OpenOffice.org не страдает предрассудками. А ну как в таблицу
 
встроен макрос? OOo выдаст вам стандартное предупреждение «Этот
 
встроен макрос? OOo выдаст вам стандартное предупреждение «Этот
документ содержит макросы», но что бы вы ни выбрали – Включить
+
документ содержит макросы», но что бы вы ни выбрали — Включить
макросы или Отключить макросы – Calc не выдаст никаких ошибок и
+
макросы или Отключить макросы — Calc не выдаст никаких ошибок и
 
загрузит документ (Рис. 1). Значит ли это, что OpenOffice.org понимает
 
загрузит документ (Рис. 1). Значит ли это, что OpenOffice.org понимает
 
макросы VBA? Увы, нет.
 
макросы VBA? Увы, нет.
Строка 39: Строка 39:
 
самим во всем разбираться.
 
самим во всем разбираться.
  
Итак, похоже, что страхи разработчика VBA обоснованы – и что данная статья закончится, не начавшись. Я тоже так думал, пока не поговорил с Ноэлем Пауэром [Noel Power]. Этого человека стоит знать – он
+
Итак, похоже, что страхи разработчика VBA обоснованы — и что данная статья закончится, не начавшись. Я тоже так думал, пока не поговорил с Ноэлем Пауэром [Noel Power]. Этого человека стоит знать — он
 
отвечает за взаимодействие OpenOffice.org и Excel VBA в Novell. Ноэль
 
отвечает за взаимодействие OpenOffice.org и Excel VBA в Novell. Ноэль
 
предложил простое решение: установить SUSE 10.1. Давайте подумаем: а надо ли? Какой-то тип из Novell всем рекомендует брать SUSE. С
 
предложил простое решение: установить SUSE 10.1. Давайте подумаем: а надо ли? Какой-то тип из Novell всем рекомендует брать SUSE. С
чего это вдруг? «Нет, серьезно, отвечает Ноэль. Просто я не знаю,
+
чего это вдруг? «Нет, серьезно, — отвечает Ноэль. — Просто я не знаю,
 
у какого ещё дистрибутива есть поддержка VBA, а у SUSE точно есть.»
 
у какого ещё дистрибутива есть поддержка VBA, а у SUSE точно есть.»
 
[Русскоязычные пользователи могут воспользоваться сборками OOo
 
[Русскоязычные пользователи могут воспользоваться сборками OOo
от «Инфра-Ресурс» – они поддерживают макросы VBA – прим. ред.] И
+
от «Инфра-Ресурс» — они поддерживают макросы VBA — прим. ред.] И
 
тут он прав: я-то всегда предполагал (наверно, по наивности), что ваш
 
тут он прав: я-то всегда предполагал (наверно, по наивности), что ваш
OpenOffice.org 2.0.2 на машине с PCLinuxOS (к примеру) и OpenOffice.org на машине с SUSE – совершенно одинаковые OpenOffice.org. Как
+
OpenOffice.org 2.0.2 на машине с PCLinuxOS (к примеру) и OpenOffice.org на машине с SUSE — совершенно одинаковые OpenOffice.org. Как
 
бы не так!
 
бы не так!
  
Строка 53: Строка 53:
 
OpenOffice.org? Потому, говорит Ноэль, «что одним из барьеров внедрения OpenOffice.org является отсутствие прозрачной работы макросов.
 
OpenOffice.org? Потому, говорит Ноэль, «что одним из барьеров внедрения OpenOffice.org является отсутствие прозрачной работы макросов.
 
В бизнесе почти все жизненно важные макросы сосредоточены в таблицах Excel. Устранение или снижение этого барьера сразу же облегчит внедрение OpenOffice.org.» Исследования Novell по использованию
 
В бизнесе почти все жизненно важные макросы сосредоточены в таблицах Excel. Устранение или снижение этого барьера сразу же облегчит внедрение OpenOffice.org.» Исследования Novell по использованию
VBA на предприятиях показали, что большинство макросов используют подмножество объектов Excel API – например, объекты Range и
+
VBA на предприятиях показали, что большинство макросов используют подмножество объектов Excel API — например, объекты Range и
 
Worksheet. Ноэль и его коллеги сосредоточились на поддержке часто
 
Worksheet. Ноэль и его коллеги сосредоточились на поддержке часто
 
используемых объектов, их методов и свойств, то есть модель Novell
 
используемых объектов, их методов и свойств, то есть модель Novell
Строка 77: Строка 77:
 
вернуться к SUSE. А как с установкой? Да легко.
 
вернуться к SUSE. А как с установкой? Да легко.
  
[[Изображение:Img 84 58 1.png|thumb|left|250px|(Рис. 2) Файл hypocycloid-demo.xls с разными шаблонами. Calc запросто его откроет, но тут-то и начнутся проблемы...]]
+
[[Изображение:Img 84 58 1.png|thumb|left|250px|(Рис. 2) Файл hypocycloid-demo.xls с разными шаблонами. Calc запросто его откроет, но тут-то и начнутся проблемы…]]
 
Ну, на самом деле не совсем. Я скачал 5 образов CD с сайта Novell,
 
Ну, на самом деле не совсем. Я скачал 5 образов CD с сайта Novell,
 
записал их на диски, перегрузился и понял, что создал 5 подставок
 
записал их на диски, перегрузился и понял, что создал 5 подставок
 
для пивных кружек. Поделюсь советом: когда на диске написано, что
 
для пивных кружек. Поделюсь советом: когда на диске написано, что
скорость прожига 52x – не верьте. Лучше сбросьте скорость записи до
+
скорость прожига 52x — не верьте. Лучше сбросьте скорость записи до
12x – на запись потребуется больше времени, но зато она будет сделана качественно. Что до установки – легко. Скачал 5 образов CD с сайта
+
12x — на запись потребуется больше времени, но зато она будет сделана качественно. Что до установки — легко. Скачал 5 образов CD с сайта
 
Novell, записал их на скорости 12x, перегрузись и следуй инструкциям
 
Novell, записал их на скорости 12x, перегрузись и следуй инструкциям
 
инсталлятора.
 
инсталлятора.
Строка 94: Строка 94:
 
произойдет.
 
произойдет.
  
Вы захотите сразу же увидеть рабочий пример, поэтому мы записали на диск файл hypocycloid-demo.xls от Ноэля. Что в нем особенного? Ничего. Вы его загружаете, а он работает: нажмите на кнопку – и
+
Вы захотите сразу же увидеть рабочий пример, поэтому мы записали на диск файл hypocycloid-demo.xls от Ноэля. Что в нем особенного? Ничего. Вы его загружаете, а он работает: нажмите на кнопку — и
 
картинка изменится (Рис. 2). Все здорово, но реальную разницу вы
 
картинка изменится (Рис. 2). Все здорово, но реальную разницу вы
 
увидите, только просмотрев макрос в редакторе кода. Для этого надо
 
увидите, только просмотрев макрос в редакторе кода. Для этого надо
прощёлкать Tools–>Macros–>Organize Macros–>OpenOffice.org Basic.
+
прощёлкать Tools->Macros->Organize Macros->OpenOffice.org Basic.
 
На экране OpenOffice.org Macros разверните Hypocycloid-demo, затем
 
На экране OpenOffice.org Macros разверните Hypocycloid-demo, затем
 
Standard. Наконец, нажмите Module1 и Edit.
 
Standard. Наконец, нажмите Module1 и Edit.
Строка 119: Строка 119:
 
<source lang="vb">
 
<source lang="vb">
 
Sub writeToCell_VBA
 
Sub writeToCell_VBA
sheets(“Sheet1”).select
+
sheets("Sheet1").select
cells(1,1).value=”Hello world”
+
cells(1,1).value="Hello world"
 
End Sub
 
End Sub
 
</source>
 
</source>
Строка 128: Строка 128:
 
каждого модуля, в котором вы хотите использовать VBA:
 
каждого модуля, в котором вы хотите использовать VBA:
 
<source lang="vb">Option VBASupport 1</source>
 
<source lang="vb">Option VBASupport 1</source>
Вот так и поступает Novell-версия OOo – не превращает строки
+
Вот так и поступает Novell-версия OOo — не превращает строки
 
кода в комментарии, а вставляет Option VBASupport 1 в начале модуля
 
кода в комментарии, а вставляет Option VBASupport 1 в начале модуля
 
(Рис. 4).
 
(Рис. 4).
Строка 155: Строка 155:
 
sheet=thisComponent.sheets(0)
 
sheet=thisComponent.sheets(0)
 
cell=sheet.getCellByPosition(0,0)
 
cell=sheet.getCellByPosition(0,0)
cell.string=”Hello World Again”
+
cell.string="Hello World Again"
 
End Sub
 
End Sub
 
</source>
 
</source>
Строка 163: Строка 163:
 
thisComponent.sheets(0).
 
thisComponent.sheets(0).
 
getCellByPosition(0,1).
 
getCellByPosition(0,1).
string=”Last One”
+
string="Last One"
 
End Sub
 
End Sub
 
</source>
 
</source>
Строка 176: Строка 176:
 
одно и то же, просто используя разные слова. Например, взгляните
 
одно и то же, просто используя разные слова. Например, взгляните
 
на:
 
на:
<source lang="oobas">ThisComponent.LockControllers ‘формат OOo</source>
+
<source lang="oobas">ThisComponent.LockControllers 'формат OOo</source>
 
и
 
и
<source lang="vb">Application.ScreenUpdating = False ‘формат VBA</source>
+
<source lang="vb">Application.ScreenUpdating = False 'формат VBA</source>
 
Обе этих строки выполняют одно и то же: замораживают экран, это
 
Обе этих строки выполняют одно и то же: замораживают экран, это
 
может быть полезно, если вы пишете в несколько ячеек. Чем сидеть и
 
может быть полезно, если вы пишете в несколько ячеек. Чем сидеть и
 
смотреть, как поштучно происходит обновление ячеек, лучше увидать
 
смотреть, как поштучно происходит обновление ячеек, лучше увидать
 
полностью готовый экран, когда работа выполнена. И не забудьте разморозить экран:
 
полностью готовый экран, когда работа выполнена. И не забудьте разморозить экран:
<source lang="oobas">ThisComponent.UnlockControllers ‘формат OOo</source>
+
<source lang="oobas">ThisComponent.UnlockControllers 'формат OOo</source>
 
или
 
или
<source lang="vb">Application.ScreenUpdating = True ‘формат VBA</source>
+
<source lang="vb">Application.ScreenUpdating = True 'формат VBA</source>
 
Большинство случаев похожи на этот: та же функциональность, но
 
Большинство случаев похожи на этот: та же функциональность, но
 
все слегка упрощено благодаря новым объектам. Мы уже видели, как
 
все слегка упрощено благодаря новым объектам. Мы уже видели, как
Строка 191: Строка 191:
 
<source lang="oobas">
 
<source lang="oobas">
 
ThisComponent.CurrentController.ActiveSheet.
 
ThisComponent.CurrentController.ActiveSheet.
getCellRangeByName(“B2”).String = _
+
getCellRangeByName("B2").String = _
“Используем Windows, когда так просто установить Linux”
+
"Используем Windows, когда так просто установить Linux"
 
</source>
 
</source>
 
и
 
и
<source lang="vb">Range(“B1”).Value = “Что такое мазохизм”</source>
+
<source lang="vb">Range("B1").Value = "Что такое мазохизм"</source>
 
Если вы читали внимательно, то заметили, как вводится информация в ячейки и диапазоны. В формате OOo Basic вы просто указываете
 
Если вы читали внимательно, то заметили, как вводится информация в ячейки и диапазоны. В формате OOo Basic вы просто указываете
 
тип данных, которые собираетесь загрузить в ячейки (строка или значение). Если вы используете формат VBA, у вас только один тип данных: значение. Разница невелика, но знать о ней надо.
 
тип данных, которые собираетесь загрузить в ячейки (строка или значение). Если вы используете формат VBA, у вас только один тип данных: значение. Разница невелика, но знать о ней надо.
Строка 201: Строка 201:
 
Как мы уже видели, большая часть функциональности VBA реализуется с помощью функций простого формата. Иногда он совсем
 
Как мы уже видели, большая часть функциональности VBA реализуется с помощью функций простого формата. Иногда он совсем
 
прост. Например, чтобы очистить диапазон ячеек, вы можете использовать либо
 
прост. Например, чтобы очистить диапазон ячеек, вы можете использовать либо
<source lang="vb">Range(“A1:E5”).ClearContents</source>
+
<source lang="vb">Range("A1:E5").ClearContents</source>
 
либо
 
либо
 
<source lang="oobas">
 
<source lang="oobas">
ThisComponent.Sheets.getByName(“Sheet1”).
+
ThisComponent.Sheets.getByName("Sheet1").
getCellRangeByName(“B1:E5”).clearContents( _
+
getCellRangeByName("B1:E5").clearContents( _
 
com.sun.star.sheet.CellFlags.VALUE _
 
com.sun.star.sheet.CellFlags.VALUE _
 
+ com.sun.star.sheet.CellFlags.STRING _
 
+ com.sun.star.sheet.CellFlags.STRING _
Строка 216: Строка 216:
 
+ com.sun.star.sheet.CellFlags.EDITATTR)
 
+ com.sun.star.sheet.CellFlags.EDITATTR)
 
</source>
 
</source>
Выбор остается за вами – бывают ведь и любители побарабанить
+
Выбор остается за вами — бывают ведь и любители побарабанить
 
по клавишам. Знаю, знаю, можно вместо этого написать процедуру, но
 
по клавишам. Знаю, знаю, можно вместо этого написать процедуру, но
 
чего ради, если работа уже сделана за вас?
 
чего ради, если работа уже сделана за вас?
Строка 238: Строка 238:
 
Короче, вы поняли, в чем штука. Если вы пишете на VBA, то и продолжайте себе писать. Если он для вас в новинку и вам понравился, вы,
 
Короче, вы поняли, в чем штука. Если вы пишете на VBA, то и продолжайте себе писать. Если он для вас в новинку и вам понравился, вы,
 
возможно, захотите узнать о нем побольше. В пакете вы помощи не
 
возможно, захотите узнать о нем побольше. В пакете вы помощи не
найдете. Поискав в файлах справки OpenOffice.org по ключу VBA, получите информацию о том, как работает обычная редакция OOo – это мы
+
найдете. Поискав в файлах справки OpenOffice.org по ключу VBA, получите информацию о том, как работает обычная редакция OOo — это мы
 
уже проходили: код VBA грузится как комментарии. Однако по Excel
 
уже проходили: код VBA грузится как комментарии. Однако по Excel
 
VBA существует уже так много информации, что даже поиск в Google
 
VBA существует уже так много информации, что даже поиск в Google
Строка 254: Строка 254:
 
или планируете на него перейти, я ожидаю, что вы скажете: «А в чем
 
или планируете на него перейти, я ожидаю, что вы скажете: «А в чем
 
проблема?» Ну и прекрасно. Однако если вы приверженец Debian или
 
проблема?» Ну и прекрасно. Однако если вы приверженец Debian или
Fedora, или любой другой системы, то проблемы будут – ну, то есть,
+
Fedora, или любой другой системы, то проблемы будут — ну, то есть,
 
будут, если вам потребуется взаимодействие с Excel VBA. Что вы можете предпринять?
 
будут, если вам потребуется взаимодействие с Excel VBA. Что вы можете предпринять?
  
Строка 261: Строка 261:
 
«Наката Махо [Nakata Maho], разработчик OpenOffice.org, и Ханно
 
«Наката Махо [Nakata Maho], разработчик OpenOffice.org, и Ханно
 
Мейер-Туров [Hanno Meyer-Thurow], разработчик Gentoo, помогли в
 
Мейер-Туров [Hanno Meyer-Thurow], разработчик Gentoo, помогли в
реализации и разработке API», сказал он мне. Если вы решили установить модель VBA на вашем дистрибутиве, то найдете исходный код
+
реализации и разработке API», — сказал он мне. Если вы решили установить модель VBA на вашем дистрибутиве, то найдете исходный код
 
на http://go-oo.org, а инструкции по скачиванию на http://wiki.services.OpenOffice.org/wiki/Getting_It. Однако для экономии времени можно
 
на http://go-oo.org, а инструкции по скачиванию на http://wiki.services.OpenOffice.org/wiki/Getting_It. Однако для экономии времени можно
 
сделать вот что:
 
сделать вот что:
Строка 272: Строка 272:
 
инструкции по сборке расположены по адресу http://wiki.services.OpenOffice.org/wiki/Building. Процесс достаточно прямолинеен, а если
 
инструкции по сборке расположены по адресу http://wiki.services.OpenOffice.org/wiki/Building. Процесс достаточно прямолинеен, а если
 
и сложноват, то полнота описания снижает вероятность совершения
 
и сложноват, то полнота описания снижает вероятность совершения
ошибки. Так как OOo-build – действительно разрабатываемая версия,
+
ошибки. Так как OOo-build — действительно разрабатываемая версия,
то вы можете обнаружить, что придется добавить другие приложения
+
то вы можете обнаружить, что придется добавить другие приложения -
 
но если что-то потребуется, OOo вам об этом сообщит.
 
но если что-то потребуется, OOo вам об этом сообщит.
  
 
Поэтому на следующем шаге вы идете в каталог OOo-build и запускаете autogen.sh. На моем Debian он не заработал из-за ошибки './autogen.sh: line 18:aclocal:command not found'. Быстрое прочесывание
 
Поэтому на следующем шаге вы идете в каталог OOo-build и запускаете autogen.sh. На моем Debian он не заработал из-за ошибки './autogen.sh: line 18:aclocal:command not found'. Быстрое прочесывание
Интернета показало, что лекарство – установка automake:
+
Интернета показало, что лекарство — установка automake:
 
<source lang="bash">sudo apt-get install automake</source>
 
<source lang="bash">sudo apt-get install automake</source>
 
Когда вы заставите работать autogen.sh, следующим шагом будет
 
Когда вы заставите работать autogen.sh, следующим шагом будет
Строка 312: Строка 312:
 
make: *** [all-recursive] Error 1
 
make: *** [all-recursive] Error 1
 
</source>
 
</source>
Присказка наших дней – «В беде обращайтесь к Google» (если,
+
Присказка наших дней — «В беде обращайтесь к Google» (если,
 
конечно, вы не в Китае). Я поискал и обнаружил, что у других людей
 
конечно, вы не в Китае). Я поискал и обнаружил, что у других людей
 
наблюдается та же проблема. К счастью, решение простое: все Makefile
 
наблюдается та же проблема. К счастью, решение простое: все Makefile
 
содержат строку all-am: Makefile $(SCRIPTS), тогда как она должна
 
содержат строку all-am: Makefile $(SCRIPTS), тогда как она должна
быть all-am: Makefile. Чтобы это исправить, надо отредактировать около 25 Makefile’ов – либо написать простой скрипт:
+
быть all-am: Makefile. Чтобы это исправить, надо отредактировать около 25 Makefile’ов — либо написать простой скрипт:
 
<source lang="bash">
 
<source lang="bash">
 
FILES="Makefile */Makefile */*/Makefile"
 
FILES="Makefile */Makefile */*/Makefile"
Строка 327: Строка 327:
 
После этого make должен работать правильно. Однако, если у вас
 
После этого make должен работать правильно. Однако, если у вас
 
проблемы с программами, можете отключить их с autogen.sh. Потом
 
проблемы с программами, можете отключить их с autogen.sh. Потом
можете воспользоваться советом autogen.sh – расслабиться и выпить
+
можете воспользоваться советом autogen.sh — расслабиться и выпить
чашку чая – хотя у меня это вылилось в питье чая, прогулку с собакой,
+
чашку чая — хотя у меня это вылилось в питье чая, прогулку с собакой,
 
кормление кошек и поход в бар.
 
кормление кошек и поход в бар.
  
Строка 336: Строка 336:
 
версию OpenOffice.org.
 
версию OpenOffice.org.
  
Если вам интересно узнать о вышеупомянутой TV-карте – она
+
Если вам интересно узнать о вышеупомянутой TV-карте — она
заработала, как только я установил SUSE 10.1. Вообще-то я использую Kaffeine для просмотра каналов – он проще в использовании и
+
заработала, как только я установил SUSE 10.1. Вообще-то я использую Kaffeine для просмотра каналов — он проще в использовании и
 
стабильнее, чем исходная Windows-версия программы. Ну как тут не
 
стабильнее, чем исходная Windows-версия программы. Ну как тут не
 
любить Linux?
 
любить Linux?

Текущая версия на 13:33, 23 ноября 2008

Содержание

[править] Используем макросы VBA

ЧАСТЬ 5: Как ни хорош OOo, он не распознает макросы Excel VBA, не так ли? Не так. Эксцентричный Марк Бейн вам все объяснит.

Мы подходим к концу данной серии уроков, и вы уже знаете, что можно автоматизировать любые задачи с помощью макросов OpenOffice.org Basic. На этот раз мы рассмотрим возможность использования Windows-эквивалента, VBA, в OOo — и увидим, что не все OpenOffice.org одинаковы.

Позвольте мне начать с истории в стиле Макса Байгрейвcа [Max Bygraves]. Недавно я купил очень хороший поддержанный ПК, MSI Mega, с Windows XP. Я воздержался от установки на него Linux, и попытался найти способ запустить Linux через Windows. Скажете, кощунство? Объясняю: у компьютера имеется TV-карта, а у меня - странное ощущение, что я останусь без Freeview, если мигрирую. Поэтому я установил Cygwin, а затем использовал Cygserver, чтобы работать с Linux на одной из других моих машин. Но на свете столько дистрибутивов, что я не утерпел, и миграция свершилась. Теперь у меня замечательный ПК с PCLinuxOS, а заодно и ежевечернее развлечение: попытки заставить эту карту снова заработать.

К чему я это рассказал? Очень просто: мой страх потерять Freeview аналогичен страху разработчика VBA, который обдумывает миграцию на OpenOffice.org. Не станут ли макросы, нажитые непосильным трудом, годны только в помойку, и не придется ли писать все сначала?

[править] Камень преткновения в Excel

(thumbnail)
(Рис. 1) Код VBA не вызовет затруднений — OOo просто его закомментирует.

Начнем с простого. Если вы попытаетесь открыть таблицу Microsoft Excel в OOo Calc, то все пройдет гладко — Calc откроет ее без вопросов, ибо OpenOffice.org не страдает предрассудками. А ну как в таблицу встроен макрос? OOo выдаст вам стандартное предупреждение «Этот документ содержит макросы», но что бы вы ни выбрали — Включить макросы или Отключить макросы — Calc не выдаст никаких ошибок и загрузит документ (Рис. 1). Значит ли это, что OpenOffice.org понимает макросы VBA? Увы, нет.

Так что же случилось с теми макросами? Открыв свежеимпортированный модуль в редакторе OOo Basic, вы обнаружите, почему OOo не ругается на код: все строки кода превратились в комментарии. Вот так OOo обрабатывает код VBA: просто его игнорирует, предоставляя вам самим во всем разбираться.

Итак, похоже, что страхи разработчика VBA обоснованы — и что данная статья закончится, не начавшись. Я тоже так думал, пока не поговорил с Ноэлем Пауэром [Noel Power]. Этого человека стоит знать — он отвечает за взаимодействие OpenOffice.org и Excel VBA в Novell. Ноэль предложил простое решение: установить SUSE 10.1. Давайте подумаем: а надо ли? Какой-то тип из Novell всем рекомендует брать SUSE. С чего это вдруг? «Нет, серьезно, — отвечает Ноэль. — Просто я не знаю, у какого ещё дистрибутива есть поддержка VBA, а у SUSE точно есть.» [Русскоязычные пользователи могут воспользоваться сборками OOo от «Инфра-Ресурс» — они поддерживают макросы VBA — прим. ред.] И тут он прав: я-то всегда предполагал (наверно, по наивности), что ваш OpenOffice.org 2.0.2 на машине с PCLinuxOS (к примеру) и OpenOffice.org на машине с SUSE — совершенно одинаковые OpenOffice.org. Как бы не так!

Почему же Novell включила поддержку Excel VBA в свою версию OpenOffice.org? Потому, говорит Ноэль, «что одним из барьеров внедрения OpenOffice.org является отсутствие прозрачной работы макросов. В бизнесе почти все жизненно важные макросы сосредоточены в таблицах Excel. Устранение или снижение этого барьера сразу же облегчит внедрение OpenOffice.org.» Исследования Novell по использованию VBA на предприятиях показали, что большинство макросов используют подмножество объектов Excel API — например, объекты Range и Worksheet. Ноэль и его коллеги сосредоточились на поддержке часто используемых объектов, их методов и свойств, то есть модель Novell VBA хотя и не полна, но покрывает большую часть потребностей.

[править] SUSE как спирограф

Пришла пора установить SUSE 10.1. Должен признаться, что SUSE 7.1 был моим первым дистрибутивом Linux, когда я начал работать на себя в начале этого столетия. К сожалению, я знал, что SUSE хоть и великая вещь, но чересчур великая для моего тогдашнего ноутбука. Однако ПК с тех пор несчетно размножились, поэтому хорошо, что есть повод вернуться к SUSE. А как с установкой? Да легко.

(thumbnail)
(Рис. 2) Файл hypocycloid-demo.xls с разными шаблонами. Calc запросто его откроет, но тут-то и начнутся проблемы…

Ну, на самом деле не совсем. Я скачал 5 образов CD с сайта Novell, записал их на диски, перегрузился и понял, что создал 5 подставок для пивных кружек. Поделюсь советом: когда на диске написано, что скорость прожига 52x — не верьте. Лучше сбросьте скорость записи до 12x — на запись потребуется больше времени, но зато она будет сделана качественно. Что до установки — легко. Скачал 5 образов CD с сайта Novell, записал их на скорости 12x, перегрузись и следуй инструкциям инсталлятора.

Если вы сделаете то же самое, перед вами предстанет такая же копия OpenOffice.org, как и везде. Существующие пользователи SUSE 10.1 могут даже не понимать, из-за чего тут суетиться. Конечно, если вам не нужны макросы Excel VBA, то вы всего лишь поимели новую версию OpenOffice.org. А вот если к вам попала таблица Excel с макросом, придется побеспокоиться. Каков же следующий шаг? Загрузим табличку Excel (естественно, содержащую макрос) и посмотрим, что произойдет.

Вы захотите сразу же увидеть рабочий пример, поэтому мы записали на диск файл hypocycloid-demo.xls от Ноэля. Что в нем особенного? Ничего. Вы его загружаете, а он работает: нажмите на кнопку — и картинка изменится (Рис. 2). Все здорово, но реальную разницу вы увидите, только просмотрев макрос в редакторе кода. Для этого надо прощёлкать Tools->Macros->Organize Macros->OpenOffice.org Basic. На экране OpenOffice.org Macros разверните Hypocycloid-demo, затем Standard. Наконец, нажмите Module1 и Edit.

(thumbnail)
(Рис. 3) На этот раз Calc не закомментировал код VBA, а принял его.

С первого взгляда вы не увидите ничего необычного (Рис. 3). Но вспомните, как вы открывали макрос в не-SUSE версии OpenOffice.org. На сей раз весь код, строчка за строчкой, целехонек; велите ему работать, он и будет работать.

Это означает две вещи. Первое: если вы работаете на Excel VBA, при миграции на OpenOffice.org весь свой код выбрасывать вам не придется. Однако не забудьте сохранить свои наработки, прежде чем окончательно избавиться от Windows. Второе, не менее важное: можно продолжать разработку со старыми знаниями, просто используя OpenOffice.org вместо Excel. Ура!

[править] На практике

Не надо песен: вы пошли и загрузили парочку ваших старых макросов Excel, они идеально работали, а когда вы попытались создать макрос для новой таблицы, то потерпели неудачу. Например, вы могли бы попытаться написать следующее:

Sub writeToCell_VBA
sheets("Sheet1").select
cells(1,1).value="Hello world"
End Sub
(thumbnail)
(Рис. 4) Установите VBASupport 1, чтобы избежать этой ошибки.

Вы, возможно, получаете ошибку ‘BASIC runtime error. Subprocedure or function procedure not defined’ Не беспокойтесь. Все, что вам надо сделать, это добавить дополнительный параметр в начало каждого модуля, в котором вы хотите использовать VBA:

Option VBASupport 1

Вот так и поступает Novell-версия OOo — не превращает строки кода в комментарии, а вставляет Option VBASupport 1 в начале модуля (Рис. 4).


Здесь возникает вопрос: только ли это поддержка VBA? В конце концов, кроме упрощения возможности миграции ваших Excel-макросов в OpenOffice.org, вы получили новый метод программирования, который вы можете найти более удобным в использовании, чем собственно OOo Basic. В этом и прелесть Linux: чтобы выполнить работу, нет правильного и неправильного пути. Давайте рассмотрим процедуру записи в ячейку при помощи OOo Basic:

Sub writeToCell_OOo
dim sheet as object
dim cell as object
sheet=thisComponent.sheets(0)
cell=sheet.getCellByPosition(0,0)
cell.string="Hello World Again"
End Sub

Вы можете сократить этот код до

Sub writeToCell_minimum
thisComponent.sheets(0).
getCellByPosition(0,1).
string="Last One"
End Sub

На этих примерах вы, возможно, разглядите одно из больших отличий OOo Basic и VBA. OpenOffice.org Basic содержит главный объект (thisComponent), и все наследуется от него. VBA работает с отдельными объектами (Application, ActiveSheet, ActiveCell и им подобными). Их использование может сделать код читабельнее и проще в поддержке.

В некоторых случаях вы обнаружите, что OOo Basic и VBA делают одно и то же, просто используя разные слова. Например, взгляните на:

ThisComponent.LockControllers 'формат OOo

и

Application.ScreenUpdating = False 'формат VBA

Обе этих строки выполняют одно и то же: замораживают экран, это может быть полезно, если вы пишете в несколько ячеек. Чем сидеть и смотреть, как поштучно происходит обновление ячеек, лучше увидать полностью готовый экран, когда работа выполнена. И не забудьте разморозить экран:

ThisComponent.UnlockControllers 'формат OOo

или

Application.ScreenUpdating = True 'формат VBA

Большинство случаев похожи на этот: та же функциональность, но все слегка упрощено благодаря новым объектам. Мы уже видели, как работать с ячейками; а сейчас мы покажем, как устанавливать диапазон значений в VBA и OpenOffice.org:

ThisComponent.CurrentController.ActiveSheet.
getCellRangeByName("B2").String = _
"Используем Windows, когда так просто установить Linux"

и

Range("B1").Value = "Что такое мазохизм"

Если вы читали внимательно, то заметили, как вводится информация в ячейки и диапазоны. В формате OOo Basic вы просто указываете тип данных, которые собираетесь загрузить в ячейки (строка или значение). Если вы используете формат VBA, у вас только один тип данных: значение. Разница невелика, но знать о ней надо.

Как мы уже видели, большая часть функциональности VBA реализуется с помощью функций простого формата. Иногда он совсем прост. Например, чтобы очистить диапазон ячеек, вы можете использовать либо

Range("A1:E5").ClearContents

либо

ThisComponent.Sheets.getByName("Sheet1").
getCellRangeByName("B1:E5").clearContents( _
com.sun.star.sheet.CellFlags.VALUE _
+ com.sun.star.sheet.CellFlags.STRING _
+ com.sun.star.sheet.CellFlags.DATETIME _
+ com.sun.star.sheet.CellFlags.ANNOTATION _
+ com.sun.star.sheet.CellFlags.FORMULA _
+ com.sun.star.sheet.CellFlags.HARDATTR _
+ com.sun.star.sheet.CellFlags.STYLES _
+ com.sun.star.sheet.CellFlags.OBJECTS _
+ com.sun.star.sheet.CellFlags.EDITATTR)

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

[править] Испытайте на своем дистрибутиве

Короче, вы поняли, в чем штука. Если вы пишете на VBA, то и продолжайте себе писать. Если он для вас в новинку и вам понравился, вы, возможно, захотите узнать о нем побольше. В пакете вы помощи не найдете. Поискав в файлах справки OpenOffice.org по ключу VBA, получите информацию о том, как работает обычная редакция OOo — это мы уже проходили: код VBA грузится как комментарии. Однако по Excel VBA существует уже так много информации, что даже поиск в Google позволит найти полное руководство к действию.

Отсутствие документации свидетельствует о статусе проекта, а не о его качестве. В конце концов, в любом проекте бумажная работа всегда оставляется на потом.

Всегда следует помнить, что проект находится в стадии развития. Вы можете обнаружить, что какой-то код не импортируется или вызывает ошибки. Однако в основном это проявляется разве что при использовании редких и сложных функций.

Здесь-то вы и можете помочь. Если вы уже используете SUSE 10.1 или планируете на него перейти, я ожидаю, что вы скажете: «А в чем проблема?» Ну и прекрасно. Однако если вы приверженец Debian или Fedora, или любой другой системы, то проблемы будут — ну, то есть, будут, если вам потребуется взаимодействие с Excel VBA. Что вы можете предпринять?

Ноэль сказал мне, что Novell работает над включением модели VBA в исходный код стандартной поставки OpenOffice.org, и недавно основал проект продвижения работы Novell по VBA (http://vba.OpenOffice.org) в состав OOo, что позволит большему числу пользователей Excel VBA перейти на открытое программное обеспечение. «Наката Махо [Nakata Maho], разработчик OpenOffice.org, и Ханно Мейер-Туров [Hanno Meyer-Thurow], разработчик Gentoo, помогли в реализации и разработке API», — сказал он мне. Если вы решили установить модель VBA на вашем дистрибутиве, то найдете исходный код на http://go-oo.org, а инструкции по скачиванию на http://wiki.services.OpenOffice.org/wiki/Getting_It. Однако для экономии времени можно сделать вот что:

export CVSROOT=':pserver:anonymous@anoncvs.gnome.org:/cvs/gnome'
cvs login
cvs -z3 checkout -P OOo-build

Вы обнаружите, что у вас создался каталог OOo-build. Полные инструкции по сборке расположены по адресу http://wiki.services.OpenOffice.org/wiki/Building. Процесс достаточно прямолинеен, а если и сложноват, то полнота описания снижает вероятность совершения ошибки. Так как OOo-build — действительно разрабатываемая версия, то вы можете обнаружить, что придется добавить другие приложения - но если что-то потребуется, OOo вам об этом сообщит.

Поэтому на следующем шаге вы идете в каталог OOo-build и запускаете autogen.sh. На моем Debian он не заработал из-за ошибки './autogen.sh: line 18:aclocal:command not found'. Быстрое прочесывание Интернета показало, что лекарство — установка automake:

sudo apt-get install automake

Когда вы заставите работать autogen.sh, следующим шагом будет выбор дистрибутива, на котором планируется установка. Выбирайте из Ark, Ark64, Common, CommonLinux, CommonWin32, Debian, Debian64, DebianSarge, DroplineGNOME, Frugalware, Frugalware64, Gentoo, Mandriva, Mandriva64, NovellWin32, QiLinux, SUSE-10.0, SUSE-10.1, SUSE-64. SUSE9.1, SUSE-9.2, SUSE-9.3, SUSE-PPC, SUSE, Ubuntu, Ubuntu64, UbuntuL10n, translate-org-za-Linux и translate-org-za-win32. Все что вам надо сделать, это запустить autogen.sh с опцией --with-distro:

/autogen.sh --with-distro=DebianSarge

Далее следим за работой autogen.sh и сообщениями об ошибках, а затем устанавливаем недостающие программы:

autogen.sh stops with the error: Install the software:
configure: error: install pam-devel
sudo apt-get install libpam0g-dev
configure: error: install png-devel
sudo apt-get install libpng2-dev

Чтобы отыскать все программы, придется пошарить в Интернете, но на базовую конфигурацию много времени не уйдет.

Далее нужно заставить OOo-build скачать необходимые файлы, это сделать легко: просто запустите ./download. Наконец, запустите make. Ну, не совсем наконец, потому что вы можете получить следующее сообщение об ошибке:

bainm@hector:~/OOo-build$ make
Making all in po
make[1]: Entering directory '/home/bainm/OOo-build/po'
make[1]: *** No rule to make target 'yes', needed by 'all-am'. Stop.
make[1]: Leaving directory '/home/bainm/OOo-build/po'
make: *** [all-recursive] Error 1

Присказка наших дней — «В беде обращайтесь к Google» (если, конечно, вы не в Китае). Я поискал и обнаружил, что у других людей наблюдается та же проблема. К счастью, решение простое: все Makefile содержат строку all-am: Makefile $(SCRIPTS), тогда как она должна быть all-am: Makefile. Чтобы это исправить, надо отредактировать около 25 Makefile’ов — либо написать простой скрипт:

FILES="Makefile */Makefile */*/Makefile"
for FILE in $FILES
do
cat $FILE | sed s/"all-am: Makefile \$(SCRIPTS)"/"all-am: Makefile"/g > $FILE.tmp
mv $FILE.tmp $FILE
done

После этого make должен работать правильно. Однако, если у вас проблемы с программами, можете отключить их с autogen.sh. Потом можете воспользоваться советом autogen.sh — расслабиться и выпить чашку чая — хотя у меня это вылилось в питье чая, прогулку с собакой, кормление кошек и поход в бар.

Вот и все, уважаемый читатель. Агитируйте разработчиков вашего любимого дистрибутива последовать примеру Novell. Примите участие в сообществе взаимодействия с VBA. Или начните использовать новую версию OpenOffice.org.

Если вам интересно узнать о вышеупомянутой TV-карте — она заработала, как только я установил SUSE 10.1. Вообще-то я использую Kaffeine для просмотра каналов — он проще в использовании и стабильнее, чем исходная Windows-версия программы. Ну как тут не любить Linux?


Персональные инструменты
купить
подписаться
Яндекс.Метрика