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

LXF84:OOo Basic

Материал из Linuxformat
Перейти к: навигация, поиск
OOo Basic

Содержание

Используем макросы 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).

Скорая помощь

OOo безразличен к регистру (вне зависимости от поддержки Excel VBA). Однако постарайтесь привыкнуть к использованию заглавных букв, чтобы сделать код более читабельным, например, пишите openNewSheet вместо opennewsheet. Зачем? А чтоб уменьшить вероятность сделать ошибку.

Здесь возникает вопрос: только ли это поддержка 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, то не забывайте, что первой строкой каждого модуля должна быть

Option VBASupport 1

В противном случае вы получите синтаксическую ошибку.

Короче, вы поняли, в чем штука. Если вы пишете на 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?

Облегчите себе жизнь

Если вы не верите, что взаимодействие OpenOffice.org и Excel VBA поможет облегчить вам жизнь, просто гляньте, как легко создать новую таблицу и начать в ней писать:

Dim wSheet as worksheet
Dim wBook as workbook
set wBook = application.workbooks.add
set wSheet = Sheets(0)
wSheet.cells(2,1).value = "Too easy for words"

Изменить шрифты также просто:

wSheet.Range("A1:Z1").Select
With Selection.Font
.Name ="Verdana"
.Size = 14
End With

А как насчет того, чтобы спрятать один из рабочих листов?

Dim wSheet2 as worksheet
set wSheet2 = Sheets(2)
wSheet2.visible = false

Как программист-лентяй, я благодарен людям, выполняющим трудную работу по переносу Excel VBA в OpenOffice.org.

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