OpenOffice.org Basic

出典: フリー教科書『ウィキブックス(Wikibooks)』
移動先: 案内検索

OpenOffice.org Basic ガイド

OpenOffice.orgマクロ記述用に準備されているものは、BASICの言語仕様を近代的に拡張したものです。

コードの書き方

コードを書くには、まず、いくつかの決まり事を覚える必要があります。 どの言語もそうですが、変数の使い方、条件分岐、繰り返し処理、関数定義、算術演算などの仕方です。コメントの記入の仕方も覚える必要があるかもしれません。この章では、そうした、あらましを記述します。

まず、BASIC では大文字・小文字の区別がありません。OpenOffice.org Basic の場合に限っていえば、UNO API に関してのみ大文字・小文字の区別が行われます。

次に、サブルーチンと関数の説明ですが、 OpenOffice.org Basic では、返り値を伴うものを関数、返り値を伴わないものをサブルーチンとしています。 それ以外は同一で、双方とも1行からなる命令文の集まりです。

下のコードを元に説明すると、Main で呼び出した時、 命令文1、命令文2、命令文3 の順に実行されるところが共通点で、'Main = 返値' のところが相違点です。ここで気を付けなければならないのは、'return' などの予約語を使い、呼び出しもとへ返すのではなく、自身の定義名に代入するという形で行うところです。繰り返しになりますが、関数での値の戻し方は、'定義名 = 返値' です。


サブルーチンと関数の違い
サブルーチン 関数
SUB Main
  命令文 1
  命令文 2
  命令文 3
END SUB
FUNCTION Main
  命令文 1
  命令文 2
  命令文 3

  Main = 返値
END FUNCTION


コメントの挿入は、'REM'、または、「'」(アポストロフィ) を用いて行います。 この際、行末までがコメントとして扱われます。

REM コメントです。
'コメントです。

複数の命令文を一行に記述したい場合、各命令文を ':' (コロン)で区切ります。

命令文1 : 命令文2 : 命令文3

複数行に渡る一つの命令文を記述したい場合には、行末を 「_」(アンダースコア) で終わらせ、改行します。

下のコードは、一行に 'print "Hello " & "World!"' と記述するのと同じ意味になります。

print _
"Hello " & _
"World!"

数値の表現の仕方は、次のようになります。

a = 120   '正の数
a = -120  '負の数
a = 1.2   '小数
a = 1.2e3 '指数表記 1.2 * 10^3

DIM i As Integer
i = 1.2 '四捨五入、切捨て
i = 1.5 '四捨五入、繰り上げ

数値を8進数や、16進数で記述したい場合、'&O' や '&H' を用いて行います。16進数で15を表現するには、'&HF'、8進数で9を表現するには、'&O11' となります。(2進数での記述は、サポートされていないようです。)

&HFF + 10 ' => 265 となります。
&O15 + 20 ' => 33 となります。

文法

命名規則

OpenOffice.org Basic では、変数、定数、関数、サブルーチンの名前の付け方に多少の取り決めがあります。 (ここでの命名規則は、UNO (Universal Network Objects) API などには、あてはまりません。)

  • 名前は最長255文字まで。
定義できる名前は、最長で255文字までとなっており、これを越える長さの名前をつけることはできません。ですから、256文字からなる名前は無効です。
  • 大文字・小文字は区別されない。
名前には、大文字・小文字の区別はありません。ですから、 名前、'variable' は 'VARIABLE' と同じものを指します。
  • 有効な文字は、アルファベット、数字、下線記号のみ。
名前に使える文字は、アルファベット、数字、下線記号のみで、先頭文字に数字を用いることはできません。'_Name' は大丈夫ですが、'2Name' は、この規則に違反します。
  • スペースを用いた名前定義には、大括弧 '[ ... ]'を用いる。
名前を大括弧 '[ ... ]'で囲むことにより、スペースを挟んだ名前を定義することができます。
つまり、'[This is Hello]' などの変数名が有効になるということです。ただし、大文字・小文字は、やはり区別されません。ですから、'[this is hello]' と '[This is HELLO]' は、同じ値を指します。

変数

変数とは、何度も値をとりえる別名のようなものです。

OpenOffice.org Basic では、変数は宣言することなく用いることができます。この場合、値のは、変化型 (Variant)となり、代入される値により、ある程度、適切な型として扱われます。また、宣言のない変数の使用を禁止したい場合には、'OPTION EXPLICIT' という一文を用います。

下のコードでは、宣言なく、変数 i を使用しています。また代入のたび、型も変化していることに注目してください。

SUB Main
	i = TRUE      ' i の型は、Boolean となります。
	i = Hello ' i の型は、String となります。
	i = 3         ' i の型は、Integer となります。
	i = 600000    ' i の型は、Double となります。
END SUB

'OPTION EXPLICIT' の用い方は、以下のようになり、評価後、効力を発揮します。

