LibreOffice Calc Chapter 13, Macros ノート

Introduction

Getting Started Guide の Chapter Getting Started with Macros の章では LibreOffice で使用できるマクロ機能を紹介している。この章では、Calc スプレッドシート内でのマクロの使用についてさらなる入門情報を与える。

マクロとは、後で使用するために保存される一連のコマンドやキー操作のことだ。例:開いているスプレッドシートの現在の升目に自分の住所を入力するマクロ。マクロを使用すると、単純なタスクと複雑なタスクの両方を自動化できる。また、Calc に組み込まれていない新しい機能を導入することもできる。

マクロを作成する最も簡単な方法は、Calc の UI を通じて一連の操作を記録することだ。 BASIC 言語の方言である LibreOffice Basic スクリプト言語により記録したマクロを保存する。そして LibreOffice Basic IDE を使用して編集および拡張可能。

マクロを作成する言語としては次の四つのスクリプト言語が対応されている:

  • LibreOffice Basic

  • Python

  • JavaScript

  • BeanShell

本章では LibreOffice Basic に焦点を当てる。

On Visual Basic for Applications (VBA) compatibility

LibreOffice Basic 言語と VBA 言語は BASIC の方言だ。MS Excel で書かれたマクロを LibreOffice で使用したい場合は、まず LibreOffice Basic IDE でコードを編集する必要がある。

VBA で書かれた Excel マクロを変換するためのコツは本章最後に詳しい。

Using the macro recorder

Getting Started Guide の Getting Started With Macros の章にはマクロレコーダーの使用方法と生成された LibreOffice Basic スクリプトの理解方法の例が記載されている。以下の手順では Getting Started Guide のより詳細な説明を省略して Calc スプレッドシート固有の例を示す。スプレッドシートの升目範囲に対して、乗算を伴う特殊な貼り付けを実行するマクロを作成し、保存する。

利用者ノート

Getting Started Guide を先に読んでおいたほうがいいかもしれない。

Note

まず、Options ダイアログボックス LibreOffice‣Advanced ページ でオプション Enable macro recording (may be limited) をオンにしておけ。

  1. Menu バー の File‣New‣Spreadsheet で新しいスプレッドシートを作成する。

  2. 新しいスプレッドシートの Sheet1 の 升目 A1:C3 に次の数値を入力する:

    1

    8

    9

    2

    7

    10

    3

    6

    11

  3. 数値 3 が入っている升目 A3 を選択し、クリップボードにコピーする。

  4. 範囲 A1:C3 のすべての升目を選択する。

  5. Menu バー の Tools‣Macros‣Record Macro で開始。テキストエディターにおけるキーボードマクロ開始のようなものだと考えられる。Record Macro 小窓が現れる。

  6. Menu バー の Edit‣Paste Special‣Paste Special… を選択。Paste Special ダイアログボックス が開く。

  7. Paste 領域で All をオン、Operations 領域で Multiply をオンにし OK ボタン を押す。升目 A1:C3 の値が三倍になる。

  8. 小窓内の Stop Recording を押して収録終了。Basic Macros ダイアログボックス の変種が開く。

    Note

    Basic Macros ダイアログボックス の Save Macros In 領域に既存の LibreOffice Basic マクロが見える。このマクロはライブラリーコンテナー、ライブラリー、モジュール、マクロに階層化されている。各ライブラリーコンテナー名の左側にあるプラスマイナス図像を使用して、そのコンテナー内のライブラリー、モジュール、マクロを見渡せる。

  9. Save Macro In で現在の文書の登録項目を選択する。この例では現在の文書は保存されていないので、既定の名前 Untitled 1 で参照される。

  10. 保存された文書には Standard という名前のマクロライブラリーが含まれる。このライブラリーは必要になるまで作成されないので、この手順の例では、この時点では、新しい文書にはライブラリーが含まれていない。

  11. New Module ボタンを押す。New Module ダイアログボックスが開く。新しいモジュールの名前を入力するか、既定の Module1 のままにする。

    Note

    ライブラリー名、モジュール名、マクロ名に使用可能な文字が規定されているので注意。一般的なプログラミング言語にありがちな規則だと思っていい。

  12. OK ボタン を押して新しいモジュールを作成する。現在の文書にはマクロライブラリーが存在しないため、Standard ライブラリーが作成される。

  13. Basic Macros ダイアログボックス の Save Macro In 領域で新しく作成したモジュールの登録項目を選択し、Macro Name ボックスにテキスト PasteMultiply を入力し、 保存 (S) ボタン を押す。

マクロは PasteMultiply という名前で、Untitled 1 文書の Standard ライブラリー内の新しく作成されたモジュールに保存される。

