- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
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
Начнем с простого. Если вы попытаетесь открыть таблицу 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. А как с установкой? Да легко.
Ну, на самом деле не совсем. Я скачал 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.
С первого взгляда вы не увидите ничего необычного (Рис. 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
Вы, возможно, получаете ошибку ‘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.