OPTION EXPLICIT
SUB Main
	`明確な変数宣言なしに、その使用はできません。
END SUB

変数の宣言

変数の宣言とは、予約語 'DIM' を用いて、名前や型を明確にすることです。

構文は、以下のようになります。

DIM 変数名 [AS ]
DIM 変数名[型指定子]

型指定を省略した場合、変化型 (Variant) となります。

用い方は、次のようです。

SUB Main
	DIM i AS Integer  '整数型変数 i を宣言
	DIM s$            '文字列型変数 s を宣言
 	DIM v             '変化型変数 v を宣言。
END SUB

また、1行で複数の変数を宣言することもでき、その場合、各変数を ','(コンマ) で区切ります。

SUB Main
 	DIM i AS Integer, l AS LONG 'i は整数型として, l は長整数型として宣言
 	DIM s$, c@                  's は文字列型として、c は通貨型として宣言
END SUB

宣言後の初期値は、文字列で ””となる以外は、0で初期化されます。

静的変数

予約語、'STATIC' で宣言された変数は、静的変数として、プロシージャ終了後も値が保持されます。

構文は、次のようです。

STATIC 変数名 [AS ]

通常の宣言では、変数の値は、プロシージャ終了後に消去されますが、 静的変数として宣言されたものは、プロシージャ終了後も値が保持され、次回に再利用できます。

SUB Main
    StaticVariable() ' => 1 と出力されます。
    StaticVariable() ' => 2 と出力されます。
    StaticVariable() ' => 3 と出力されます。
END SUB
 
SUB StaticVariable
    STATIC i AS Integer

    i = i + 1 ' 呼び出されるたび、1づつ増やします。
    print i
END SUB

変数の型

型とは、表現できる値を決めるためものです。

個別の型には、整数、長整数、単精度浮動小数、倍精度浮動小数、通貨、日付、真偽、文字列、オブジェクトと、9つあり、すべての型に対応できるものとして、変化型 (Variant) と呼ばれる型が用意されています。また、この他にもユーザ定義型変数と呼ばれるものがあります。

型指定子とは、簡潔に型を表現する1文字の記号のことです。

それぞれのデータ型の特徴を表にすると、次のようになります。

データ型と特徴
名前 型指定子 容量

整数型

Integer

%

-32768 〜 32768

2バイト

長整数型

Long

&

-2147483648 〜 2147483647

4バイト

単精度浮動小数型

Single

!

3.402823 × 10E38 〜 1.401298 × 10E-45

4バイト

倍精度浮動小数型

Double

#

1.79769313486232 × 10E308 〜 4.94065645841247 × 10E-324

8バイト

通貨型

Currency

@

-922337203685477.5808 から +922337203685477.5807

8バイト

文字列型

String

$

最大 65,535 文字 (UNICODE)

文字列の長さに依存

日付型

Date

なし

日付と時刻を表す内部形式

真偽型

Boolean

なし

TRUE (-1) か FALSE (0)

2バイト

オブジェクト型

Object

変化型

Variant

なし

すべてのデータ型を格納可能。

データに依存

ユーザ定義型

定義名

なし

構造化した値

整数型 (Integer)
整数型 (Integer) とは、-32768 から32768 の数を表現できる型です。型指定子は、'%' です。
数値計算では、浮動小数点型に比べ速いとされています。また、表現できる範囲を越えた値を代入するとエラーとなります。小数部のある数を代入すると、切捨てではなく、四捨五入した値が代入されます。つまり、'1.4' は、1となり、'1.5' は、'2' として代入されます。
長整数型 (Long)
長整数型 (Long) とは、-2147483648 から 2147483647の数を表現できる型です。型指定子は、'&' です。
数値計算では、浮動小数点型に比べ速いとされています。また、表現できる範囲を越えた値を代入するとエラーとなります。小数部のある数を代入すると、切捨てではなく、四捨五入した値が代入されます。つまり、'1.4' は、1となり、'1.5' は、'2' として代入されます。
単精度浮動小数型 (Single)
単精度浮動小数型とは、3.402823 × 10E38 から 1.401298 × 10E-45 までの値を表現できる型です。型指定子は、'!' です
浮動小数点方式のため、整数部の桁数が増える程、小数部に使える桁数は減り、その精度は落ちます。
倍精度浮動小数型 (Double)
倍精度浮動小数型とは、1.79769313486232 × 10E308 から 4.94065645841247 × 10E-324 までの値を表現できる型です。型指定子は、'#' です
浮動小数点方式のため、整数部の桁数が増える程、小数部に使える桁数は減り、その精度は落ちます。
通貨型 (Currency)
通貨型 (Currency) とは、-922337203685477.5808 から +922337203685477.5807 までの値を表現できる型です。型指定子は、'@' です
整数部15桁、小数部4桁からなる固定小数点方式です。
主に、金額計算に利用します。
文字列型 (String)
文字列型 (String) とは、文字を格納するのに用いる型です。型指定子は、'$' です。
UNICODE での値が保持されているため、日本語など、アルファベット以外の文字を代入することもできます。一度に格納できる文字は、最大で65,535文字となります。
日付型 (Date)
日付型 (Date)とは、日付と時刻を示す内部形式の値を表現するための型です。型指定子はありません。
この型と一緒に覚える関数は、'Now()'、'Dateserial()'、'Timeserial()'、'Datevalue()'、'Timevalue()'、'Day()'、'Month()'、'Year()'、'Hour()'、'Minute()'、'Second()' となります。
日付型どうしは、引き算などができます。
真偽型 (Boolean)
真偽型 (Boolean)とは、真 (TRUE)、 偽 (FALSE)、いずれかの状態を表すのに用いる型です。型指定子はありません。
値として0が代入されると偽 (FALSE) に、それ以外の値が代入されると真 (TRUE) になります。
型宣言を伴わない変数の使用では、'TRUE' ないし'FALSE' を明示的に代入した際、この型として扱われます。
オブジェクト型 (Object);
UNO (Universal Network Object) などと呼ばれるものであると思います。
変化型 (Variant)
すべての型に対応でき、受け取る値により型も変わります。これは、代入時に型が決められるのみで、正式な型ではないかもしれません。
ユーザ定義型変数
ユーザ定義型変数とは、使用者が定義する変数の型で、データを構造化するのに用います。
予約語 'Type' を用いて、あらかじめ型として作成します。構造は、'Type 定義型名' から、'END TYPE' までとなります。

構文は以下のようになります。

TYPE 定義型名
	変数名 [AS ]
	変数名 [AS ]
	...
END TYPE

実際の用い方は、次のようになります。

TYPE BOOK
	Title as String
	ISBN as String
END TYPE

SUB Main
 	DIM MyBook AS BOOK
 	MyBook.Title = “正史 三国志 5 蜀書”
 	MyBook.ISBN = 4-480-08045-7
END SUB

配列

配列とは、複数の要素からなるひとつの固まりのことで、各要素は、添字を用いて区別します。添字とは、配列内の値を特定するために用いる数字です。実際の値の特定の仕方は、配列変数を 'a' とした場合、'a(0)' は、'a(0)' の値を意味します。 宣言には、通常の 'DIM' を用い、変数名の後に、'()' を付け、確保したい用素数も一緒に記述します。 また、他の言語のように、添字は 0からのみ割り振られるのではなく、宣言の仕方によっては、0以外の数から始まる配列を作ることもできます。その場合、'DIM a(5 TO 10)' のように宣言します。

OpenOffice.org Basic 1.1.3 では、配列の添字の最大値は、16368とされています。

構文は、次の通りです。

Dim 変数名(要素の数 [, 要素の数, ...]) [as ]
Dim 変数名(開始番号 TO 終了番号 [, 開始番号 TO 終了番号]) [as ]

実際の宣言の仕方は、次のようになります。

SUB Main
        Dim a(10)                ' a(0) から a(10) までの、11個の値を確保します。
        Dim a(5 to 10)           ' a(5) から a(10)までの、6個の値を確保します。
        Dim a(-2 to 3) as String ' a(-2) から a(3) までの、6個の文字列型の値を確保します。
END SUB

宣言ではなく、関数を用いた作成も可能で、'DimArray' と 'Array' 関数が用意されいます。DimArray は、各次元の要素数を指定し、すべてが空の値からなる配列を返します。Array 関数では、指定した値で要素を確保し、配列を返します。 双方とも、返す値の型は、変化型 (Variant)となり、それ以外の型には代入できません。(Object型には代入できますが、参照できなくなります。)

サンプルコードは、次のようになります。

SUB Main
        Dim n                             '明確な型指定を伴わないため、n は、Variant 型です。
        n = DimArray(2,2)                 '(0,0) から (2,2) までの配列を作成します。
        n = Array(“Hello World!”, 1, 2) '3つの値から成る配列を作成します。
END SUB

その他に、配列に係わる関数として、'IsArray()'、'UBound()'、'LBound()' が用意されています。 'IsArray()' は、変数が配列かどうかを調べ、'UBound()'、'LBound()'は、配列の各次元の最大・最小のインデックスを返します。

有効範囲

変数には、有効となる範囲が存在します。 有効となる範囲とは、変数が存在しており、参照できるかどうかを表しています。 通常の宣言では、プロシージャ (関数サブルーチン) 内であれば、プロシージャ内のみ、プロシージャ外であれば、すべてのモジュール内で有効な変数を定義しています。

これに対して、有効な範囲を特定して変数を宣言することもでき、 その場合、'GLOBAL'、'PUBLIC'、'PRIVATE' といった予約語を用いて変数を宣言します。 それぞれの意味は、セッションの終了以内、すべてのモジュール内、該当モジュール内となります。

構文は、次のようになります。

DIM 範囲指定子 変数名

変数の有効範囲をコードで示すと、次のようになります。

DIM ProgramName AS String ' すべてのモジュールで有効です。

SUB Main
    DIM GLOBAL StartTime AS Date      ' セッション終了まで有効です。
    DIM PUBLIC HelpMessage AS String  ' すべてのモジュールで有効です。
    DIM PRIVATE UserName AS String    ' 現在のモジュールでのみ有効です。

    DIM a AS Integer ' 現在のサブルーチン内でのみ有効です。
END SUB


変数の再定義

予約語 'REDIM' を用いることで、変数を再宣言することができます。一度宣言された変数を、別の型としたり、配列の要素を増やすために宣言し直すのに利用できます。

構文は、予約語 'REDIM' を用いること以外、変数宣言の場合と同一です。

実際の用い方は、次のようになります。

FUNCTION Foo (v as Variant)
        REDIM v(0 to 10)
END FUNCTION


WITH ステートメント

WITH ステートメントは、入力の省略に使用します。

WITH から END WITH までをブロックとし、WITH 以降、変数名で示す名を、親ノードとして持つ要素それぞれに対し、定義名を省略し、アクセスすることができます。

構文は以下のようになります。

WITH 変数名
        .要素
        .要素
END WITH

サンプルコード

TYPE BOOK
    TITLE AS STRING
    ISBN AS STRING
END TYPE

SUB Sample
   DIM MyBook AS BOOK
   WITH MyBook
     .TITLE = "正史 三国志 5 蜀書"
     .ISBN = "4-480-08045-7"
   END WITH
END SUB

定数

定数とは、一度しか値を決められない定義名のようなものです。

型宣言は必要とせず、数値か文字列の値を設定することが可能です。有効となる範囲は、プロシージャ内での定義であれば、プロシージャ内のみ有効となり、プロシージャの外であれば、モジュール内で有効な定数を定義できます。 また、同一名での2重定義がある場合、プロシージャ内での定義が優先されます。

構文は、次のようになります。

CONST 定数名 = 値

実際の用い方は、次のようです。

CONST ConstantVariable = “Out of Procudure”    ' 現在のモジュールで有効です。

SUB Main
        CONST PI = 3.14                           ' サブルーチン Main の中でだけ有効です。
        CONST ConstantVariable = “In The Main.” ' ConstantVariable を2重に定義します。

        PRINT ConstantVariable                    ' In The Main と出力されます。
        PrintConstantVariable()                   ' Out of Procedure と出力されます。
END SUB

SUB PrintConstantVariable
        PRINT ConstantVariable
END SUB


プロシージャ (Procedure)

プロシージャとは、ある処理単位を、一つにまとめたものに対して付けられる呼び名で、ここでは、サブルーチンと関数を指すものとします。サブルーチンも関数も意味するところは似ており、どちらも、想定した機能を実現し、一つにまとめる働きをもっています。こうすることで、次回から、同様の処理が必要となる場合、以前作った関数やサブルーチンを呼び出すのみとなり、コード作成時間の短縮や、簡略化などに役立ちます。

また、サブルーチンと関数の違いは、値を呼出元へ返せるかどうかで、値を返せるのが関数、返せないのが、サブルーチンとなっています。つまり、命令文1、命令文2、命令文3と順に実行されるところが共通点で、'Main = 返値' と書かれたところが相異点となるわけです。

サブルーチンと関数の違い
サブルーチン 関数
SUB Main
    命令文1
    命令文2
    命令文3
END SUB
FUNCTION Main
    命令文1
    命令文2
    命令文3

    Main = 返値
END FUNCTION


呼び出し方

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


引数

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


引数の定義

引数が必要となる場合には、定義の際に記述します。記述の仕方は、受け取りたい引数の数分、変数を”,”(コンマ)で区切り、必要引数があることを示すだけです。下の例では、a, b, c のように、3つの引数を伴う呼び出し方を指定しています。また、このような場合には、引数を省略できません。

SUB SubRoutine (a, b, c)
        '処理内容
END SUB

省略してもよい引数を定義するには、予約語 'OPTIONAL' を用います。記述の仕方は、以下のようになり、変数 'c' を省略してもよいことになります。

SUB SubRoutine (a, b, OPTIONAL c)
        '処理内容
END SUB

また、受け取る引数は、型付きで指定することもでき、この場合、受け取る値と型が一致しなければエラーとなります。次の場合には、変数 a は整数、b は文字列、c は省略可能で、どの型でもよいことになります。

SUB SubRoutine (a AS Integer, b AS String, OPTIONAL c)
        '処理内容
END SUB


値渡し・参照渡し

引数の渡し方には、'値渡し'と'参照渡し'と呼ばれるものがあります。

値渡しでは、引数で指定した変数などの値を複製して利用するのに対して、参照渡しでは、呼び出し元の値は複製せず、参照することで利用します。つまり、参照渡しでは、プロシージャ内で値を変更すれば、呼出元の値自体も変えてしまうということです。明示しない限りは、この参照渡しとなり、予約語 'ByVal' で示した時のみ値渡しとなります。

'参照渡し'と'値渡し'の違いをコードで示すと次のようになります。

'参照渡し' と' 値渡し' の違い
参照渡し 値渡し
SUB Main
    DIM x
    x = “First Value”
    Foo(x)
    PRINT x 'Changed と出力されます。
END SUB

SUB Foo (n)
    n = “Changed”
END SUB
SUB Main
    DIM x
    x = “First Value”
    Foo(x)
    PRINT x 'First Value と出力されます。
END SUB

SUB Foo (ByVal n)
    n = “Changed”
END SUB


定義の仕方

サブルーチン

サブルーチンとは、複数の処理を記述し、一つのまとまりにしたものです。'SUB ルーチン名' から、'END SUB' までが、処理内容となります。引数は、受け取らなくてもよく、その場合、ルーチン名以降の括弧は省略できます。

定義の仕方は、次のようになります。

SUB ルーチン名 [(引数 [, 引数, ...])]
        '処理内容
END SUB

下の例では、”こんにちは、何何”と出力します。

SUB PrintHello (Name AS String)
        PRINT “Hello ” & Name
END SUB


関数

関数の特徴は、サブルーチンの考え方に加え、値を返せるところにあります。値の返し方は、'return' などの予約語は用いず、定義名に代入する形となります。すなわち、'定義名 = 返値'となるわけです。また、返す値の型を指定できるところも異なっている点です。

'FUNCTION 関数名' から 'END FUNCTION' までが、処理内容となります。引数は省略できます。また、値を返す必要もないため、サブルーチンと、まったく同じに用いることも可能です。

定義の仕方は、次のようになります。

FUNCTION 関数名 [(引数 [, 引数, ...])] [AS 型]
        '処理内容
        '[関数名 = 返値]
END FUNCTION

給料から、1月の生活費を控除する関数を考えてみました。

FUNCTION Outlay (ByVal x AS Long) AS Long
        x = x – 60000 ' 食費に60,000 円かかります。
        x = x – 20000 ' 光熱費は、20,000円です。
        x = x – 10000 ' 通信費に、10,000円かかります。
        x = x – 70000 ' 家賃は、70,000円です。

        Outlay = x
END FUNCTION

算術演算

算術演算とは、足し算、引き算などの数値計算のことです。

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' は、3 になります。'7 MOD 5 * 3' では、7 となります。


比較演算

比較演算とは、等符号などを挟み左辺と右辺の大小を比較することです。

OpenOffice.org Basic で、比較に使える演算子は、6つ用意されており、 '<'、 '>'、 '<='、 '>='、 '<>'、 '='、となります。 それぞれ、'より小さい'、'より大きい'、'以下'、'以上'、'等しくない'、'等しい'を意味します。

使い方は、 '返値 = 左辺値 比較演算子 右辺値' です。 返値は、等式が真であれば -1、偽であれば 0 となります。

下のコードで説明すると、n の値は 5、5 は 0 より大きいので、i の値は -1 となります。

SUB Main
  n = 5
  i = n > 0
END SUB


論理演算

論理演算とは、真(1)か偽(0)、いずれかの状態を掛け合わす演算のことです。プログラミングでは、値を2進数で考え、各ビットに対し演算を行う、ビット演算のことを指しています。

この論理演算は、ブール型どうしの演算、ビットどうしの演算、両方に利用します。

演算子は、全部で6つ用意されており、それぞれ、論理積 (AND)、論理和 (OR)、排他的論理和 (XOR)、否定 (NOT)、論理等価演算 (EQV)、論理包含演算 (IMP)となります。


論理積 (AND)

論理積とは、双方の値が真(1)の時のみ、真(1)となる演算です。


構文は、次のようです。

値 AND 値


真理値表は、以下のようになります。

真理値表
右辺値
TRUE (1) FALSE (0)
左辺値 TRUE (1) TRUE (1) FALSE (0)
FALSE (0) FALSE (0) FALSE (0)


ビット演算では、次のようになります。

             0000000000001111 
 15 AND 12 = 0000000000001100
             ----------------
             0000000000001100 = 12

             0000000000101110
 46 AND 55 = 0000000000110111
             ----------------
             0000000000100110 = 38


論理和 (OR)

論理和とは、一方の値が真(1)となれば、真(1)となる演算です。


構文は、次のようです。

値 OR 値


真理値表は、次のようになります。

真理値表
右辺値
TRUE (1) FALSE (0)
左辺値 TRUE (1) TRUE (1) TRUE (1)
FALSE (0) TRUE (1) FALSE (0)


ビット演算では、次のようになります。

           0000000000001111
15 OR 12 = 0000000000001100
           ----------------
           0000000000001111 = 15

           0000000000101110
46 OR 55 = 0000000000110111
           ----------------
           0000000000111111 = 63


排他的論理和 (XOR)

排他的論理和とは、両方の真偽が異なる場合に真(1)となる演算です。


構文は、次のようです。

値 XOR 値


真理値表は次のようになります。

真理値表
右辺値
TRUE (1) FALSE (0)
左辺値 TRUE (1) FALSE (0) TRUE (1)
FALSE (0) TRUE (1) FALSE (0)


ビット演算では、次のようになります。

            0000000000001111
15 XOR 12 = 0000000000001100
            ----------------
            0000000000000011 = 3

            0000000000101110
46 XOR 55 = 0000000000110111
            ----------------
            0000000000011001 = 25


否定 (NOT)

否定とは、真(1)なら偽(0)、偽(0)なら真(1)となる演算です。


構文は、次のようです。

NOT 値


ビット演算では、次のようになります。

NOT 15 = NOT 0000000000001111
             ----------------
             1111111111110000 = -16

NOT 12 = NOT 0000000000001100
             ----------------
             1111111111110011 = -13

論理等価演算 (EQV)

論理等価演算とは、双方が真(1)、または、双方が偽(0)となった時のみ真(1)となる演算です。


構文は、次のようです。

値 EQV 値


真理値表は、次のようになります。

真理値表
右辺値
TRUE (1) FALSE (0)
左辺値 TRUE (1) TRUE (1) FALSE (0)
FALSE (0) FALSE (0) TRUE (1)


ビット演算では次のようになります。

            0000000000001111
15 EQV 12 = 0000000000001100
            ----------------
            1111111111111100 = -4

            0000000000101110
46 EQV 55 = 0000000000110111
            ----------------
            1111111111100110 = -26


論理包含演算 (IMP)

論理包含演算とは、一つ目の値が真(1)で、二つ目の値が偽(0)の時のみ、偽(0)となる演算です。


構文は、次のようです。

値 IMP 値


真理値表は、次のようになります。

真理値表
右辺値
TRUE (1) FALSE (0)
左辺値 TRUE (1) TRUE (1) FALSE (0)
FALSE (0) TRUE (1) TRUE (1)


ビット演算では次のようになります。 (数値で演算すると成り立ちませんでしたが、値に変数を使うと成り立ちます。)

            0000000000001111
15 IMP 12 = 0000000000001100
            ----------------
            1111111111111100 = -4

            0000000000101110
46 IMP 55 = 0000000000110111
            ----------------
            1111111111110111 = -9


文字列の操作

文字列の連結

文字列の連結とは、対象とする文字列を繋げ、新しい文字列を生成することです。
文字列の連結は、'+' か '&' で行います。

構文は次のようになります。

文字列 連結子 文字列


SUB Main
    a = "Hello "
    b = "World"
    c = a & b
    print c ' Hello World と出力されます。
END SUB

'+' は、この他にも加算に使用されるため、'&' での文字列連結の方が、見易くなります。


文字列の削除

SUB Main
    aRecord = "123,456"
    aRecord = Join (Split (aRecord, ","), "")
    print aRecord ' "," が削除され 123456 と表示されます。
END SUB


文字列の抽出

SUB Main
    aRecord = "[123,456円]"
    aRecord=ExtractText(aRecord, "[","]")
    print aRecord ' 123,456円 と表示されます。
END SUB

条件分岐

条件分岐とは、ある条件に基づいて実行するブロックを変更することを意味しています。

OpenOffice.org Basic で使用できる分岐構文は、'IF' と 'SELECT' となります。

二つの違いは、 何をもとに実行ブロックを変化させるかで、 'IF' では、条件式、'SELECT' では、値をもとに変化させるのが一般的な使い方です。

同様に使用することもできますが、 'IF' では、条件式の値により真偽を判定するため、数値以外の値をとることはできません。 一方、'SELECT' では、'CASE' に続くものとして、数値以外の値をとることができます。


IF

'IF' 文は、条件式をもとに、実行ブロックを変化させるのに用います。

構文は、次のようになります。

IF 条件式 THEN
  `ブロック