Note

LibreOffice で使用されている部品モデルは UNO であり、マクロレコーダーはほとんどのコマンドに UNO ディスパッチャーを使用している。しかし、この技術的手法には問題が二つある。一つはディスパッチが完全に文書化されておらず、変更される可能性があることだ。もう一つはマクロの記録中に開かれるダイアログボックスの値のいくつかをレコーダーが無視することだ。したがって、複雑なマクロを記録しても、実際にはすべてが期待どおりに実行されないことがある。詳細については Help の索引を検索しろ。

Write your own functions

Create a function macro

マクロを作成し、関数を呼び出すようにそれを実行することが可能。単純な関数マクロの定義手順:

  1. 新規スプレッドシートを作成し、CalcTestMacros.ods という名前で保存して、開いたままにする。

  2. Menu バー から Tools‣Macros‣Organize Macros‣Basic… を選択して Basic Macros ダイアログボックス を開く。この状況での Basic Macros ダイアログボックス の間取りは、Record Macro ダイアログボックスの Stop Recording ボタンを押したときのものとは異なることに気をつけろ。

  3. Macro From 領域には、現在開いている LibreOffice 文書に関連するものも含め、利用可能なマクロライブラリーコンテナが一覧される。My Macros には使用者が作成または LibreOffice に追加したマクロが含まれ、複数の文書で使用可能だ。LibreOffice Macros には LibreOffice のインストール時に含まれている、変更されるべきではないマクロが含まれる。

  4. Organizer… を押す。Basic Macro Organizer ダイアログボックス が開く。

    Libraries タブを開く。Location ドロップダウンリストで現在文書に合わせる Library 欄の一覧が更新され、空の Standard ライブラリーの名前が示される。

  5. New… を押して New Library ダイアログボックスを開き、この文書の新規ライブラリーを作成する。

  6. 意味のある名前を記入して OK ボタン を押してライブラリーを作成する。この説明中では名前を AuthorsCalcMacros とする。 Basic Macro Organizer ダイアログボックス の Library 領域が更新され、新しく作成されたライブラリーの名前が表示される。ライブラリー名は 30 文字まで使用できる。ダイアログボックスには名前の一部しか表示されない場合がある。

  7. LibraryAuthorsCalcMacros 項目を選択し、Edit… ボタン を押してライブラリーを編集する。Module1Main という名前のマクロが自動的に生成する。LibreOffice Basic 統合開発環境 (IDE) が開く。

    LibreOffice Basic IDE の既定構成は以下のとおり:

    • Menu バー

    • ツールバー二つ。Macro ツールバーにはプログラムを編集したりテストしたりするための図像各種が用意されている。

    • Object Catalog 窓では必要なライブラリーコンテナー、ライブラリー、モジュール、マクロを選択できる。

    • Editor LibreOffice Basic のプログラムコードを編集する。左側の列はプログラムコードにブレイクポイントを設定するために使用する。

    • Watch 窓にはシングルステップ処理中の変数や配列の内容が表示される。

    • Call Stack 窓は関数のコールスタックに関する情報を与える。

    • タブが並ぶ部分

    • Status バー

    LibreOffice Basic IDE は LibreOffice Basic マクロの開発とデバッグのための強力な機能を搭載している。この機能の詳細については Help を参照しろ。

  8. Editor Window でコードを修正する。重要な追加点は、値 5 を返す NumberFive 関数の作成だ。

    Tip

    Option Explicit 文はすべての変数を使用する前に宣言することを強制する。 Option Explicit が省略された場合、変数は最初の使用時に自動的に Variant 型として定義される。

  9. LibreOffice Basic IDE 内で Menu バー の File‣Save を選択するか、Standard ツールバー の Save 図像をクリックするか、Ctrl + S を押して、変更した Module1 を保存する。

Using a macro as a function

セルを選択し、数式バーにマクロ呼び出しコードを入力すると、Calc がマクロを検出して呼び出し、そのセルに結果を表示する。

新しく作成した CalcTestMacros.ods スプレッドシートを使用して、セルを選択し、数式 =NumberFive() を入力する。Calc がマクロを検出して呼び出し、そのセルに結果 (5) を表示する。

Tip

関数名は大文字と小文字を区別しない。図では関数名は NumberFive と入力されているが、Calc は Formula バー に NUMBERFIVE と表示する。

Macro security warnings

利用者ノート

本節の内容が再現できない。実際にスプレッドシートを開き直すと本書のスクリーンショットのようなものは現れず。シート上部に警告が表示される。そこには Enable Macros ボタンのようなものは存在しない。

