OpenOffice.org Basic

メインページ > 工学 > 情報技術 > プログラミング > OpenOffice.org Basic OpenOffice.org > OpenOffice.org Basic
OpenOffice.org Basic ガイド
OpenOffice.org のマクロ記述用に準備されているものは、BASICの言語仕様を近代的に拡張したものです。
コードを書くには、まず、いくつかの決まり事を覚える必要があります。 どの言語もそうですが、変数の使い方、条件分岐、繰り返し処理、関数定義、算術演算などの仕方です。コメントの記入の仕方も覚える必要があるかもしれません。この章では、そうした、あらましを記述します。
まず、BASIC では大文字・小文字の区別がありません。OpenOffice.org Basic の場合に限っていえば、UNO API に関してのみ大文字・小文字の区別が行われます。
次に、サブルーチンと関数の説明ですが、 OpenOffice.org Basic では、返り値を伴うものを関数、返り値を伴わないものをサブルーチンとしています。 それ以外は同一で、双方とも1行からなる命令文の集まりです。
下のコードを元に説明すると、Main で呼び出した時、 命令文1、命令文2、命令文3 の順に実行されるところが共通点で、'Main = 返値' のところが相違点です。ここで気を付けなければならないのは、'return' などの予約語を使い、呼び出しもとへ返すのではなく、自身の定義名に代入するという形で行うところです。繰り返しになりますが、関数での値の戻し方は、'定義名 = 返値' です。