ELSEIF 条件式 THEN
  'ブロック
ELSE
  'ブロック
END IF

'IF' から 'END IF' までがひとつのブロックのように作用し、 上から順に、条件式が評価されます。 条件式が 真(-1) となると該当するブロックが実行され、その他は無視されます。 また、用意したすべての条件式が 偽(0) となり、かつ、'ELSE' がある場合、このブロックが実行されます。

'ELSE' 句を定義したあと、再び、'ELSEIF' 句を定義することはできません。

ですから下の例は、エラーとなります。

REM このコードは成り立ちません。
SUB Main
  IF 0 THEN
    'ブロック
  ELSE
    'ブロック
  ELSEIF 1 THEN
    'ブロック
  END IF
END SUB

'IF'、'ELSEIF' に続く値は、数値 かつ 0以外 (マイナスも含む) の値であれば、 真だと判定されるため、けして TRUE (-1) だけが真となるわけではありません。

下の例で説明すると、0 は、偽だと判断され、12は真であると判断されます。

SUB Main
  IF 0 THEN
    '実行されません。
  ELSEIF 12 THEN
    'こちらのブロックが実行されます。
 END IF 
END SUB

同様に、-12 も真であると判断されます。

SUB Main
  IF -12 THEN
    '実行されます。
  END IF
