前の関連記事:Calc(25)フレームのサービスとインターフェイス一覧
GUIでシートイベントにマクロを登録する方法
Calcドキュメントのシートタブを右クリック→シートイベント。
「マクロ」ボタンをクリックするとマクロセレクターが開くので、「ダブルクリックをした時」にマクロを割り当てます。
しかしこれでシートをダブルクリックするとエラーがでます。
位置引数を1つ受け取っていないと言われます。
引数をTCUでみてみると、引数はダブルクリックしたセルが入っていました。
def macro(cell): cell.setString(getRangeAddressesAsString(cell))(関数getRangeAddressesAsString()はCalc(23)セルやセル範囲のアドレスの取得方法のものです。)
これでダブルクリックしたセルにそのセルのアドレスが入力されます。
でも、そのあとにセル編集モードになってしまいます。
メニューからは編集→セル編集モード、でセル編集モードになり、ESCキーをクリックすると編集モードが解除されます。
これをするAPIは見つけられず、マクロの記録をやってみるとディスパッチコマンドの.uno:SetInputModeでセル編集モードにはできました。
シートイベントを割り当てるマクロにはマウスハンドラを使っているようで、戻り値にTrueを返すとセル編集モードにならないことが確認できました。
def macro(cell): cell.setString(getRangeAddressesAsString(cell)) return True # セル編集モードにしない。Falseを返した場合はセル編集モードになります。
シートイベントのマクロの割り当てはドキュメントのcontent.xmlのノードに保存されている
シートイベントのマクロの割り当てはどこに保存されているのか調べたところドキュメント内のcontent.xmlに保存されていました。
<office:document-content> <office:body> <office:spreadsheet> <table:table table:name="Sheet1" table:style-name="ta1"> <officeooo:event-listeners> <script:event-listener script:language="ooo:script" script:event-name="office:dblclick" xlink:href="vnd.sun.star.script:SpreadSheetExample|SpreadSheetExample|src|wclick.py$macro?language=Python&location=user" xlink:type="simple" /> </officeooo:event-listeners>途中略していますが、この階層で各シートごとに保存されていました。
各シートごとの指定なので、シートをコピーしてもシートイベントはコピーされませんでした。
今回はマイマクロフォルダのマクロを指定したので、マイマクロフォルダへのパスでマクロが指定されています。
ドキュメントに保存されている情報は、イベントとマクロの割り当てだけなので、他のPCに移動させても同じようにシートイベントでマクロを起動したいときは、ドキュメント埋め込んだマクロを指定しないといけません。
マクロをドキュメントに埋め込むにはLibreOffice5(87)Pythonマクロのための拡張機能APSOのインストールのAPSOを使うとGUIで簡単にできます。
Eclipseでマクロファイルを編集して、そのファイルをAPSOでドキュメントに上書き保存して、動作確認をしています。
シートイベントを設定しても、パソコンの電源を切ると設定はリセットされてしまいます。そういう物なのでしょうか。リセットされない方法はあるのでしょうか。
返信削除その辺りを何かご存じですか。
私の環境ではそうなったことはありませんので不思議ですね。
返信削除電源を切るとリセットされるというのも不思議ですね。マクロファイルへのリンクが切れているとかでしょうか?
でもそれもイベントとは関係なさそうですね。
Javaのマクロでない限りjreは関係ないはずですので不思議ですね。
削除