コメントの挿入は、'REM'、または、「'」(アポストロフィ) を用いて行います。 この際、行末までがコメントとして扱われます。
複数の命令文を一行に記述したい場合、各命令文を ':' (コロン)で区切ります。
複数行に渡る一つの命令文を記述したい場合には、行末を 「_」(アンダースコア) で終わらせ、改行します。
下のコードは、一行に 'print "Hello " & "World!"' と記述するのと同じ意味になります。
数値の表現の仕方は、次のようになります。
数値を8進数や、16進数で記述したい場合、'&O' や '&H' を用いて行います。16進数で15を表現するには、'&HF'、8進数で9を表現するには、'&O11' となります。(2進数での記述は、サポートされていないようです。)
OpenOffice.org Basic では、変数、定数、関数、サブルーチンの名前の付け方に多少の取り決めがあります。 (ここでの命名規則は、UNO (Universal Network Objects) API などには、あてはまりません。)
変数とは、何度も値をとりえる別名のようなものです。
OpenOffice.org Basic では、変数は宣言することなく用いることができます。この場合、値の型は、変化型 (Variant)となり、代入される値により、ある程度、適切な型として扱われます。また、宣言のない変数の使用を禁止したい場合には、'OPTION EXPLICIT' という一文を用います。
下のコードでは、宣言なく、変数 i を使用しています。また代入のたび、型も変化していることに注目してください。
'OPTION EXPLICIT' の用い方は、以下のようになり、評価後、効力を発揮します。
変数の宣言とは、予約語 'DIM' を用いて、名前や型を明確にすることです。
構文は、以下のようになります。
型指定を省略した場合、変化型 (Variant) となります。
用い方は、次のようです。
また、1行で複数の変数を宣言することもでき、その場合、各変数を ','(コンマ) で区切ります。
宣言後の初期値は、文字列で ””となる以外は、0で初期化されます。
予約語、'STATIC' で宣言された変数は、静的変数として、プロシージャ終了後も値が保持されます。
構文は、次のようです。
通常の宣言では、変数の値は、プロシージャ終了後に消去されますが、 静的変数として宣言されたものは、プロシージャ終了後も値が保持され、次回に再利用できます。
型とは、表現できる値を決めるためものです。
個別の型には、整数、長整数、単精度浮動小数、倍精度浮動小数、通貨、日付、真偽、文字列、オブジェクトと、9つあり、すべての型に対応できるものとして、変化型 (Variant) と呼ばれる型が用意されています。また、この他にもユーザ定義型変数と呼ばれるものがあります。
型指定子とは、簡潔に型を表現する1文字の記号のことです。
それぞれのデータ型の特徴を表にすると、次のようになります。
構文は以下のようになります。
実際の用い方は、次のようになります。
配列とは、複数の要素からなるひとつの固まりのことで、各要素は、添字を用いて区別します。添字とは、配列内の値を特定するために用いる数字です。実際の値の特定の仕方は、配列変数を 'a' とした場合、'a(0)' は、'a(0)' の値を意味します。 宣言には、通常の 'DIM' を用い、変数名の後に、'()' を付け、確保したい用素数も一緒に記述します。 また、他の言語のように、添字は 0からのみ割り振られるのではなく、宣言の仕方によっては、0以外の数から始まる配列を作ることもできます。その場合、'DIM a(5 TO 10)' のように宣言します。
OpenOffice.org Basic 1.1.3 では、配列の添字の最大値は、16368とされています。
構文は、次の通りです。
実際の宣言の仕方は、次のようになります。
宣言ではなく、関数を用いた作成も可能で、'DimArray' と 'Array' 関数が用意されています。DimArray は、各次元の要素数を指定し、すべてが空の値からなる配列を返します。Array 関数では、指定した値で要素を確保し、配列を返します。 双方とも、返す値の型は、変化型 (Variant)となり、それ以外の型には代入できません。(Object型には代入できますが、参照できなくなります。)
サンプルコードは、次のようになります。
その他に、配列に係わる関数として、'IsArray()'、'UBound()'、'LBound()' が用意されています。 'IsArray()' は、変数が配列かどうかを調べ、'UBound()'、'LBound()'は、配列の各次元の最大・最小のインデックスを返します。
変数には、有効となる範囲が存在します。 有効となる範囲とは、変数が存在しており、参照できるかどうかを表しています。 通常の宣言では、プロシージャ (関数・サブルーチン) 内であれば、プロシージャ内のみ、プロシージャ外であれば、すべてのモジュール内で有効な変数を定義しています。
これに対して、有効な範囲を特定して変数を宣言することもでき、 その場合、'GLOBAL'、'PUBLIC'、'PRIVATE' といった予約語を用いて変数を宣言します。 それぞれの意味は、セッションの終了以内、すべてのモジュール内、該当モジュール内となります。
構文は、次のようになります。
変数の有効範囲をコードで示すと、次のようになります。
予約語 'REDIM' を用いることで、変数を再宣言することができます。一度宣言された変数を、別の型としたり、配列の要素を増やすために宣言し直すのに利用できます。
構文は、予約語 'REDIM' を用いること以外、変数宣言の場合と同一です。
実際の用い方は、次のようになります。
WITH ステートメントは、入力の省略に使用します。
WITH から END WITH までをブロックとし、WITH 以降、変数名で示す名を、親ノードとして持つ要素それぞれに対し、定義名を省略し、アクセスすることができます。
構文は以下のようになります。
サンプルコード
定数とは、一度しか値を決められない定義名のようなものです。
型宣言は必要とせず、数値か文字列の値を設定することが可能です。有効となる範囲は、プロシージャ内での定義であれば、プロシージャ内のみ有効となり、プロシージャの外であれば、モジュール内で有効な定数を定義できます。 また、同一名での2重定義がある場合、プロシージャ内での定義が優先されます。
構文は、次のようになります。
実際の用い方は、次のようになります。
プロシージャとは、ある処理単位を、一つにまとめたものに対して付けられる呼び名で、ここでは、サブルーチンと関数を指すものとします。サブルーチンも関数も意味するところは似ており、どちらも、想定した機能を実現し、一つにまとめる働きをもっています。こうすることで、次回から、同様の処理が必要となる場合、以前作った関数やサブルーチンを呼び出すのみとなり、コード作成時間の短縮や、簡略化などに役立ちます。
また、サブルーチンと関数の違いは、値を呼出元へ返せるかどうかで、値を返せるのが関数、返せないのが、サブルーチンとなっています。つまり、命令文1、命令文2、命令文3と順に実行されるところが共通点で、'Main = 返値' と書かれたところが相異点となるわけです。

