Calc(26)シートイベントにマクロを登録してダブルクリックで起動する

2017-10-20

旧ブログ

t f B! P L
GUIで簡単にシートイベントにマクロを登録できます。シートごとに設定する必要があります。シートをコピーしてもシートイベントはコピーされません。マクロに引数を設定する必要がありました。そのシートをダブルクリックするとマクロを起動するようにしてみました。

前の関連記事: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&amp;location=user"
      xlink:type="simple" />
    </officeooo:event-listeners>
途中略していますが、この階層で各シートごとに保存されていました。

各シートごとの指定なので、シートをコピーしてもシートイベントはコピーされませんでした。

今回はマイマクロフォルダのマクロを指定したので、マイマクロフォルダへのパスでマクロが指定されています。

ドキュメントに保存されている情報は、イベントとマクロの割り当てだけなので、他のPCに移動させても同じようにシートイベントでマクロを起動したいときは、ドキュメント埋め込んだマクロを指定しないといけません。

マクロをドキュメントに埋め込むにはLibreOffice5(87)Pythonマクロのための拡張機能APSOのインストールのAPSOを使うとGUIで簡単にできます。

Eclipseでマクロファイルを編集して、そのファイルをAPSOでドキュメントに上書き保存して、動作確認をしています。

次の関連記事:Calc(27)ドキュメント内のすべてのシートでクリックを補足する

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