OpenOffice.org CalcがExcel VBAをサポート

ExcelユーザがOpenOffice.orgの使用を検討した場合、Microsoft Officeのマクロ言語であるVisual Basic for Applications(VBA)がサポートされていないことが気になるかもしれない。長年にわたってコツコツ蓄積してきた自作のExcelマクロがたくさんあるユーザなら、それが一切使えなくなるのが嫌でOfficeにとどまる、というケースも起こり得る。そんなユーザに、再考の時が来た。Novellが、OpenOffice.orgのソースコードを基に、Excel VBAをサポートするバージョンを独自に開発したのだ。

OpenOffice.org CalcのExcel VBA互換機能の開発は、NovellのNoel Power氏がリーダーを務めている。Noelによると、この互換機能は次のような形で実現されているという。

  • Excel VBAマクロをOpenOffice.org内でネイティブに実行できる。
  • 互換性のあるオブジェクトモデルを提供する。
  • 特に有用で広く使われているAPIを選出して実装することで、互換性モデルを継続的に改良する。
  • ooo-basicで利用できるシンボルを拡張し、互換性APIを取り込む。
  • 核となるooo-basicランタイムに手を加え、Excel VBA構文を処理できるようにする。

Noelは次のように語っている。「Novellは広範なコミュニティに向けてこの機能を推進しています。ソースコードはOpenOffice.org Hackers Pagesからフリーで入手できますし、ビルドの手順はOpenOffice.orgのビルドのページで説明されています。また、NovellブランドのOpenOffice.orgのWindows版にもVBA互換機能が搭載されています」。

新しいエディションのOOoを1からビルドするとしても、その手順は非常に簡単だ。

  1. ソースコードをダウンロードする。
  2. システムに合わせた設定を行う。一連の手順の中では最も手間のかかる部分だが、有用なフィードバックが得られるので、システムに必要な追加ファイルや、インストールされる機能のうちどの部分を無効にするかといったことを判断するだけで済む。
  3. OOoパッケージ本体をダウンロードする(設定さえ済んでいれば、./downloadと入力するだけなので、心配は無用だ)。
  4. アプリケーションをメイクする。

だが、これらの作業すべてを自分で行う必要はないかもしれない。「私が知る限り、現時点では、以下のディストロのOpenOffice.orgにVBA互換機能が搭載されています」とNoelは語る。

  • Ark
  • Debian
  • DroplineGNOME
  • Frugalware
  • Gentoo
  • Mandriva
  • QiLinux
  • Red Hat (FC6)
  • Ubuntu
  • SUSEおよびSUSE SLED

あいにく、VBA互換機能をサポートしているディストロかどうかは、VBAコードを実際に試してみる以外の方法では、簡単には識別できない。Noelは次のように言う。「ooo-basicの管理ツール([ツール]→[マクロ]→[マクロの管理]→[OpenOffice.org Basic])を使用し、ドキュメントに移動してください。ドキュメントにマクロがあり、コメントアウトされていないとしたら、互換機能が有効になっている可能性があります」。

さて、この機能に対応したディストリビューションをインストールするなり、NovellバージョンのOpenOffice.orgを自分のLinuxでビルドするなり、NovellのOpenOffice.orgのWindows版をインストールするなりしたとしよう。その場合、すべてのExcelマクロがCalcで動作するのだろうか。Noelによると、そうではないという。「VBAのサポートは完全なものではありません。でも、一般的な使用パターンの大部分はカバーできていると思います。我々が接するマクロで使われているのは、Excel APIのオブジェクト全体のうちの一部にすぎないケースが大部分です。たとえば、Range、Worksheet、Workbookなどです。我々は、それらのオブジェクトと、その中でもよく使用されるメソッドやプロパティに範囲を絞って対応しています」。

手持ちのExcelスプレッドシートがある場合には、そのファイルを開いて、どんな動作になるか確かめてみてほしい。Excelでドキュメントを開いた場合と同じようにマクロが動作するはずだ。また、Excelを持っていない人のために、Noelからいいサンプルを頂戴した。hypocycloid-demo.xlsというものだ。hypocycloid(内サイクロイド)とは、大きな円に内接して小さな円が転がるときに、内接円の円周上の定点が描く軌跡のことである(そうした模様を描画できるSpirographというおもちゃもあった)。このスプレッドシートでは、さまざまな内サイクロイドを生成できる。VBAに対応したOpenOffice.orgを使用している場合には、すべてのボタンとスライダを使用でき、画面に表示されるイメージが変更されるはずだ。コードはすべてExcel VBAで記述されているにもかかわらずである。

