コンテンツにスキップ

Pythonマクロ

出典: フリー教科書『ウィキブックス(Wikibooks)』

予備知識として 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
  1. ^ 『Excelが「Python」に対応 シート上でコードを実行できるように グラフ作成、機械学習なども可能』、ITmedia NEWS、2023年08月23日 10時00分 公開