プロシージャの呼び出し方は、定義名を記述するだけです。仮に名前が、'Foo' であった場合、'Foo()' や 'Foo' と記述します。値を渡す必要があるときには、定義名の後の括弧の中に、渡したい数だけ、値か変数を記述します。複数になる場合には、”,” (コンマ)で区切る必要があります。

引数とは、プロシージャ呼出し時に渡す値のことです。'Foo(a, b, c)' の場合、a、b、cが引数となります。

引数が必要となる場合には、定義の際に記述します。記述の仕方は、受け取りたい引数の数分、変数を”,”(コンマ)で区切り、必要引数があることを示すだけです。下の例では、a, b, c のように、3つの引数を伴う呼び出し方を指定しています。また、このような場合には、引数を省略できません。
省略してもよい引数を定義するには、予約語 'OPTIONAL' を用います。cを省略してもよいと宣言するためには、以下のようになります。
また、受け取る引数は、型付きで指定することもできます。その場合、受け取る値と型が一致しなければエラーとなります。次の場合には、変数 a は整数、b は文字列、c は省略可能で、どの型でもよいことになります。
引数の渡し方には、'値渡し'と'参照渡し'と呼ばれるものがあります。
値渡しでは、引数で指定した変数などの値を複製して利用するのに対して、参照渡しでは、呼び出し元の値は複製せず、参照することで利用します。つまり、参照渡しでは、プロシージャ内で値を変更すれば、呼出元の値自体も変えてしまうということです。明示しない限りは、この参照渡しとなり、予約語 'ByVal' で示した時のみ値渡しとなります。
'参照渡し'と'値渡し'の違いをコードで示すと次のようになります。

サブルーチンとは、複数の処理を記述し、一つのまとまりにしたものです。'SUB ルーチン名' から、'END SUB' までが、処理内容となります。引数は、受け取らなくてもよく、その場合、ルーチン名以降の括弧は省略できます。
定義の仕方は、次のようになります。
下の例では、”こんにちは、何何”と出力します。
関数の特徴は、サブルーチンの考え方に加え、値を返せるところにあります。値の返し方は、'return' などの予約語は用いず、定義名に代入する形となります。すなわち、'定義名 = 返値'となるわけです。また、返す値の型を指定できるところも異なっている点です。
'FUNCTION 関数名' から 'END FUNCTION' までが、処理内容となります。引数は省略できます。また、値を返す必要もないため、サブルーチンと、まったく同じに用いることも可能です。
定義の仕方は、次のようになります。
給料から、1月の生活費を控除する関数を考えてみました。
算術演算とは、足し算、引き算などの数値計算のことです。
OpenOffice.org Basic で使える算術演算子は、7つあり、 それぞれ、'+'、 '-'、'*'、'/'、'\'、'^'、'MOD' となります。 これらの意味は、加算、減算、乗算、除算、整数除算、累乗、剰余です。
加算とは、足し算のことで、'1 + 1 = 2' です。
減算とは、引き算のことで、'2 - 1 = 1' です。
乗算とは、掛け算のことで、'2 * 2 = 4' です。
除算とは、割算のことで、'4 / 2 = 2' です。
整数除算とは、小数部を切り捨てた割算のことで、'2.2 \ 1.1' では、'2 / 1' となります。
累乗とは、指数を用いた掛け算のことで、'3 ^ 3 = 3 * 3 * 3 = 27' です。
剰余とは、割った際の余りで、'5 MOD 2 = 1' です。 説明すると、5 割る 2 は、2 余り 1 ということです。
これら演算子の優先順位ですが、'+'、'-'、'*'、'/'、'\'、'^' は通常の計算の優先順位と同じです。 'MOD' ですが、この優先順位は、'+'、'-' より高く、'*'、'/'、'\'、'^'より低くなっています。 従って、'2 + 7 MOD 3' は、2 + (7 MOD 3)であり、 3 になります。'7 MOD 5 * 3' は、テンプレート:7 MOD (5 * 3)であり、 7 となります。

