今朝の新聞の「ひと」欄には、タイトルのような面白い名前の窯で焼しめで陶器を作っている中島浩文さんが紹介されていた。
陶器の町佐賀県武雄(たけお)市でその泥縄窯の窯元として釉薬(うわくすり)を使わない焼し締めという方法で陶器を製作している。焼き締めの面白さは「窯を開いたときに、思いかけないものができていることがある」と語っている。
今朝の新聞の「ひと」欄には、タイトルのような面白い名前の窯で焼しめで陶器を作っている中島浩文さんが紹介されていた。
陶器の町佐賀県武雄(たけお)市でその泥縄窯の窯元として釉薬(うわくすり)を使わない焼し締めという方法で陶器を製作している。焼き締めの面白さは「窯を開いたときに、思いかけないものができていることがある」と語っている。
表計算(Calc)のシート画面で条件にしたがって文字の色を変えるマクロである。
10X10のセルには0から100までの数値が書かれている。これは教課目の試験の点数だ。これに対してユーザは及第点を入力する(ui.InputBox関数を使う)。マクロではこの及第点と点数を比較して及第点に及ばないときはこのセルの中の文字を赤にする。
マクロ全体を示す:
#coding: utf-8
import uno
import screen_io as ui
import random
def level_judge_macro( *args):
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets[0]
for i in range(10):
for j in range(10):
sheet.getCellByPosition(i,j).Value=random.randrange(101)
#
level = ui.InputBox('及第点を入力してください')
level_v = int(level)
for i in range(10):
for j in range(10):
cell = sheet.getCellByPosition(i, j )
point_v =int(cell.Value)
if point_v < level_v:
cell.CharColor = 0xff0000
return
セルの属性(文字の色)は
cell.CharColor = 0xff0000
で16進定数で与えた。
InputBoxの実行イメージは:

とラベルの付いた入力窓である。
米ヶ袋の広瀬川の岸辺近くには珪化木となったメタセコイアが沢山見られる。下の写真はその一つである。近くにある説明板によると約300万年まえに大量の火山灰に埋もれたメタセコイアである。

片平キャンパスには沢山メタセコイアが植えられている。下の写真は旧理学部生物棟近くに植えられたメタセコイアの大木である。

右の建物が旧理学部生物棟(通称赤レンガ)である。このメタセコイアは嘗て米国から東北大学に贈られた三本の苗木の一つの成長したすがたと思われる。
構内にはメタセコイアが並木に植えられているとことが幾つかある。下の写真は構内北門近くにあるメタセコイアの並木である。

近くにある案内板の説明によればこの並木は前の写真の旧理学部生物棟にあったメタセコイアから挿し木として移植されたものである。メタセコイア(あけぼの杉)と書いてあった。
LibreOfficeでマクロを実行するときに便利なマクロ実行ボタンを配置することにする。
LibreOfficeのCalcの表計算のシート上にマクロ実行ボタンを付けることにする。
ボタンはフォーム機能が持つ部品の一つである。Calcの画面でプルダウンメニュー「表示」-> 「ツールバー」-> 「フォームコントロール」を選択し、フォーム作成のためのツール一覧を出しておく。
まず一覧窓の上部にあるフォーム機能の切り替えをデザイン・モードする。様々な部品が使えるようになる。その中の「ボタン」選択し、シートの適当な場所にドラックして配置する。
設置したボタンアイコンを右クリックしてメニューから「コントロールのプロパティー」を選択する。「全般」ではボタンの表面にあるタイトルを変えたり(例えば「マクロの実行」)、ボタンの背景色を変えたりできる。「イベント」ではこのボタンで起こり得るイベントとそのイベント処理プログラム(イベント・ハンドラ)を繋げることをする。今の場合は「ボタンが押されたとき」に問題のマクロが実行されるように繋ぐ(マクロに実行関数は引数なしでよいが、イベントハンドラーでは不定個数の引数を取れるようにする。つまりmacro() -> macro(*arg))。
これで準備ができた。デザイン・モードをオフにしてボタンを押してみる。マクロが実行されることを確認する。