END SUB

実際の用いられ方は、以下のようになります。

SUB Main
  a = 1 

  IF a > 1 THEN
    'a は 1より大きくありません。
  ELSEIF a < 1 THEN
    'a は 1より小さくありません
  ELSE
    'よって、このブロックが実行されます。
  END IF
END SUB


SELECT

'SELECT' 文は、値をもとに実行ブロックを変更するのに用います。

構文は、以下のようになります。

SELECT CASE 値
CASE 値
  'ブロック
CASE ELSE
  'ブロック
END SELECT

'SELECT CASE' で指定した値と同じものを、上から順に 'CASE' 行で探し、 値が同じなら、対応するブロックを実行します。一つのブロック実行後は、 その他のブロックを無視します。 どの値も異なる場合、'CASE ELSE' 句があるようなら、そのブロックを実行します。

また、'SELECT CASE' から 'END SELECT' までが、ひとつのブロックのような働きをします。

実際の使い方は、次のようになります。

SUB Main
  Lang = "日本語"

  SELECT CASE Lang
  CASE "英語"
    `Lang の値は、"英語"ではありません。
  CASE "日本語"
    `Lang の値は、"日本語"なので、ここが実行されます。
  CASE ELSE
    `実行されません。
  END SELECT
END SUB

'SELECT' は、'IF' と違い、'CASE' の後に数値以外の型をとることができます。 そのため、'IF' において、'IF Lang = "日本語" THEN' の表現を、'CASE "日本語"' として、 短く、わかりやすく表現できます。


繰り返し処理

繰り返し処理とは、ある条件で、同一ブロックを繰り返し実行することを意味しています。

OpenOffice.org Basic で使えるものには、3つあり、それぞれ、'FOR'、'WHILE'、'DO' となります。

'FOR' は、数値をもとにした繰り返し処理を行い、 'WHILE' は、条件式が真の間、繰り返し処理を行います。 また、'DO' は、'WHILE' より広い意味で条件式をとらえ、繰り返し処理を行えます。

繰り返し処理から抜けるには、'EXIT' キーワードを使用します。


FOR

'FOR ... NEXT' 文は、カウンタの値をもとにした繰り返しを行います。

繰り返し処理から抜けるには、'EXIT' キーワードを用い、'EXIT FOR' とします。

構文は、以下のようになります。

FOR カウンタ = 初期値 TO 終了値 [STEP 増減幅]
  'ブロック
NEXT

ブロックを実行するたびに、カウンタの値が増減するというのが、その仕組みで、 値が終了値を越えると終わります。値と終了値が等しい場合、もう一度ブロックが実行されます。

終了値を越えるというのは、 'STEP' での指定が正の数であれば、正の方向に、負の数であれば、負の方向に越えることを意味します。 つまり、'STEP 1" であれば、プラスの方向、'STEP -1' であれば、マイナスの方向を指します。

下の例で説明すると、'STEP' での指定が -1と、負の方向を指しているため、 'TO' で示す -2 より小さい数になるまで、ブロックが実行されます。 ですから、この例でのブロックの実行回数は、4回です。

SUB Main
FOR i = 1 to -2 STEP -1
  'ブロック
NEXT
END SUB


WHILE

'WHILE ... WEND' 文は、条件式が真の間、繰り返しを行います。

繰り返し処理から抜ける、'EXIT' キーワードを用いることはできません。

構文は、以下のようになります。

WHILE 条件式
WEND

実際の使い方は、以下のようになります。

SUB Main
  i = 0
  WHILE i < 4
    i = i + 1
  WEND
END SUB

DO

'DO ... LOOP' 文は、条件式を用いた繰り返しを行います。

繰り返し処理から抜けるには、'EXIT' キーワードを用い、'EXIT DO' とします。

'DO' か 'LOOP' の次に、 'WHILE' がくると、条件式が真の間、'UNTIL' がくると真になるまで、ブロックを実行し続けます。

構文は、以下のようになります。

DO WHILE 条件式
  'ブロック
LOOP
DO UNTIL 条件式
  'ブロック
LOOP
DO
  'ブロック
LOOP WHILE 条件式
DO
  'ブロック
LOOP UNTIL 条件式

'DO [WHILE | UNTIL] ... LOOP'、では、 条件式の真偽により、ブロックを一度も実行しない場合がありますが、 'DO ... LOOP [WHILE | UNTIL]' では、条件式の真偽によらず、必ず一度は、ブロックが実行されます。

SUB Main
  i = 0
  DO
    '1回実行されます。
  LOOP WHILE i > 5
END SUB

GoTo 文

予約語 'GoTo' は、処理行を変えるのに用います。

構文は、次のようになります。

GoTo ラベル

ラベルとは、行き先として行番号の代わりに用いる目印となります。


実際の用い方は次のようです。

SUB Main
    GoTo Label
    EXIT SUB

Label:
    PRINT "OK"
END SUB

現在、'GoTo'文の使用は、あまり推奨されません。

行ラベル

行ラベルとは、行を特定するために付ける名前のことで、'GoTo' などで示す行き先となります。

記述の仕方は、次のようです。

ラベル名:

ラベル名の直後は、':' (コロン) でなければなりません。また、インデントすることもできます。


次の例では、まず、LABEL1行へ処理が移り、次にLABEL2行から処理が行われています。

SUB Main
    GoTo LABEL1
    EXIT SUB

LABEL2:
    PRINT “OK”
    EXIT SUB

LABEL1:
    GoTo LABEL2
END SUB

エラー処理

エラー処理とは、発生したエラー(例外)に、どう対処するのかということです。

通常、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 ラベル

'On Error GoTo ラベル' は、指定行へ処理を移す場合に用います。

構文は次のようになります。

On Error GoTo ラベル

また、ここで示すラベルは、同一プロシージャ内に記述しておかなければなりません。


一般的な記述の仕方は次のようになります。

SUB Main
    On Error GoTo Label
    EXIT SUB '重要です。

Label:
    'エラーの場合に実行されます。
END SUB

行ラベルの前に、'EXIT SUB' など、プロシージャから抜ける記述がなければ、ラベル以降のコードも実行されるため、エラー処理に限った記述ではなくなっていまいます。

SUB Main
    On Error GoTo Label

Label:
    'エラーとならない場合も実行されます。
END SUB

次の例では、'TestSubRoutine'内にエラーがあります。この場合、サブルーチン Main の、TestSubRoutine 呼び出し箇所のエラーとして、Label_In_The_Main へ処理が移ります。

SUB Main
    On Error GoTo Label_In_The_Main
    TestSubRoutine ()

    EXIT SUB

Label_In_The_Main:
    'この箇所が実行されます。
END SUB

SUB TestSubRoutine
    DIM i AS Integer
    i = 60000 ' i は整数型なので60000を代入できません。
END SUB

上述のエラーを、TestSubRoutine 内のエラーとして扱うには、TestSubRoutine 内にエラーに対応する記述が必要です。

SUB Main
    On Error GoTo Label_In_The_Main
    TestSubRoutine ()

    EXIT SUB

Label_In_The_Main:
    '実行さません。
END SUB

SUB TestSubRoutine
    On Error GoTo Label_In_The_TestSubRoutine
    DIM i AS Integer
    i = 60000 ' i は整数型なので60000を代入できません。
    EXIT SUB

Label_In_The_TestSubRoutine:
    '実行されます。
END SUB


On Error Resume Next

'On Error Resume Next' は、エラーを無視し、処理を続行する場合に用います。

構文は、次のようになります。

On Error Resume Next


実際の用い方は、次のようです。

SUB Main
    On Error Resume Next ' エラーでの処理の続行を明確にします。
    DIM i AS Integer
    i = 60000 ' エラーですが、処理は続きます。
    print “OK”
END SUB

また、'Resume Next' を記述すると、エラー変数は、設定されなくなります。


エラー処理の無効化

定義されている 'On Error' 文を無効にするには、'On Error GoTo 0' という一文を使用します。この場合、エラーが起こると、通常通り、プログラムの実行は中断されます。

On Error GoTo 0

'On Error GoTo 0' は、定義したエラー処理を無効にするのに用います。

構文は、次のようになります。

On Error GoTo 0


実際の用い方は、次のようです。

SUB Main
    On Error Resume Next
    DIM i AS Integer
    On Error GoTo 0 ' On Error Resume Next文を無効にします。
    i = 60000 'エラーとなり、止まります。
END SUB


Resume

予約語、'Resume' は、処理の再開場所を指定するのに用います。 また、'Resume' 文が評価されると、エラー変数は全てリセットされます。

Resume Next

'Resume Next' は、エラーとなった次の行から処理を再開するのに用います。

構文は、次のようになります。

Resume Next


実際の用い方は、次のようになります。

Sub Main
    On Error GoTo Label
    DIM i AS Integer
    i = 60000 'i は整数型なので、60000 の値を代入できません。
    print “OK”' Resume Next で再開されます。
    EXIT SUB

Label:
    Resume Next
END SUB


Resume ラベル

'Resume ラベル'は、ラベルで示す行から処理を再開するのに用います。

構文は、次のようになります。

Resume ラベル


次の例では、エラーで Label行に処理が移った後、Continue行から再開しています。

Sub Main
    On Error GoTo Label
    DIM i AS Integer
    i = 60000 'ここでエラーです。
    EXIT SUB

Continue:
    print “OK”
    EXIT SUB

Label:
    Resume Continue
END SUB

'Resume ラベル' は、'GoTo ラベル' とした場合と同じ働きをしていますが、'Resume' の持つ語の意味を考えると、より分かり易い記述になると思います。


エラー変数

エラー変数とは、発生したエラーの内容を示す変数のことです。

全部で3つあり、それぞれ、'Err'、'Error$'、'Erl' となります。'Err' は、エラー番号を示し、'Error$' は、エラーの内容を表します。また、'Erl' は、エラーの発生した行番号が格納されています。

変数 内容
Err エラー番号
Error$ エラーの内容
Erl エラーが発生した行番号


次の場合、それぞれの変数の値は、'Erl=4'、'Error$="オーバーフロー"'、'Err=6' となります。

1  SUB Main
2     On Error GoTo Label
3     DIM i AS Integer
4     i = 60000 '4行目でオーバーフローです。
5     EXIT SUB
6
7  Label:
8      print Erl & ": " & Err & " " & Error$
9  END SUB

StarSuite API と Universal Network Objects (UNO)

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インターフェースを用います。

Dim oFileAccess As Object
Dim oInputStream As Object
Dim sLineData As String

oFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")
oInputStream = createUnoService("com.sun.star.io.TextInputStream")
' ファイルを読み取りモードで開く
oInputStream.setInputStream(oFileAccess.openFileRead("file:///c:/test.csv"))

' EOFを検出するまで、1行ずつ読み込む
Do While not oInputStream.isEOF()
  sLineData = oInputStream.readLine()

  '読み込まれた行データに対する処理を行う
Loop

' ファイルを閉じる
oInputStream.closeInput()

OpenOffice.org APIリファレンス
interface SimpleFileAccess > openFileRead
interface TextInputStream > readLine, isEOF

(参考) BASICの基本関数でデータチャネルを用いたテキストファイルの読み込み例

Dim hFileHandle As Integer
Dim sLineData As String

' 利用可能な次のファイルハンドルを得る
hFileHandle = FreeFile
' ファイルを読み取りモードで開く
Open "file:///c:/test.csv" for Input as #hFileHandle

' EOFを検出するまで、1行ずつ読み込む
Do While not Eof(#hFileHandle)
  Line Input #hFileHandle, sLineData

  '読み込まれた行データに対する処理を行う
Loop

' ファイルを閉じる
Close #hFileHandle

ファイルを開く・保存するダイアログ

ファイルを開く・保存するダイアログの表示は、com.sun.star.ui.dialogs.FilePickerサービスを用います。

Dim oFilePicker As Object
Dim nDlgResult As Integer
Dim sFiles() As String
Dim sFilename As String

oFilePicker = 	createUnoService("com.sun.star.ui.dialogs.FilePicker")

' ダイアログの初期化を行います
oFilePicker.Title = "ダイアログに表示するタイトルです"
oFilePicker.appendFilter( "全てのファイル (*.*)", "*.*" )
oFilePicker.appendFilter( "CSVファイル (*.csv)", "*.csv" )
oFilePicker.setCurrentFilter( "CSVファイル (*.csv)" )

' 「保存する」ダイアログの場合、このように設定します
oFilePicker.initialize(Array(_
   com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))

nDlgResult = 	oFilePicker.execute()
' 開く(OK)が押された場合は、1が返されます

sFiles() = oFilePicker.getFiles()
sFilename = sFiles(0)

OpenOffice.org APIリファレンス service FilePicker

関連文書

参考URL

このページ「OpenOffice.org Basic」は、書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にノートへどうぞ。