5. その他の関数の調べかた
ヘルプを見ると、他にもたくさんの組み込み関数があるのが見えたと思います。例えば、「小数点
以下を四捨五入したい、切り捨てたい」とか、「商の余りを求めたい」とか、「小文字を大文字にし
たい」というような場合に、どの関数を使ったらいいのかを調べるには、「LibreOffice ヘルプ」の「ナ
ビゲーション範囲」を「LibreOffice Basic」にして、目次タブで、「マクロとプログラミング -> コマンド
リファレンス -> 実行時関数、ステートメント、演算子」などのなかを探します。「同 -> 数値関数」や
「同 -> 文字列 -> 文字列の編集」などは、特によく使うでしょう。「マクロとプログラミング」の配下
は、ひと通り目を通されることをお勧めします。
なお、これとまったく同じ資料が、LibreOffice のヘルプサイトにも掲載されています。
「 https://help.libreoffice.org/Calc/Functions_by_Category/ja 」で、「数学」や「文字列」とたどります。
Sub と Function
マクロには、「Sub」のほかに
「Function」というのもあります。サブ
ルーチンとの違いは、処理結果をファ
ンクション名の変数に代入して戻り
値として返すところです。また、
Function は、他の Sub から呼び出し
て使うだけでなく、スプレッドシート上
のセルにおいて、自作関数として、ま
るでワークシート関数のように使うこ
ともできます。Main サブルーチンの
下に、以下を追記して保存したあと、
Calc 画面に戻って、適当なセルに「
=fFive()」と入力してみてください。なおこのとき、関数名の大文字と小文字は区別されません。
Function fFive()
fFive = 5
End Function
変数とは
プログラミングには変数がかかせません。変数とは、マクロコードにおいて本来であれば特定の
数値や文字列を決め打ちで書くような部分を、変数に置き換えて書いておき、マクロを実行すると
きには変数に本来の数値や文字列を代入して、決め打ちしていたときと同じ動きをさせる、という
抽象化のための仕組みです。(例:「あれなんやけど、できてるかな?」「ああ、あれな。できてるで。」
で通じる、「あれ」が変数。シチュエーションによって「あれ」の指すものは変わる。)
変数を使って、コードを書く量を少なくしたり、のちに変更があってもマクロコードの修正が少な
く済むようにしたり、そのコードで何をやっているのかが分かりやすくなるようにします。
- 5 -
図 7: Function はセルでも使える
6. まず、実際に変数を使ってみましょう。「Module1」モジュールの「Main」サブルーチンを、次のよう
に書き換えて、実行してみましょう。
Sub Main
Dim sMsg as String
Dim iVal as Integer
sMsg = “Hello World!”
iVal = MsgBox( sMsg , 3 ) 'MsgBox()関数の第3引数のみ省略
MsgBox( iVal )
iVal = fFive()
MsgBox( iVal)
End Sub
「sMsg」と「iVal」というのが、変数です。これは、筆者が勝手に決めた変数名です。今回はたまた
ま「sMsg」、「iVal」としましたが、ほかの名前にしても、実行結果は変わりません。変数は自分で好
きなように命名することができます。ただし、組み込み関数名やステートメント名などの予約語で使
われている名前は、変数名には使えません。(Sub とか MsgBox とか)
このように、変数は、前もって用意されているのではなく、サブルーチンの初めなどで、次のよう
な形で定義(宣言 Dimension)します。データの型には、数値、文字列、オブジェクトなどがあります。
Dim 変数名 as データの型
変数の仕様を調べる
変数のデータの型の詳しい仕様は、LibreOffice Basic IDE で「LibreOffice ヘルプ」ボタンをクリッ
クして、索引タブで検索語(S)を「変数」とすることで、みることができます。
または、目次タブで、「マクロとプログラミング -> 一般的な情報およびユーザーインターフェイス
の使用法 -> 構文 -> 変数の使用法」、もしくは「マクロとプログラミング -> ガイド -> 変数の使用
法」としても、同じヘルプにたどり着けます。
なお、これとまったく同じ資料が、LibreOffice のヘルプサイトにも掲載されています。
「 https://help.libreoffice.org/Main_Page/ja 」で、「・LibreOffice Basic (ベーシック言語を使ったプロ
グラミング)」->「LibreOffice Basic のプログラミング」->「構文」->「変数の使用法」とたどります。
変数名の命名規則には、様々な流派があり、ある意味ノウハウ的なところもありますが、
1文字目:「変数のデータ型の型名の頭文字の小文字」
2文字目:「大文字」
3文字目以降:「小文字」
という形にすると、変数であることがすぐわかるうえに、どんな値が代入されているのかを推測しや
すくなるのではないでしょうか。
- 6 -
7. 変数のクラス 内容 宣言の例
数値 整数(-32,768〜32767)
ロング整数(-2,147,483,648〜2,147,483,647)
単精度小数(浮動小数点方式)
(3.402823x10E38〜1.401298x10E-45)
倍精度小数(浮動小数点方式)
(1.79769313486232x10E308〜
4.94065645841247x10E-324)
通貨型(固定小数点方式)(整数部 15 桁と
小数部 4 桁)
Dim iVal As Integer
Dim iVal%
Dim lVal As Long
Dim lVal&
Dim sVal As Single
Dim sVal!
Dim dVal As Double
Dim dVal#
Dim cVal As Currency
Dim cVal@
文字列 最大 65,535 文字の文字列を格納できます。 Dim sVal As String
Dim sVal$
ブール型 TRUE(真)または FALSE(偽)という2つの値
のどちらか一方のみを格納できます。数値 0
は FALSE と評価され、その他すべての値は
TRUE と評価されます。
Dim bVal As Boolean
オブジェクト なんでも代入できる、汎用的な型。処理対象
となるドキュメントや、セルなども、この型の変
数に格納します。
Dim oVal As Object
その他 日付型 Dim dVal As Date
オブザーバーで変数の変化を観
察する
「sMsg」や「iVal」にカーソルを置いた
状態で、「オブザーバーの有効化(F7)」
ボタン をクリックすると、左下のオブ
ザーバーウィンドウの変数の欄に、
「sMsg」や「iVal」が表示されます。 「ス
テップイン(F8)」ボタンを数回クリックし
て、「値」や「種類」がどのように変化して
いくか観察します。変数の上にマウス
オーバーすることでも、その時点でその
変数に代入されている値を確認すること
ができます。
- 7 -
図 8: オブザーバーウィンドウで変数の変遷を観察
8. 配列とは
いくつかの変数をまとめて扱いたい場合に、1つの変数名においてまとめることができます。これ
を、配列といいます。詳しくは、ヘルプで「変数の使用法」の配列の説明を確認してください。
配列の宣言 配列の長さ(インデックス、要素の数)
Dim sVal$(20) 0 から 20 まで計 21 個の要素が確保されます。
Dim sVal$(5,4) 計 30 個の要素が確保されます (6 x 5 要素の行列として)。
Dim sVal$(5 To 25) 5 から 25 まで計 21 個の要素が確保されます。
Dim sVal$(-15 To 5) -15 から 5 まで (0 も含めた) 計 21 個の要素が確保されます。
配列の要素を利用する場合は、インデックス番号を指定します。
図の例では、インデックスが0から2までで要素が3個の配列 sMsg ( ) を宣言して、各要素に順
番に文字列を代入し、順番に MsgBox 関数で表示させています。
なお、配列のインデックスの最小値、最大値は、LBound()関数、UBound()関数で求められます。
Sub Main
Dim sMsg(2) As String
sMsg(0) = "Good Morning World!"
sMsg(1) = "Hello World!"
sMsg(2) = "Good Night World!"
MsgBox( sMsg(0) )
MsgBox( sMsg(1) )
MsgBox( sMsg(2) )
MsgBox( LBound(sMsg()))
MsgBox( UBound(sMsg()))
End Sub
制御文とは
通常、マクロコードは先頭行から順番に実行されます。これを、特定の行だけ、指定した回数繰
り返し実行させたり、指定した条件が成立した場合にだけ実行させたりすることができます。このよ
うなプログラムの実行制御を行うためのステートメントは、大きく分けて条件分岐、ループ (繰り返
し)、ジャンプ (移動) の3種類があります。
詳しい仕様は、LibreOffice Basic IDE で「LibreOffice ヘルプ」ボタンをクリックして、目次タブで、「マ
クロとプログラミング -> コマンドリファレンス -> 実行時関数、ステートメント、演算子 -> プログラム
実行の制御」でみることができます。
なお、これとまったく同じ資料が(ry
- 8 -
9. 条件判定ステートメント
例として、「If...Then...Else」ステートメントを使ってみましょう。
Sub Main
Dim sMsg(2) As String
Dim iVal as Integer
sMsg(0) = "Good Morning World!"
sMsg(1) = "Hello World!"
sMsg(2) = "Good Night World!"
iVal = MsgBox(“今は朝ですか?”,3,”If Then Else”)
If iVal = 6 Then
MsgBox( sMsg(0) )
ElseIf iVal = 7 Then
MsgBox( sMsg(2) )
Else
MsgBox( sMsg(1) )
End If
End Sub
ループ(繰り返し)
例として、「For...Next」ステート メントを使ってみましょう。
Sub Main
Dim sMsg(2) As String
Dim iVal as Integer
sMsg(0) = "Good Morning World!"
sMsg(1) = "Hello World!"
sMsg(2) = "Good Night World!"
For iVal = 0 To 2
MsgBox( sMsg(iVal) )
Next
End Sub
ジャンプ(移動)
例として、「On Error GoTo ...Resume」ステートメントを使ってみましょう。
これは、「マクロとプログラミング -> コマンドリファレンス -> 実行時関数、ステートメント、演算子 ->
エラーを制御するための関数」に分類されています。
- 9 -
10. Sub Main
On Error GoTo ErrorHandler
Error(1)'Error 関数で、あえてエラーを発生させます。
Exit Sub
ErrorHandler:
Reset
MsgBox ("エラーが起きました。エラー内容:" & Error,0+48,0"エラー発生!")
End Sub
メモ
ヘルプには、サンプルコードが掲載されています。これをコピー&ペーストでモ
ジュールに持ってきて実行し、実際の動作を確認してみるのもよいでしょう。
Calc 的なマクロも軽く
「Calc 固有のオブジェクト」を直接操作するスタイルのマクロについて、次のサイトに、とても詳し
く、わかりやすく説明されています。ここまでで、マクロを「読む」ことはできるようになったと思いま
す。こちらのサイトにも、多くのサンプルが掲載されていますので、コピペして確認してみましょう。
Macro の杜 [ マクロ for OpenOffice.org and LibreOffice ] Calc( 表計算 )
http://openoffice3.web.fc2.com/OOoBasic_Calc.html
Sub Main
ThisComponent.Sheets(0).getCellByPosition(0,0).value=1
'←セル A1 に数値の 1 を入力
ThisComponent.Sheets(0).getCellByPosition(0,1).String="test"
'←セル A2 に文字列の test を入力
ThisComponent.Sheets(0).getCellByPosition(0,2).Formula="=A1*10"
'←セル A3 に式( =A1* 10)を入力
End Sub
「Sheets」の「getCellByPosition ( ) 」 というのを、調べてみたいところです。
オブジェクトの調べ方
オブジェクトにどのようなものがあるのか、またそのオブジェクトにはどのようなメソッドやプロパ
ティがあるのか、ということを調べるには、以下のサイトで探しますが、慣れるまではなかなか必要
な情報にたどり着けないかもしれません。
・LibreOffice 4.2 API Documentation ( http://api.libreoffice.org/ )
- 10 -
13. めて、「セル B3 を選択」して、「文字列”LibreOffice”と入力」して、「Enter を押下してひとつ下のセ
ルに移動」して、そこで「記録の終了」を押下しましょう。マクロの保存先を聞かれますので、「マク
ロの練習.ods -> Standard -> Module1 -> Main」として「保存」ボタンをクリックします。上書きするの
かと聞かれますので、「はい」としましょう。以下のようなマクロコードが記録されたと思います。
sub Main
rem
---------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem
---------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem -----------------------------------------------「セル B3 を選択」----
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$3"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
rem ------------------------------------「文字列”LibreOffice”と入力」----
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "LibreOffice"
dispatcher.executeDispatch(document, ".uno:EnterString", "", 0,
args2())
rem ------------------------------「Enter を押下してひとつ下のセルに移動」----
dispatcher.executeDispatch(document, ".uno:JumpToNextCell", "", 0,
Array())
end sub
ひとつひとつの操作が、「Dispacher」に対してコマンド URL と設定値を与えて実行する、という体
裁のマクロコードで記録されています。オブジェクトを直接操作するスタイルのマクロコードと見比
べると、ちょっとまわりくどいというか、なれるまでは意味がわかりにくいかもしれません。
- 13 -
14. このことについても、やはり先ほどのサイトに、とても詳しく、わかりやすく説明されています。
Macro の杜(OpenOffice.org/LibreOffice Basic 編)
Macro の記録 / Record Macro (魔法の Command 「 DispachHelper 」編 )
http://openoffice3.web.fc2.com/OOoBasic_DespatchHelper.html
また、「Dispacher」に対して与えられるコマンド URL にどのようなものがあるかについては、次の
サイトが参考になります。もちろん、マクロにしたい操作を「マクロの記録」でコードにすることでも、
目的のコマンド URL がわかると思います。
http://hermione.s41.xrea.com/pukiwiki/index.php?OOoBasic%2FGeneric%2Fcommands_2.3.0
その他お薦めなサイトなど
・公式ヘルプサイト
https://help.libreoffice.org/Main_Page/ja
https://help.libreoffice.org/Basic/MsgBox_Function_Runtime/ja
https://help.libreoffice.org/Basic/Using_Variables/ja
https://help.libreoffice.org/Basic/Controlling_Program_Execution/ja
・The Document Foundation (TDF) Wiki
https://wiki.documentfoundation.org/
・Getting Started with LibreOffice 「Chapter13: Getting Started with Macros」(英語)
https://wiki.documentfoundation.org/images/9/9a/GS4013-GettingStartedWithMacros.pdf
・Calc Guide 「Chapter12: Calc Macros」(英語)
https://wiki.documentfoundation.org/images/2/27/CG4012-CalcMacros.pdf
・LibreOffice 4.2 API Documentation
http://api.libreoffice.org/
・SpreadsheetDocument
http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1sheet_1_1SpreadsheetDocu
ment.html
・SpreadsheetDocumentSettings
http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1sheet_1_1SpreadsheetDocu
mentSettings.html
- 14 -
15. ・JA 福岡「Excel to Calc マクロ移行マニュアル」
http://www.ja-fukuoka.or.jp/blog/archives/2012/05/exceltocalkpdf.php
・OSS( Open Source Software )でいこう!!/Macro の一歩
http://openoffice3.web.fc2.com/macro_ippo.html
・Macro の杜(OpenOffice.org/LibreOffice Basic 編)/[ マクロ for OpenOffice.org and LibreOffice ]
http://openoffice3.web.fc2.com/OOoBasic_Calc.html
・MRI オブジェクトブラウザ(「 MRI-1.2.1.oxt 」をダウンロードする。)
http://extensions.services.openoffice.org/en/project/mri-uno-object-inspection-tool
https://github.com/hanya/MRI/wiki/Home_ja
http://openoffice3.web.fc2.com/OOoBasic_General.html#OOoGMM01
http://hermione.s41.xrea.com/pukiwiki/index.php?OOoBasic/Macros/MRI/Documentation/Tips
・コマンド URL 一覧
http://hermione.s41.xrea.com/pukiwiki/index.php?OOoBasic%2FGeneric%2Fcommands_2.3.0
以上です。
補足
この文書は、LibreOffice Writer で作成したものを、ハイブリッド PDF で公開します。
PDF として閲覧が可能なほか、LibreOffice Writer で開けば、「ナビデーター(F5)」
や「スタイルと書式設定(F11)」を見ることで、「見出し」や「スタイル」が適用して
あることが確認していただけると思います。そちらもぜひ参考にしてください。
ライセンス
この文書は「CC BY-SA」で公開します。
筆者:那谷 進
- 15 -