これは Options ダイアログボックス LibreOffice‣Security ページ の Macro security… を押して、Trusted Sources タブの信用ファイルパス一覧を操作して回避することにする。

Calc 文書を保存して閉じ、再度開け。Options ダイアログボックス LibreOffice‣Security ページ にある Macro Security を使用してアクセスした Macro Security ダイアログボックス の設定によっては警告されることがある。

警告ダイアログボックスに Enable Macros ボタンがある場合、それを押す必要がある。文書にマクロが含まれることが予想されない場合は、マクロがウイルスである場合に備えて、Disable Macros を押す方が安全だ。

設定により無効である旨の警告の場合、文書内でのマクロ実行は許可されない。OK ボタン を押して警告を消す。

マクロを無効にして文書を読み込むと、Calc はマクロ関数を見つけることができず、影響を受けるセルにテキスト #NAME? を表示してエラーを指摘する。

Loaded / unloaded libraries

スプレッドシートを開くとき、利用可能なライブラリコンテナーで見つかるマクロライブラリーすべてを開かない。代わりに、自動的に My Macros ライブラリコンテナー内の Standard ライブラリーと、文書自体の Standard ライブラリーしか読み込まない。

CalcTestMacros.ods スプレッドシートを再度開くと、Calc には NumberFive という名前の関数が含まれていないため、この関数があるかどうか、表示され、読み込まれているすべてのマクロライブラリーが調べられる。LibreOffice Macros, My Macros, および文書にロードされたライブラリーで、適切な名前の関数があるかどうかが調べられる。本章での初期実装では NumberFive 関数は AuthorsCalcMacros ライブラリーに格納されている。そのため NumberFive 関数は見つからず、呼び出された升目にエラー状態が表示される。

Menu バー Tools‣Macros‣Organize Macros‣Basic… を使用して Basic Macros ダイアログボックス を開け。ロードされたライブラリーの図像は、ロードされていないライブラリー (AuthorsCalcMacros) のそれとは見てくれが異なる。

ライブラリーをロードするために AuthorsCalcMacros の横にある展開図像をクリックしろ。図像の見てくれが変わり、ライブラリーがロードされたことを示唆する。Close ボタン を押して Basic Macros ダイアログボックス を閉じろ。

最初の実装では =NumberFive() を含む升目はまだエラーになっている。Calc は升目を編集するか何らかの方法で変更しない限り、エラー中のセルを再計算しない。通常の解決策は、関数として使用されるマクロを Standard ライブラリーに格納することだ。マクロの規模が大きい場合や数が多い場合は、希望する名前のスタブが Standard ライブラリーに格納される。スタブマクロは実装を含むライブラリーをロードし、実装を呼び出す。次の手順だ。

  1. Menu バー Tools‣Macros‣Organize Macros‣Basic… を使用して、Basic Macros ダイアログボックス を開く。 NumberFive マクロを選択し、Edit… ボタン を押して編集用のマクロを開く。

  2. LibreOffice Basic IDE が開く。キャレットは Editor 窓の関数 NumberFive の行に置かれる。関数のコードが TODO と一致するように、NumberFive の名前を NumberFive_Implementation に変更する。

  3. LibreOffice Basic IDE の Standard ツールバー の Select Macro ボタンを押して Basic Macros ダイアログボックス を開く。

  4. CalcTestMacros.ods 内の Standard ライブラリーを選択し、 New ボタンを押して新しいモジュールを作成する。CalcFunctions など意味のある名前を入力し、OK ボタン を押す。Calc は自動的に Main という名前のマクロを作成し、編集用にモジュールを開く。

  5. Standard ライブラリーの CalcFunctions モジュールに AuthorsCalcMacros ライブラリーがまだロードされていなければロードし、実装関数を呼び出すマクロを作成する。TODO

  6. 保存して閉じ、Calc 文書を再度開く。今度は、マクロが有効になっていれば、 NumberFive 関数は期待どおりに動作する。

読者ノート

スプレッドシートを開くとロードされるマクロライブラリーは次の二種類だ:

  • My Macros ライブラリー容器内の Standard ライブラリー

  • 文書自身の Standard ライブラリー

それゆえ、先ほどのスプレッドシートを再度開くと、マクロ関数呼び出しのセルは #NAME? エラーとなる。これを修正する手順は本書のように二段階に分かれる:

  1. Basic Macros ダイアログボックス を開いて、ツリーノードを選択することで対象ライブラリーをロードする。

  2. マクロ実装を次のように修正する:

    • 本体実装を MyMacros/Standard/CalcFunctions に移転する。

    • 旧関数はそのラッパーとする。

Passing arguments to a macro

