2018年4月16日月曜日

LibreOfficeで数式からマクロを呼び出す方法

あまプロではオフィスソフトにリブレオフィスを使てます。

リブレオフィスではLibreOfficeBasicという言語でマクロが組めます。
他にもJavaScriptやBeanShellやPythonでもマクロを組む事が出来るそうです(…使った事は無いです)。
LibreOfficeBasicではSub(戻り値無し)とFunction(戻り値有り)の二種類を定義できます。

リブレオフィスで出来る事はマクロを組んで自動化する事が出来ます。
言い換えるとリブレオフィスで出来へん事はマクロで自動化する事が出来ません。

マクロを一から組むのは大変ですが、そんな方の為にリブレオフィスには操作の記録機能が有ります。
これはリブレオフィス上での操作を自動的にマクロ化して、保存してくれる機能です。

デフォルトでは何故か無効になっており
メニューのツール>オプション

LibreOffice>詳細>オプションの機能>マクロの記録を有効にする(限定的)
にチェックする事で有効化出来ます。

マクロを組む前に、普段の操作をマクロに置き換えるとどうなるのかを確認できます。

リブレオフィスのマクロ機能と似た機能で数式というのが有ります。
ちょっとややこしいのですが、リブレオフィスで数式と言いますと、2つ有りまして
一つがLibreOfficeMathという微積分等の複雑な数学式を記述する為の数式です。
もう一つがカルク等でセルの合計を出したりする簡単な処理の為の数式です。
ここで言うてるのは後者の方です。
カルクのセルで=から入力して始める数式です。

マクロと数式は出来る事が少し被ってまして、これまたややこしいのですが、違いを挙げてみると
数式は俗に言うワンライナー(一行で書く式です)。
セル内に改行無し(セル幅で折り返し)で書きますので、複数行になればとても見難いです。
マクロは複数行書けます。

数式はセル内に記述するのみですが、マクロはIDEという専用のソフトで記述します。
数式はデバッグ出来ませんが、マクロはデバッグ出来ます。

数式は各種イベント(ボタンクリックやショートカット等)に割り当てる事が出来ませんが、マクロは割り当てる事が出来ます。

なので、複雑な計算はマクロの方が組み易く読み易いです。
数式は範囲の合計や平均等の簡単な計算式の場合に便利です。

ここで一つ数式とマクロを組み合わせる方法を紹介します。
業務の中で、複雑な処理はマクロで組んで、その処理結果のみを数式で使いたい場合が有ります。
リブレオフィスのwikiには載ってませんので、公式な方法やないのかもしれません…ひょっとしたらバージョンアップに伴い使えなくなる方法かもしれませんが、取り敢えずあメログ。

先ずFunctionを作成します。
Function checkStr( param0 As String) As String
    If isEmpty( param) Then
        checkStr = "無"
    Else
        checkStr = "有"
    EndIf
End Function
戻り値が有るFunctionで有れば何でも良いです。
例では引数を判定して有無を返すFunctionにしてます。

コンパイルしてエラーが無い事を確認したら、
カルクの数式でFunctionを呼び出しするだけです。
=CHECKSTR( "ほげほげ")
以上、簡単ですね。
仕様でFunction名が大文字に変えられてしまいますが、これはどないもならん様です…。

LibreOfficeBasicのみでしか確認しておらず、他マクロ言語でも通じるかは判りませんが、
この方法を使うと、マクロに複雑な処理を記述して、それを呼び出す数式では簡潔にする事が出来ます。

勿論、条件付き書式でも使う事が出来ます。
マクロでも書式を変更する事が出来るのですが、条件付き書式ではGUIで書式を変更できます。

参考までに、作成したサンプルを置いておきます。

2018年4月12日木曜日

Scratch Day 2018 in AMA

あまプロではScratchを使ってプログラミングを教えています。

スクラッチは5月にリリースされましたので、毎年5月にはスクラッチデーという世界イベントが開催されます。
尼崎でも小規模ながら5月13日()に地元の団体と合同でクラッチデイを開催します。
https://day.scratch.mit.edu/events/5968/
お隣の伊丹でも6月に開催されるそうですよ。
参加費は無料で、パソコンをお持ちでない方にはお貸ししますので、興味の有る方は是非お申込み下さい。
設備の用意が有りますので、必ず事前申し込みをお願いします。
みんなでおもろいゲームを作りましょう〜。