LibreOfficeは、ワープロ、表計算及びプレゼンテーションなどを統合したオフィススイートで、OpenOffice.orgから派生したオープンソースソフトウェアである。
OpenOffice/LibreOffice Basicマクロの使い方をサンプルを交えてご紹介します。
OpenOffice.org Basic は、OpenOffice.orgを制御するためのスクリプト言語です。VBAでMicrosoft Officeを制御できるように、OpenOffice.org Basic で OpenOffice.org を制御することができます。OpenOffice.org Basic の文法はVisual Basicとほぼ同じなので、文法についてはVisual Basicの項を参照してください。
OpenOffice.org Basicを編集するには、[ツール] メニューから [マクロ] - [マクロの管理] - [Basic] を選択してクリックします。
OpenOffice.org Basicは、基本的に文法が VBA (Visual Basic for Applications)と同じである。しかし、いくつか相違点もある。以下に OpenOffice.org BasicとVBAの違いを説明する。
Visual Basicのエディタでは入力されたステートメントがキャピタライズされて、1文字目が大文字、2文字目以降が小文字に整形されます。たとえば、
dim i as integer と入力すると、
Dim i As Integer と整形されます。
OpenOffice.org Basicのエディタではこのような整形は行われません。OpenOffice.org Basicではステートメントの大文字と小文字は区別されないので、大文字で入力しても小文字で入力しても構いません。たとえば、次の文はすべて同じ意味に解釈されます。
Dim i As Integerdim i as integerDIM i AS INTEGERプロシージャへ引数として変数を渡すときの参照渡し・値渡しの指定方法がOpenOffice.org BasicとVisual Basicとで異なります。
呼び出し側からプロシージャへ変数を引数として渡した場合、プロシージャ内で引数の値を変更すると、呼び出し側の変数の値も変わります。これを 参照渡し と呼びます。
呼び出し側からプロシージャへ変数を引数として渡すとき、呼び出し側の変数の値を変更されたくない場合、渡す変数名の前に
ByRef 修飾子を付けます。こうすることで、プロシージャ内で引数の値を変更しても、呼び出し側の変数の値が変わることがなくなります。これを
値渡し と呼びます。
Sub Caller
Dim var1 As Integer
Dim var2 As Integer
var1 = 1
var2 = 1
Proc(var1, ByRef var2)
'var1の値は2になる
'var2の値は1のまま
End Sub
Sub Proc(para1 As Integer, para2 As Integer)
'para1およびpara2の値は1
para1 = 2
para2 = 2
End Sub
Visual Basicでは、実行時エラーが発生した際にErrオブジェクトに実行時エラーに関する情報が格納される。しかし、OpenOffice.org BasicにはErrオブジェクトは存在しない。Errオブジェクトの代わりに、次の変数を参照することができる。
| 変数名 | 意味 |
|---|---|
| Err | エラー番号 |
| Error$ | エラーの内容 |
| Erl | エラーが発生した行番号 |
実行時エラーが発生した際に、その内容をメッセージボックスで表示するOpenOffice.org Basicコードの例を示す。
Sub ErrorSample
Dim i As Integer
On Error Goto ErrorHandler
i = 0
i = 12 / i
Exit Sub
ErrorHandler:
MsgBox Error$
End Sub
GUI部品を表すコントロール・オブジェクトや、アプリケーションのドキュメントにアクセスするためのオブジェクトやメソッド、プロパティがOpenOffice.org BasicとVBAでまったく異なります。
文書全体を表すドキュメント・オブジェクトは次の構文で表されます。
ThisComponent
StarDesktop.CurrentComponent
ドキュメント・オブジェクトをObject型またはVariant型の変数に代入して使用することもできます。
Dim oDoc As Object
oDoc = ThisComponent
ThisComponentやStarDesktop.CurrentComponentは、そのときにアクティブなドキュメントを表します。したがって、マクロを実行したドキュメントに限りません。複数のOpenOffice.orgを起動している場合、一方でマクロを実行して、そのマクロ実行中にもう一方のOpenOffice.orgにウィンドウを切り替えると、そこがアクティブなドキュメントになってしまいます。意図せぬ動作を防ぐため、マクロの冒頭でドキュメント・オブジェクトをObject型またはVariant型の変数に代入して使用する方がよいでしょう。
OpenOffice.org CalcをOpenOffice.org Basicを制御するのは、Microsoft ExcelをVBAで制御するのより実行速度がだいぶ遅いです。少しでもマクロの実行速度を上げるための手法を示します。
マクロの実行過程の間にもCalcではセルの再表示が行われています。たとえば、マクロでひとつのセルに値を設定したら、そのセルの表示が即座に更新されます。また、そのセルを参照して値を決めているセルの表示も更新されます。マクロ実行中に数多くのセルが何度も再表示を行うことになるので、Calcの実行速度が遅くなります。
マクロ実行中に途中経過を見る必要がなければ、画面表示の更新を抑制することができます。画面表示の更新を抑制するには、addActionLockメソッドを使用する。
画面表示の更新を抑制してからさまざまな処理を行い、処理が終わったら画面表示の更新の抑制を解除すれば、その間の再表示が行われない分、実行速度が速くなります。
画面表示の更新の抑制を解除するには、removeActionLockメソッドを使用する。
画面表示の更新が抑制されているかどうかは、isActionLockedメソッドで知ることができる。
ダイアログやテキストボックス、リストボックス等のGUI部品を制御するために、OpenOffice.org Basicでは、これらのGUI部品をコントロール・オブジェクトとして表します。
OpenOffice.org Basicでダイアログを表示する例を次に示します。
Dim Private oDialog1 As Object
Sub Dialog1Show
BasicLibraries.LoadLibrary("Tools")
oDialog1 = LoadDialog("Standard", "Dialog1")
oDialog1.Execute()
End Sub
ダイアログを終了する例を次に示します。
Sub Dialog1End
oDialog1.endExecute()
End Sub
OKボタンをクリックしたときのイベントに Dialog1End を割り当てます。
コントロール・オブジェクトを取得するには、GetControlを使用します。
Dim oListBox1 As Object
oListBox1 = oDialog1.GetControl("ListBox1")
ダイアログ・コントロールのプロパティ一覧を次に示します。
| 名前 | 種類 |
|---|---|
| Menubar | Object(配列) |
| Title | String |
| Types | Object(配列) |
| ImplemnetationId | Integer(配列) |
| TabControllers | Object(配列) |
| Controls | Object(配列) |
| StatusText | String |
| ElementType | Object |
| Identifiers | Long(配列) |
| Context | Object |
| Peer | Object |
| Model | stardiv.Toolkit.UnoControlDialogModel |
| View | stardiv.Toolkit.UnoDialogControl |
| DesignMode | Boolean |
| PosSize | com.sun.star.awt.Rectangle |
| OutputSize | com.sun.star.awt.Size |
| Visible | Boolean |
| Enable | Boolean |
| Graphics | Object |
| Size | com.sun.start.awt.Size |
| ImplementationName | String |
| SupportedServiceNames | String(配列) |
| AccessibleContext | com.sun.start.comp.toolkit.AccessibleDropDownListBox |
| Delegator | Object |
番号フィールドはテキストフィールドと似ていますが、数値だけが入力できるフィールドです。
番号フィールド・コントロールのプロパティ一覧を次に示します。
| 名前 | 種類 |
|---|---|
| Value | Double |
番号フィールドに入力された数値は Value プロパティで参照することができます。
Dim oDialog As Object
Dim oNumericField As Object
Dim dPeriod As Double
BasicLibraries.LoadLibrary("Tools")
oDialog = LoadDialog("Standard", "Dialog1")
oDialog.Execute()
oNumericField = oDialog.GetControl("NumericField1")
dPeriod = oNumericField.Value
チェックボックス・コントロールのプロパティ一覧を次に示します。
| 名前 | 種類 |
|---|---|
| State | Integer |
チェックボックスが選択されているかどうかは State プロパティを参照することで判断できます。
| 値 | 意味 |
|---|---|
| 0 | 選択されていない |
| 1 | 選択されている |
ラジオボタン・コントロール(オプションボタン)はチェックボックスに似ていますが、グループのうちひとつしか選択できません。あるラジオボタンを選択すると、その他のラジオボタンはすべて選択されない状態となります。
ラジオボタンが選択されているかどうかは、Stateプロパティで判断することができます。StateプロパティはBoolean型で、TrueまたはFalseのいずれかの値です。Stateプロパティの値がTrueの場合は、ラジオボタンが選択されている状態です。Stateプロパティの値がFalseの場合は、ラジオボタンが選択されていない状態です。
OpenOffice.org Basicでラジオボタンを使用する例を次に示します。
Dim oDialog As Object
Dim oOptionButton As Object
BasicLibraries.LoadLibrary("Tools")
oDialog = LoadDialog("Standard", "Dialog1")
oDialog.Execute()
oOptionButton = oDialog.GetControl("OptionButton1")
If oOptionButton.State = True Then
' ボタンが選択されているときの処理
Else
' ボタンが選択されていない時の処理
End If
リストボックス・コントロールのプロパティ一覧を次に示します。
| 名前 | 種類 |
|---|---|
| Types | Object(配列) |
| ImplemnetationId | Integer |
| ItemCount | Integer |
| Items | String(配列) |
| SelectedItemPos | Integer |
| SelectedItemsPos | Integer(配列) |
| SelectedItem | String |
| SelectedItems | String(配列) |
| DropDownLineCount | Integer |
| MultipleMode | Boolean |
| MimimumSize | com.sun.star.awt.Size |
| PreferredSize | com.sun.star.awt.Size |
| Context | stardiv.Toolkit.UnoDialogControl |
| Peer | Object |
| Model | stardiv.Toolkit.UnoControlListBoxControl |
| View | stardiv.Toolkit.UnoListBoxControl |
| DesignMode | Boolean |
| PosSize | com.sun.star.awt.Rectangle |
| OutputSize | com.sun.star.awt.Size |
| Visible | Boolean |
| Enable | Boolean |
| Graphics | Object |
| Size | com.sun.start.awt.Size |
| ImplementationName | String |
| SupportedServiceNames | String(配列) |
| AccessibleContext | com.sun.start.comp.toolkit.AccessibleDropDownListBox |
| Delegator | Object |
単一選択リストボックスの場合、選択された項目の文字列はSelectedItemプロパティで参照することができます。選択された項目の位置(数値)はSelectedItemPosプロパティで参照することができます。
複数選択リストボックスの場合、選択された項目の文字列はSelectedItemsプロパティで参照することができます。選択された項目の位置(数値)はSelectedItemsPosプロパティで参照することができます。
ダイアログ・コントロールにイベントを割り当てると、ボタンをクリックしたときなどにOpenOffice Basicのプロシージャを実行することができる。
ダイアログ・コントロールにイベントを割り当てる手順を次に示す。
ダイアログ・コントロールのイベント一覧を次に示す。
| イベント | 説明 |
|---|---|
| 作動時 | ダイアログ・コントロールが作動したときに発生するイベント。 コマンドボタンであれば、(マウスまたはキーボードにより)ボタンが押されたとき。 |
| フォーカスを得た時 | マウスクリックまたはタブキーが押されてフォーカスを得たときに発生するイベント。 |
| フォーカスを失った時 | マウスクリックまたはタブキーが押されてフォーカスを失ったときに発生するイベント。 |
| キーを押した時 | ダイアログ・コントロールにフォーカスがあるときに、何らかのキーが押されたら発生するイベント。 コマンドボタンの場合、スペースキー(ボタンを押す)だけでなくタブキー(フォーカスの移動)が押されてもイベントが発生するので注意。 |
| キーを離した時 | ダイアログ・コントロールにフォーカスがあるときに、何らかのキーが押されたらに発生するイベント。 |
| マウスを中に入れた時 | マウスカーソルをダイアログ・コントロール内に入れたときに発生するイベント。 |
| マウスボタンを押した時 | マウスボタンが押されたら発生するイベント。 |
| マウスボタンを離した時 | マウスボタンを離したら発生するイベント。 |
| マウスを外に出した時 | マウスカーソルをダイアログ・コントロール内から外に出したときに発生するイベント。 |