本文で示されている関数で用いられている重要な技法とは:

  1. 仮引数に Optional キーワードを付ける。

  2. オプション引数を関数 IsMissing で実引数が与えられたかをチェックする。

  3. 関数 IsArray で値が配列であるかどうかをチェックする。

  4. 関数に PositiveSum(A2:B5) のように範囲が渡される場合に備え、関数 LBoundUBound を用いて配列の境界を決定する(前者は 1 であることが確定しているが、コードの一貫性を高めるためにこう書く)。

本書で次に示されている関数のように、引数リストは一般的なプログラミング言語のそれのように記述される。

Arguments are passed as values

Calc からマクロに渡される引数は常に値 (by-value) だ。つまり、どのセルが使用されたかを知ることはできない。どのセルが参照されたかを知る必要がある場合は、範囲を文字列として渡し、その文字列を解析して、参照されたセル内の値を取得するなどする。

Writing macros that act like built-in functions

Calc はマクロを関数として検出、呼び出すが、組み込み関数としての振る舞いはしない。例えば、マクロは関数一覧に現れない。

Deleting LibreOffice Basic macros

マクロを削除したい場合とモジュールを削除したい場合がある。不要なマクロを削除する手順は:

  1. 上述のように Macros ダイアログボックスを開く。

  2. 削除対象のマクロを選択して Delete を押す。

  3. 確認で Yes ボタン を押す。

  4. Close ボタン を押す。

不要なモジュールを削除する手順:

  1. 上述のように Macros ダイアログボックスを開く。

  2. Organizer を押して Basic Macro Organizer ダイアログボックス を開く。

  3. Modules タブが開いているので、削除対象モジュールを選択する。

  4. Delete を押す。

  5. 確認で Yes ボタン を押す。

  6. Close ボタン を押す。

Accessing cells directly

LibreOffice の内部オブジェクトに直接アクセスして、Calc 文書を操作できる。

  • ThisComponent.getSheets() によってシートにアクセスする。

  • getCellByPosition(col, row) で特定の行と列のセルを得る。

Tip

セルオブジェクトのメソッドはとりあえず次を知っておくといい。適切な値を設定するには、対応する set 関数を使用する:

  • getValue()

  • getString()

  • getFormula()

シートオブジェクトの getCellRangeByName メソッドはセルまたはセル範囲を返す。セル範囲は配列の配列としてデータを返すので、二次元の配列として扱うよりも面倒だ。

Tip

マクロが Calc 関数として呼び出される場合、関数を含むセルを除き、マクロが呼び出されたシート内のセルの値を変更することはない。

Sorting

ソートをコードで実現しようとすると、本書のように案外いろいろなオブジェクトの面倒面倒を見なければならないということを覚えておけば今はいいだろう。

Overview of BeanShell, JavaScript, and Python macros

Introduction

ここまで見てきたコードは LibreOffice Basic という言語だ。他にも次の言語を対応している:

  • BeanShell

  • JavaScript

  • Python

マクロの構成は四つのスクリプト言語すべてで同じだ。LibreOffice Macros コンテナーには LibreOffice のインストール時に供給されるマクロすべてが含まれる。My Macros ライブラリコンテナーには LibreOffice 文書で使用できるマクロを含む。各文書には他の文書では使用できないマクロを格納することもできる。

先述のマクロ記録機能を使用すると Calc は LibreOffice Basic でマクロを作成する。その他のスクリプト言語を使用するには、自分でコードを記述する必要がある。

Tools‣Macros‣Run Macro… コマンドは上記の言語のいずれも実行可能だ。

Tools‣Macros‣Edit Macros… コマンドは Basic マクロだけ選択、編集可能だ。

LibreOffice で使用されているコンポーネントモデルは UNO として知られている。スクリプト言語の LibreOffice マクロは UNO 実行時 API を使用する。XSCRIPTCONTEXT インターフェイスが四言語すべてのマクロスクリプトに対して用意され、文書に対して何らかの動作を実行するために必要となるさまざまなインターフェイスへのアクセス手段を備えている。

読者ノート

LibreOffice の前身である OpenOffice から存在するものらしい?

BeanShell macros

BeanShell is a Java-like scripting language that was first released in 1999.

Menu バー から Tools‣Macros‣Organize Macros‣ BeanShell… を実行すると BeanShell Macros ダイアログボックスが開く。

利用者ノート

JRE が有効になっている必要がある。無効なら確認ダイアログボックスが開く。

Edit… ボタン を押せばデバッグウィンドウが開く。

JavaScript macros

同じような操作で JavaScript Macros ダイアログボックスが開く。 Edit… ボタン を押すと Rhino JavaScript デバッガーが開く。