一方、VBAに対応していないバージョンのOpenOffice.orgでhypocycloid-demo.xlsを開くと、どうなるのだろうか。そのバージョンのOpenOffice.orgでも、VBAマクロが含まれているExcelスプレッドシートを開けるが、ボタンを押しても何も起きない。そして肝心なのは、エラーメッセージも表示されないということだ。

OOo Basicのエディタでコードを見てみよう。OpenOffice.orgのメニューから、[ツール]→[マクロ]→[マクロの管理]→[OpenOffice.org Basic]を選択すればよい。

Sub VBA_Library
Rem Sub openWorkbooks (iFiles())
Rem Dim wBook as Workbook
Rem Dim wList as String
Rem Dim iFile as String
Rem
Rem For Each iFile in iFiles
Rem Workbooks.Open iFile
Rem Next iFile
Rem
Rem For Each wBook In Workbooks
Rem wList = wList & wBook.Name & chr(13)
Rem Next wBook
Rem Worksheets("Sheet2").Range("A1") = Now()
Rem msgbox Workbooks.Count & " files open:" & chr(13) & chr(13) & wList
Rem End Sub
End Sub

標準のOpenOffice.orgでは、VBAコードはモジュールで処理される。VBAコードはすべてコメントに変えられ、新しいサブルーチンにカプセル化される。サブルーチンに付けられる名前はモジュール名と同じだ。

一方、VBAをサポートするOpenOffice.orgを使用している場合、様相は一変する。

Option VBASupport 1 
Sub openWorkbooks (iFiles())
    Dim wBook as Workbook
    Dim wList as String
    Dim iFile as String

    For Each iFile in iFiles
        Workbooks.Open iFile
    Next iFile

    For Each wBook in Workbooks
        wList = wList & wBook.Name & chr( 13 )
    Next wBook
    Worksheets( "Sheet2" ).Range("A1") = Now()
    msgbox Workbooks.Count & " files open:" & chr(13) & chr(13) & wList
End Sub
Option VBASupport 1 
Sub openWorkbooks (iFiles())
    Dim wBook as Workbook
    Dim wList as String
    Dim iFile as String

    For Each iFile in iFiles
        Workbooks.Open iFile
    Next iFile

    For Each wBook in Workbooks
        wList = wList & wBook.Name & chr( 13 )
    Next wBook
    Worksheets( "Sheet2" ).Range("A1") = Now()
    msgbox Workbooks.Count & " files open:" & chr(13) & chr(13) & wList
End Sub

このバージョンのOpenOffice.org Calcでは、VBAコードを含むモジュールを読み込んだときに、次のようなコードが追加される。

Option VBASupport 1

この行は、標準のOOo Basicのコードには影響しない。VBAの互換機能を正しく認識するためのものだ。VBAステートメントを使用したい場合や、VBAの方が使い慣れている場合に、Calc用に独自のVBAモジュールを作成するときには、この行を自分で記述する必要がある。

このように、VBA互換機能はたいへん結構なものだが、まだOOoソリューションの主流にはなっていない。Noelはこう語る。「Sunはプロプライエタリなソリューションを用意していますが、欠点もあります。今年のOOoConで、私は、Sunの何人かの開発者とざっくばらんな話し合いを持ちました。そこでは、Sunのソリューションと我々のソリューションを整合させたいという意向が、ある程度は感じられました。私の印象では、我々の手法の方がベターだと先方は感じているようでした(Sunの方式では変換フェーズがあるのに対し、我々の方式ではVBAがネイティブに実行されます)。また、先方は、Sunのソリューションに対する支持をさほど強調していないという印象も受けました。我々は、統合に向けた取り組みのペースを速めたいと考えており、最初の取り組みをこの先数か月のうちに完了させることを目指します」。

「現時点では、ooo-buildを使用している一般的なディストロでのみ互換機能を使用できるという状況です。しかし、さまざまな取り組みの結果、すべての成果をメインのOpenOffice.orgのソースに取り込むという目標にだんだん近付きつつあります。核となる基本ランタイムに対する修正は、"vanilla" OpenOffice.orgへの組み込みがそれなりに進んでいます。一方、互換性APIや一部のフックはまだ組み込まれていませんが、私は、Sunの開発者と密接に連絡を取って、すべての機能を組み込むべく、協力して作業を進めています。これは複雑な機能で、コードのさまざまな部分に関係するので、一筋縄では行きません。時間がかかる作業です」。

OpenOffice.org CalcでのExcel VBAの使用法については、私の著書『Learn OpenOffice.org Spreadsheet Macro Programming: OOoBasic and Calc automation』でも解説している。

NewsForge.com 原文