Pythonマクロ
予備知識として Visual Basic for Applications/シートからの読み書き があることを前提とする。つまり、VBAまたはLibreOffice Basicの操作が一通りできることを前提とする。
概要
編集LibreOffice は、現状(2022年に確認)、Pythonマクロを作成できる。
互換性など
編集一方、Microsoft Excel では現状(2023年8月)ではPythonマクロは不可能である。よって、Excel との互換性を重視するなら、Pythonマクロは控えるべきである。また、マクロ独自の命令があるので、独自命令の部分には当然ながら一般のPythonインタプリタとの互換性は無いはずである。
なお、2023年8月現在、Microsoft社が将来的にExcelでPython関数を使える新機能を宣言した[1]が、ただしこれは現状ではマクロではなくワークシート関数である。またなお、現状ではクラウド上に限定された microsoft365 系の環境での実行のようである(名称を見るかぎり、「365」などの字句が入っているので。詳細は不明)。
エディタは無い
編集LibreOfficeにPythonマクロ を編集するエディタは無い。つまり、VBAのようにcalc内のアプリで編集する機能は無い。
なので、外部のテキストエディタなどでマクロ用のPythonファイルを編集する。
マクロ用といえどもPythonファイルなので、ファイル名には拡張子「.py」をつける事になる。
LibreOfficeの場合
編集準備と実行方法
編集詳しくは Libreoffice 公式サイト Pythonスクリプトの管理(2022年6月11日に確認.) にある。
Windowsの場合の準備
編集- フォルダの作成
Windowsの場合、まず、
\AppData\Roaming\LibreOffice\4\user
を探す。
そのあと、構成が
\AppData\Roaming\LibreOffice\4\user\Scripts\python
となるように、フォルダ Scripts および フォルダ python を自作する。
これは、こうと仕様が決まっている。
なお、フォルダ「4」は、単にLibreOfficeがバージョン4台になったときに仕様が大きく変更されて、その系統が2022年の今でも続いているので、「4」という名前なだけである。なお、2022年のLibreOfficeはバージョン7台である。
今後のマクロファイル書き換えの際にアクセスしやすくため、ショートカットを作っておこう。
- セルの準備
読み取りたいセルに事前に値を入れておく。
下記コード例では、A1とA2を読み取って加算するので、そこに数値を入れておく。
Linuxの場合
編集たとえばFedora36の場合、
/.config/libreoffice/4/user/Scripts/python
という構成になるように、フォルダ Scrits と フォルダpython をそれぞれの位置に作る。
隠しフォルダ .config を表示するには、単にファイルブラウザ上のホームフォルダで、右上にあるメニューボタン(ハンバーガー杖の形状なのでハンバーガーメニューという)から、「隠しファイルを表示」にチェックを入れればいい。
そのあと、Linuxのショートカット(Linux用語では「シンボリックリンク」という)は下記コマンドで作れる。
ln -s /home/ユーザー名/.config/libreoffice/4/user/Scripts
なお、既存の「\libreoffice」ディレクトリや \user ディレクトリへのショートカットをつくろうとしても、失敗し、コマンドライン上に「作成に失敗しました: ファイルが存在します」と表示される。
どうやら「\libreoffice」などの実態がショートカットのようである。
実行方法
編集そのあと、下記コードを書いたpythonファイル(拡張子.py)を、Windowsの場合なら作成しておいた \AppData\Roaming\LibreOffice\4\user\Scripts\python にある pythonフォルダに入れる(pythonという名前のフォルダは1個のみ)。
Linuxの場合なら同様に、 /.config/libreoffice/4/user/Scripts/python にあるpythonフォルダに下記コードを入れる(pythonという名前のフォルダは1個のみ)。
import uno
from msgbox import MsgBox
def my_first_macro_calc():
doc = XSCRIPTCONTEXT.getDocument()
a = doc.Sheets[0]['A1'].Value
b = doc.Sheets[0]['A2'].Value
c = a + b
doc.Sheets[0]['A3'].Value = c
return
Libreoffice では上記コードのように uno というパッケージをインポートすることで、Pythonマクロが使える。
uno を指定しているのは、別にwiki編集者の好みではなく、windowsの場合、windowsにインストールしたLibreofficeのフォルダ構成を調べると既に uno という名前のフォルダがある。このように、Libreoffice では uno が指定されている。
同様にLinuxでも、すでに /.config/libreoffice/4/user/uno_packages がインストール時点で存在している。
さて、ネット検索でpythonマクロの uno について調べる際は PyUNO などの名前で調べると区別しやすい。
さて、上記のフォルダに上記ファイルを入れると、Libreoffice Calc での
ツール > マクロ > マクロの管理
の操作により現れるウィンドウ「マクロセレクター」で、アクセスできる。
画面左下「ライブラリ」のマイマクロをクリックして展開すると、
右側「マクロ名」にコード中の関数名「my_first_macro_calc」が表示される。
コードにエラーがある場合は表示されないので、コードを修正する。
セルA3 に セルA1とセルA2の和が表示されていれば成功である。
コードの解説
編集マクロ独自の部分の解説だけをする。
再掲
import uno
from msgbox import MsgBox
def my_first_macro_calc():
doc = XSCRIPTCONTEXT.getDocument()
a = doc.Sheets[0]['A1'].Value
b = doc.Sheets[0]['A2'].Value
c = a + b
doc.Sheets[0]['A3'].Value = c
return
関数名(my_first_macro_calc
の部分)は、キーワード・組込み関数・組込みクラスと衝突しなければ、有効な識別名なら何でもよく、上記コード例では、慣用的によく使われる関数名をつけておいた。
XSCRIPTCONTEXT.getDocument()
は、Pythonマクロ関数の最初に書き、これは呼び出したシートと当Pythonファイルとのアクセスの命令である。
これを、doc = XSCRIPTCONTEXT.getDocument()
のように任意の変数に代入する。別に doc でなくとも aaaa とか何でも良いのだが、わざわざ分かりづらい変数名をつける必要も無いので、慣用的によく使われる変数名 doc などをつけると良いだろう。
セルの値を読み取る際、Visual Basicのように変数をdimなどで宣言する必要は無い。そもそもPythonの文法では、変数を宣言しない。
doc.Sheets[0]['A1'].Value
のように、プロパティにより、読み取らせるセルの指定(.Sheets[0]['A1'])と、値を読み取らせることの指定(.Value)をする。
再掲になるが、Sheets や Value は大文字と小文字を区別するので、必ずこの表記の通りに入力すること。
その他
編集getValue() など
編集Value
プロパティの代わりに、メソッド的なgetValue()
関数 および setValue()
関数 を用いてもいい。
getValue()
はセルを読み取る関数(メソッド)である。
setValue()
はセルに書き込む関数(メソッド)である。
大文字と小文字を区別するので、この通りにコードを書かないといけない。
- コード例
import uno
from msgbox import MsgBox
def my_first_macro_calc():
doc = XSCRIPTCONTEXT.getDocument()
a = doc.Sheets[0]['A1'].getValue()
b = doc.Sheets[0]['A2'].getValue()
doc.Sheets[0]['A3'].setValue(c)
return