Python macros

同じような操作で Python Macros ダイアログボックスが開く。

Python スクリプトを編集およびデバッグする機能は、現在のところ LibreOffice の標準 UI に統合されていない。愛用テキストエディターや外部 IDE を使用して Python スクリプトを編集すればいい。Alternative Python Script Organizer (APSO) 拡張機能は、特に文書に埋め込まれた Python スクリプトの編集を容易にする。APSO を使用すると、愛用コードエディターを設定したり、統合 Python シェルを起動したり、Python スクリプトをデバッグしたりすることが可能だ。

詳細については LibreOffice Help システムで Python macros を検索し、 <https://wiki.documentfoundation.org/Macros/Python_Design_Guide> の関連節を見ろ。

利用者ノート

HelloWorld を実行したら Writer が起動する。なぜだ?

ScriptForge library

ScriptForge ライブラリーの目的は LibreOffice API やコマンドを学ぶことなく、マクロの作成を簡単にすることだ。

ScriptForge ライブラリーは LibreOffice Basic と Python を対応している。各サービスには特定のトピックに関連するメソッドやプロパティーがある。

  • Getting Started Guide の関連章に ScriptForge に関する補足説明と例が記載されている。

  • LibreOffice ヘルプシステムの索引で ScriptForge を検索すると情報があるはずだ。

Built-in object inspector

プログラマーにとって、UNO オブジェクト型や、サービス、メソッド、性質を発見することは主要な課題の一つだ。

Menu バー から Tools‣Development Tools を実行するとビューワーが開く。メインウィンドウ下部に入渠している。

ウィンドウの左側は DOM 案内図で構成され、使用者は文書内の物全てを渡り歩くことができる。物が選択されるとそれに関する次の情報が窓右側のタブに示される:

  • 実装されているインターフェイス全ての名前

  • 支援するサービス全ての名前

  • 利用可能な性質全ての名前と型

  • 呼び出せるメソッド全ての名前、引数、戻り値の型

DOM 案内図を使って物を検査する代わりに、Current Selection ボタンを切り替えることで文書内で現在選択されている物を直接検査することが可能。

Getting Started GuideGetting Started with Macros には組み込み物検査に関する追加情報が含まれている。より詳細な情報や例は LibreOffice Help の索引で development tools を検索しろ。

Working with VBA macros

Calc が Excel ワークブックを読み込むにもかかわらず、その VBA が Calc で動作しない主な理由は、Calc がワークシート上のセルなどのワークブック部品にアクセスするために異なる仕組みを用いているためだ。

VBA コードを変換するには LibreOffice で VBA コードをまず読み込む必要がある。

Loading VBA code

Options ダイアログボックス Load/Save‣VBA Properties ページでは LibreOffice で開いた MS Office 文書のマクロを保持するかどうかを選択可能。

Load Basic code をオンにすると LibreOffice でマクロを編集できる。変更したコードは ODF 文書に保存されるが、Microsoft Office 形式に保存した場合は保持されない。

Save original Basic code をオンにする場合、マクロは LibreOffice では動作しないが、ファイルを Microsoft Office 形式で保存すると変更されずに保持される。

VBA コードを含む Microsoft Word または Excel ファイルをインポートする場合、 Executable code をオンにすることができる。通常、コードは保存されるが、機能停止状態になる [1] のに対し、オンにするとコードが実行可能状態になる。

Save original Basic codeLoad Basic code より優先される。両方ともオンであり、LibreOffice で無効化されたコードを編集する場合、 Microsoft Office 形式で保存するときに元の VBA コードが保存される。

存在し得るマクロウイルスを Microsoft Office 文書から除去するには Save original Basic code をオフにする。文書は VBA コードなしで保存される。

Option VBASupport statement

Option VBASupport 文は LibreOffice Basic が一部の VBA 文、関数、オブジェクトを対応することを指定する。

Note

VBA に対する支援は完全ではないが、一般的な使用例の大部分に及ぶ。

VBASupport が有効である場合、LibreOffice Basic 関数の引数および戻り値は VBA 関数の引数および戻り値と同じになる。無効になっている場合、LibreOffice Basic 関数は VBA 関数とは異なる引数や戻り値を受け取ることがある。

VBA UserForms (LibreOffice Basic Dialogs)

フォーム(ダイアログボックス)は VBA オプションでは自動的に変換処理されない。本書のコードのように手動で直せ。

Conclusion

本章に登場した各話題は本来は一章を割り当てるような大きいものだ。

LibreOffice 拡張機能のウェブサイト には LibreOffice Basic クイックレファレンスカード集がある。


章末注