比較演算とは、等符号などを挟み左辺と右辺の大小を比較することです。
OpenOffice.org Basic で、比較に使える演算子は、6つ用意されており、 '<'、 '>'、 '<='、 '>='、 '<>'、 '='、となります。 それぞれ、'より小さい'、'より大きい'、'以下'、'以上'、'等しくない'、'等しい'を意味します。
使い方は、 '返値 = 左辺値 比較演算子 右辺値' です。 返値は、等式が真であれば -1、偽であれば 0 となります。
下のコードで説明すると、n の値は 5、5 は 0 より大きいので、i の値は -1 となります。
論理演算とは、真(1)か偽(0)、いずれかの状態を掛け合わす演算のことです。プログラミングでは、値を2進数で考え、各ビットに対し演算を行う、ビット演算のことを指しています。
この論理演算は、ブール型どうしの演算、ビットどうしの演算、両方に利用します。
演算子は、全部で6つ用意されており、それぞれ、論理積 (AND)、論理和 (OR)、排他的論理和 (XOR)、否定 (NOT)、論理等価演算 (EQV)、論理包含演算 (IMP)となります。

論理積とは、双方の値が真(1)の時のみ、真(1)となる演算です。
構文は、次のようです。
真理値表は、以下のようになります。
ビット演算では、次のようになります。

論理和とは、一方の値が真(1)となれば、真(1)となる演算です。
構文は、次のようです。
真理値表は、次のようになります。
ビット演算では、次のようになります。

排他的論理和とは、両方の真偽が異なる場合に真(1)となる演算です。
構文は、次のようです。
真理値表は次のようになります。
ビット演算では、次のようになります。

否定とは、真(1)なら偽(0)、偽(0)なら真(1)となる演算です。
構文は、次のようです。
ビット演算では、次のようになります。
論理等価演算とは、双方が真(1)、または、双方が偽(0)となった時のみ真(1)となる演算です。
構文は、次のようです。
真理値表は、次のようになります。
ビット演算では次のようになります。

論理包含演算とは、一つ目の値が真(1)で、二つ目の値が偽(0)の時のみ、偽(0)となる演算です。
構文は、次のようです。
真理値表は、次のようになります。
ビット演算では次のようになります。 (数値で演算すると成り立ちませんでしたが、値に変数を使うと成り立ちます。)

文字列の連結
構文は次のようになります。
'+' は、加算でも使用されるため、'&' での文字列連結の方が、意味がわかりやすいでしょう。
文字列の削除
文字列の抽出
条件分岐とは、ある条件に基づいて実行するブロックを変更することを意味しています。
OpenOffice.org Basic で使用できる分岐構文は、'IF' と 'SELECT' となります。
二つの違いは、 何をもとに実行ブロックを変化させるかで、 'IF' では、条件式、'SELECT' では、値をもとに変化させるのが一般的な使い方です。
同様に使用することもできますが、 'IF' では、条件式の値により真偽を判定するため、数値以外の値をとることはできません。 一方、'SELECT' では、'CASE' に続くものとして、数値以外の値をとることができます。

'IF' 文は、条件式をもとに、実行ブロックを変化させるのに用います。
構文は、次のようになります。
'IF' から 'END IF' までがひとつのブロックのように作用し、 上から順に、条件式が評価されます。 条件式が 真(-1) となると該当するブロックが実行され、その他は無視されます。 また、用意したすべての条件式が 偽(0) となり、かつ、'ELSE' がある場合、このブロックが実行されます。
'ELSE' 句を定義したあと、再び、'ELSEIF' 句を定義することはできません。
ですから下の例は、エラーとなります。
'IF'、'ELSEIF' に続く値は、数値 かつ 0以外 (マイナスも含む) の値であれば、 真だと判定されるため、けして TRUE (-1) だけが真となるわけではありません。
下の例で説明すると、0 は、偽だと判断され、12は真であると判断されます。
同様に、-12 も真であると判断されます。
実際の用いられ方は、以下のようになります。
'SELECT' 文は、値をもとに実行ブロックを変更するのに用います。
構文は、以下のようになります。
'SELECT CASE' で指定した値と同じものを、上から順に 'CASE' 行で探し、 値が同じなら、対応するブロックを実行します。一つのブロック実行後は、 その他のブロックを無視します。 どの値も異なる場合、'CASE ELSE' 句があるようなら、そのブロックを実行します。
また、'SELECT CASE' から 'END SELECT' までが、ひとつのブロックのような働きをします。
実際の使い方は、次のようになります。
'SELECT' は、'IF' と違い、'CASE' の後に数値以外の型をとることができます。 そのため、'IF' において、'IF Lang = "日本語" THEN' の表現を、'CASE "日本語"' として、 短く、わかりやすく表現できます。