【重要】このまま表を保存すると再度この表を開いたときにはフォームはデザインモードになっている。これは開発中であればよいがこのフォームをユーザが使うときは都合が悪い。表を開いたときにフォームのデザインモードがオフではじめたい。そのためにはこの表を保存するまえに
プルダウンメニュ「ツール」-> 「フォーム」-> 「フォームナビゲーター」選択。そのナビゲーター画面で「フォーム」を右クリックしデザインモードを解除した後に保存する。
今日の朝刊のコラム「気になるサイエンス」の記事のタイトルである。
仙台にはメタセコイアの木が沢山生えている。

このメタセコイアは現生種より化石が先に発見された。発見者は三木茂博士。いまから80年前のことである。博士は約1千万年前から100万年の地層で後にメタセコイアと命名される針葉樹の葉付き枝や球果の化石を発見し、これが現生のセコイアやスマスギの仲間と違う特徴を持っていることを確認。今は絶滅した「未知の植物」であるとしてメタセコイアと命名した。後に中国で現生種が発見され日本にも導入された。
三木博士が教鞭をとっていた大阪学芸大学(現在の大阪市立大学)の植物園はメタセコイアの日本のメッカである。
LibreOfficeのマクロをpythonで作ってみた。
標題のように「誕生日から今日まで日数を知る」ためのマクロである。表の誕生日データ(年、月、日)を使い目的の日数を表に記入する。
【例】1950/12/05生まれの人は今日(2021/04/29)までで25713日経過している。
暦計算ではユリウス日(Julian Day)が使われる。これは紀元前4713年1月1日からの連続した通し番号の日数である。この連続した日付けを使うと誕生日から今日までに経過した日数を知ることができる。Pythonではdatetimeモジュールでこれらの機能を提供している。これをマクロで使う。
プログラムの全体は以下のようになる:
#coding: utf-8
import uno
import screen_io as ui
import time
from datetime import date
class Birthday:
def __init__(self, mydate):
self.year= mydate[0]
self.month=mydate[1]
self.day= mydate[2]
def get_date(self):
return date(self.year, self.month, self.day)
def get_days(self):
today = date.today()
my_birthday=date(self.year, self.month, self.day)
time_to_birthday=abs(today-my_birthday)
return time_to_birthday.days
def get_years_days(self):
my_birthday=date(self.year, self.month, self.day)
today = date.today()
today_year=today.year
my_last_birthday=date(today.year-1,self.month, self.day)
lastday=date(today_year-1,12,31)
my_birthday_thisyear=date(today.year, self.month, self.day)
daydiff_today=abs(today-lastday)
daydiff_birthday=abs(my_birthday_thisyear-lastday)
if daydiff_today > daydiff_birthday:
yearspan=today.year - my_birthday.year
dayspan=abs(today-my_birthday_thisyear)
else:
yearspan=today.year - my_birthday.year-1
dayspan=abs(today - my_last_birthday)
return (yearspan, dayspan.days)
def elapsed_days_macro():
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets[0]
today=date.today()
msg = "今日は"+str(today)+"です。"
ui.Print( msg)
#データのある行数を調べる
sRange = sheet.getCellRangeByName("A1")
sCursor=sheet.createCursorByRange(sRange)
sCursor.collapseToCurrentRegion()
MaxDataRow = sCursor.Rows.Count-1
for i in range(MaxDataRow):
year = int(sheet.getCellByPosition(0, i+1 ).Value)
month =int(sheet.getCellByPosition(1, i+1 ).Value)
day = int(sheet.getCellByPosition(2, i+1 ).Value)
mydate=(year, month, day)
my_birthday=Birthday(mydate)
sheet.getCellByPosition(3,i+1).Value=my_birthday.get_days()
sheet.getCellByPosition(4,i+1).Value=my_birthday.get_years_days()[0]
sheet.getCellByPosition(5,i+1).Value=my_birthday.get_years_days()[1]
return
LIbreOfficeのPythonマクロで使える関数・定数などの情報は「マクロの森」が詳しい。また、ASOPのデバッガやコンソールはプログラミングに結構役に立つことが分った、
LibreOfficeのマクロをPythonで作るときに使えるユーティリティーにASOPというLibreOffice用の拡張機能がある。
ASOPの詳しい説明はここにある。
【準備】
早速最新版のapso.oxtファイルをダウンロードする。
LibreOfficeへの登録は
【実行】
早速ASOPを使ってみる。
Calcの「ツール」->「マクロ」->「Pythonスクリプトの管理」を選択する。ASOPの管理窓がでるので実行したいマクロを選択する。管理窓の「メニュー」から「デバッグ」を選ぶと以下のようなデバッガの画面がでる:

この画面で「端末」ボタンを押すとPythonコンソールの別画面が出る。「次へ」のボタンでプログラムの一行毎の実行と変数の値等が表示される。apso.oxtのインストールと同様にMRI.oxtをインストールしておくとこのデバッガの画面で変数の名前空間の性質も調べられる。「編集」ボタンで登録したエディタでマクロの編集ができる。「再スタート」ボタンを押すと編集の結果が反映される。「終了」ボタンを押すとデバッガは終了する(このデバッガはかなり有効に使える感じである)。またマクロにprint文があるとASOP管理下ではコンソールその出力がでる(これはprint文の多用したデバッグには便利)。
久ぶりのPythonの話題である。
LibreOfficeはそのマクロをPythonで書くことができるが、pythonが元々機能として持っていたprint文などがそのままでは使えない。このままではユーザインタフェースやデバッグ機能に欠けた状況でPythonマクロはあまり魅力的ではない。
調べてみるとprint文などに対応するユーザフェース機能をマクロが使うモジュールとして用意することできることがわかった。少し面白くなった。まずマクロのサンプルを示す:
import uno
import screen_io as ui
def my_first_macro_calc():
doc = XSCRIPTCONTEXT.getDocument()
for num, column in enumerate(['A1', 'A2', 'A3']):
cell = doc.Sheets[0][column]
cell.Value = num
ui.Print('OK?')
return
このマクロの保存場所は(windowsの場合)
C:\Users\~~\AppData\Roaming\LibreOffice\4\user\python
である。
これはLibreOfficeの表計算ソフトCalcのシート番号0のシートの’A1’欄に数値0、’A2’欄に数値1、’A3’欄の数値2を入れる簡単なマクロである。
ui.Print(‘OK’)は数値を書き込む毎に警告窓を出す。ここではデバッグ機能として使っている。この関数Printはscreen_ioモジュールで定義されていて、import screen_io as uiとしてインポートされてされている。import unoがシステムモジュールのインポートであるのに対してimport screen_ioはユーザモジュールのインポートである。このモジュールのの実体はここにある。このモジュールの保存場所は
C:\Users\~~\AppData\Roaming\LibreOffice\4\user\python\pythonpath
である。
このモジュールはbasic言語で作ったモジュールのラッパーらしい。このbasic言語のモジュールの実体もここにある。このモジュールも保存する。保存する場所はLibreOfficeのプルダウン・メニュのマクロで
マイマクロ->standard->module1と進み、編集ボタンで編集画面になるので実体をペーストし、保存する(モジュール名をuiScriptsとすることを忘れないで)。
以上でPrint関数を含むマクロを実行できる環境ができあがった。
最後にPrint関数の実行結果の画面を示す:

【蛇足】pythonでマクロを書くときの注意:
PowerPCのMacで使えたオフィス系のフリーソフトにLibreOffice4.0があった。そのMacを諦めてwindowsに移行した。LibreOfficeで作った資料も移行したがwindowsにあるMicrosoftのオフィス系のソフトでこの資料が読み込めないことが判明。
その対策としてLibreOfficeの最新版ではMicrosoftへの対応が改善されているかもしれないと思い、windowsにLibreOfficeの最新版7.1.2をインストールして使ってみた。
結論から言うとLibreOfficeの最新版は非常によくできていて、MicrosoftのOfficeは全く必要ない。
最近のMicrosoftのOfficeはLibreOfficeのデータを読み込めるようになっているという。互換性の面でもLibreOfficeの使用には問題なした。
LibreOfficeは
の6個のソフトウエアからなっている。特にWriter, Calc, Draw そしてMathの間のシームレスな統合処理は印象的である。さらにマクロ処理にPythonも使えることは面白いと思った。
簡単な統合処理の例を以下に示す: