Calc(91)追加できるリスナー一覧: その11 変化を検知するリスナー

2018-11-16

旧ブログ

t f B! P L
セルが変化したらマクロを実行するにはCalc(59)追加できるリスナー一覧: その10 実行結果の整理で調べたXChangesListenerを使おうと思ったのですが、思った通りに動かなかったので、XModifyListenerとの違いを調べて一覧にしました。

前の関連記事:Calc(90)ちょっと気になるところの設定の変更方法


変化で発火するリスナーの発火条件



インターフェイスXChangesListenerのchangesOccurred()XModifyListenerのmodified()
変化した情報の取得不可
サブジェクトドキュメントドキュメントシートセル範囲(単一)セル
GUIで操作セルにキーで値を入力発火2回発火発火発火発火
セルの値をDeleteキーで削除発火発火発火発火発火
セルの値をカット発火なし発火発火発火発火(リスナーもペースト先に移動する)
シートからの値をペースト発火発火発火発火発火
プレインテキストをペースト発火なし発火発火発火発火
背景色を変更発火発火発火なし発火なし発火なし
書式を変更発火発火発火なし発火なし発火なし
枠線を引く発火なし発火発火なし発火なし発火なし
(セル範囲内に)セルを挿入発火なし発火発火なし発火なし発火(セルと連動してリスナーも移動)
(セル範囲内の)セルを削除発火なし発火発火発火発火(リスナーも削除される)
(セル範囲内に)行を挿入発火発火発火発火発火(セルと連動してリスナーも移動)
(セル範囲内の)行を削除発火発火発火発火発火(リスナーも削除される)
Python
マクロで操作
値を入力発火なし発火発火発火発火
背景色を変更発火なし発火発火なし発火なし発火なし
書式を変更発火なし発火発火なし発火なし発火なし
枠線を引く発火なし発火発火なし発火なし発火なし

LibreOffice 5.4.1.2 on linuxBean14.04、で調べたものです。

XChangesListenerはドキュメントに追加するだけでchangesOccurred()メソッドの引数から変化した内容を取得できるので、便利と思ったのですが、プレインテキストをペーストしたときやマクロでの操作には発火しないのでいまいち使いにくいことに気が付きました。

XChangesListenerに対してXModifyListenerはプレインテキストのペーストやマクロの操作にも反応します。

XModifyListenerのmodified()メソッドは変化した内容を取得することはできませんが、ドキュメントだけでなく、シートやセル範囲、セルにも追加できるので、変化を検知する範囲をサブジェクトによって限定することができます。

背景色や、書式、枠線はマクロでの操作ではいずれもそれぞれのプロパティの変更になり、XChangesListenerはいずれにも反応しないのですが、GUIからの操作では背景色の変化や書式の変更ではXChangesListenerが反応しています。

「Sheet1.A1 を監視、その後に Sheet1 を削除すると監視するセルが Sheet2.A1 に変わる。」(OOobbs2/195 - ...?)と書いてあるので、やってみるとその通りでした。

この対策は難しそうです。

マクロでシートを削除するときは、削除前にマクロでリスナーをはずせばよいのですが、GUIでシートが削除されたときは、シートの削除時に発火するリスナーはいくつかあるのですが、「削除」を検知するリスナーをみつけることができませんでした。

GUIでシートを削除するのを抑制する手段しかなさそうです。

逆にシートをコピーしたときはリスナーはくっついてきませんでした。

(2018.11.25追記。Windows版のLibreOffice 6.1.3.2 (x64)では、ModifyListenerのmodified()メソッドからModifyListenerが監視しているセルの値を変更してmodified()メソッドを入れ子で発火させるとクラッシュします。なので、ModifyListenerが監視しているセルの値を変更するときはその前後でModifyListenerを外してまた追加する操作が必要になります。Linux版(x86)ではそのようなことをする必要はありませんでした。おそらくWindows版とLinux版すべてに当てはまると思われます。
同一のModifyListenerだけでなく、値を変更するセル範囲についているModifyListenerすべてを外して付け直さないとクラッシュします。結構面倒ですね。)

参考にしたサイト


OOobbs2/195 - ...?
Calc のセルの値や数式を監視するウォッチウィンドウ。

次の関連記事:Calc(92)シート印刷時に改ページを挿入する位置をコントロールする

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