繰り返し処理とは、ある条件で、同一ブロックを繰り返し実行することを意味しています。
OpenOffice.org Basic で使えるものには、3つあり、それぞれ、'FOR'、'WHILE'、'DO' となります。
'FOR' は、数値をもとにした繰り返し処理を行い、 'WHILE' は、条件式が真の間、繰り返し処理を行います。 また、'DO' は、'WHILE' より広い意味で条件式をとらえ、繰り返し処理を行えます。
繰り返し処理から抜けるには、'EXIT' キーワードを使用します。

'FOR ... NEXT' 文は、カウンタの値をもとにした繰り返しを行います。
繰り返し処理から抜けるには、'EXIT' キーワードを用い、'EXIT FOR' とします。
構文は、以下のようになります。
ブロックを実行するたびに、カウンタの値が増減するというのが、その仕組みで、 値が終了値を越えると終わります。値と終了値が等しい場合、もう一度ブロックが実行されます。
終了値を越えるというのは、 'STEP' での指定が正の数であれば、正の方向に、負の数であれば、負の方向に越えることを意味します。 つまり、'STEP 1" であれば、プラスの方向、'STEP -1' であれば、マイナスの方向を指します。
下の例で説明すると、'STEP' での指定が -1と、負の方向を指しているため、 'TO' で示す -2 より小さい数になるまで、ブロックが実行されます。 ですから、この例でのブロックの実行回数は、4回です。
'WHILE ... WEND' 文は、条件式が真の間、繰り返しを行います。
繰り返し処理から抜ける、'EXIT' キーワードを用いることはできません。
構文は、以下のようになります。
実際の使い方は、以下のようになります。
'DO ... LOOP' 文は、条件式を用いた繰り返しを行います。
繰り返し処理から抜けるには、'EXIT' キーワードを用い、'EXIT DO' とします。
'DO' か 'LOOP' の次に、 'WHILE' がくると、条件式が真の間、'UNTIL' がくると真になるまで、ブロックを実行し続けます。
構文は、以下のようになります。
'DO [WHILE | UNTIL] ... LOOP'、では、 条件式の真偽により、ブロックを一度も実行しない場合がありますが、 'DO ... LOOP [WHILE | UNTIL]' では、条件式の真偽によらず、必ず一度は、ブロックが実行されます。
予約語 'GoTo' は、処理行を変えるのに用います。
構文は、次のようになります。
ラベルとは、行き先として行番号の代わりに用いる目印となります。
実際の用い方は次のようです。
現在、'GoTo'文の使用は、あまり推奨されません。
行ラベルとは、行を特定するために付ける名前のことで、'GoTo' などで示す行き先となります。
記述の仕方は、次のようです。
ラベル名の直後は、':' (コロン) でなければなりません。また、インデントすることもできます。
次の例では、まず、LABEL1行へ処理が移り、次にLABEL2行から処理が行われています。
エラー処理とは、発生したエラー(例外)に、どう対処するのかということです。
通常、OpenOffice.org Basic では、エラーが発生すると、その箇所でプログラムの実行を止めてしまいます。ですが、'On Error' という記述で、エラーに対応することを明確にすると、処理の中断以外の方法をとることができます。 実際の対応の仕方には、2つあり、'On Error GoTo ラベル' 文で、処理を別の行へ移すか、'On Error Resume Next' 文で、エラーを無視して処理を続行するのかを指示できます。
また、一度定義した、エラー処理を無効にするには、'On Error GoTo 0' という記述を行い、以前に設定したエラー処理を無効にします。
それ以外にも、エラーが発生すると設定される特殊な変数も存在します。

OpenOffice.org Basic での、エラー処理とは、エラーの際、「どの行へ処理を移すのか」であり、'GoTo' 文の応用と言えます。 定義の仕方は、まず、'On Error' という一文を記述し、エラーに対応することを明確にします。次に、'GoTo' 文で処理を移すか、'Resume' 文でエラーを無視し処理を続行するのかを記述します。

'On Error GoTo ラベル' は、指定行へ処理を移す場合に用います。
構文は次のようになります。
また、ここで示すラベルは、同一プロシージャ内に記述しておかなければなりません。
一般的な記述の仕方は次のようになります。
行ラベルの前に、'EXIT SUB' など、プロシージャから抜ける記述がなければ、ラベル以降のコードも実行されるため、エラー処理に限った記述ではなくなってしまいます。
次の例では、'TestSubRoutine'内にエラーがあります。この場合、サブルーチン Main の、TestSubRoutine 呼び出し箇所のエラーとして、Label_In_The_Main へ処理が移ります。
上述のエラーを、TestSubRoutine 内のエラーとして扱うには、TestSubRoutine 内にエラーに対応する記述が必要です。
'On Error Resume Next' は、エラーを無視し、処理を続行する場合に用います。
構文は、次のようになります。
実際の用い方は、次のようです。
また、'Resume Next' を記述すると、エラー変数は、設定されなくなります。

定義されている 'On Error' 文を無効にするには、'On Error GoTo 0' という一文を使用します。この場合、エラーが起こると、通常通り、プログラムの実行は中断されます。
'On Error GoTo 0' は、定義したエラー処理を無効にするのに用います。
構文は、次のようになります。
実際の用い方は、次のようです。
予約語、'Resume' は、処理の再開場所を指定するのに用います。 また、'Resume' 文が評価されると、エラー変数は全てリセットされます。
'Resume Next' は、エラーとなった次の行から処理を再開するのに用います。
構文は、次のようになります。
実際の用い方は、次のようになります。
'Resume ラベル'は、ラベルで示す行から処理を再開するのに用います。
構文は、次のようになります。
次の例では、エラーで Label行に処理が移った後、Continue行から再開しています。
'Resume ラベル' は、'GoTo ラベル' とした場合と同じ働きをしていますが、'Resume' の持つ語の意味を考えると、より分かり易い記述になると思います。

エラー変数とは、発生したエラーの内容を示す変数のことです。
全部で3つあり、それぞれ、'Err'、'Error$'、'Erl' となります。'Err' は、エラー番号を示し、'Error$' は、エラーの内容を表します。また、'Erl' は、エラーの発生した行番号が格納されています。
次の場合、それぞれの変数の値は、'Erl=4'、'Error$="オーバーフロー"'、'Err=6' となります。
OpenOfficeの機能(ファイルの読み込み、保存、印刷等)や共通ダイアログ(ファイルを開くダイアログ等)を利用するために、StarSuite APIを用いることが出来ます。
StarSuite APIをOpenOffice BASICから用いるために、Universal Network Objects (UNO)インターフェースを用いることになります。
StarSuite 8 Basic プログラミングガイド OpenOffice API について
ファイルの読み書きは、com.sun.star.ucb.SimpleFileAccessインターフェースを用います。(もしくは、BASICの基本関数でデータチャネルを用いることも出来ます)
テキストファイルの読み込みは、com.sun.star.io.TextInputStreamインターフェースを用います。
OpenOffice.org APIリファレンス interface SimpleFileAccess > openFileRead interface TextInputStream > readLine, isEOF
(参考) BASICの基本関数でデータチャネルを用いたテキストファイルの読み込み例
ファイルを開く・保存するダイアログの表示は、com.sun.star.ui.dialogs.FilePickerサービスを用います。
OpenOffice.org APIリファレンス service FilePicker