Calc(76)画面の更新をせずにコントローラでシートを操作する

2018-02-12

旧ブログ

t f B! P L
Calc(63)セルの固定、ウィンドウの分割、の境界を取得するのマクロはコントローラを使っているのでコントローラをロックしたときにちゃんと動くのか確認しました。結論としてはlockControllers()でもaddActionLock()でもちゃんと動きました。

前の関連記事:Calc(75)カラーパレットの色の名前と値の一覧


バックグラウンドでコントローラでドキュメントを操作するマクロ

def macro(documentevent=None):  # 引数は文書のイベント駆動用。
 doc = XSCRIPTCONTEXT.getDocument()  # 現在開いているドキュメントを取得。
 controller = doc.getCurrentController()  # コントローラの取得。
 currentsheet = controller.getActiveSheet()  # 現在のシートを取得。
 sheets = doc.getSheets()  # シートコレクションを取得。
 sheets.insertNewByName("New", len(sheets))  # Newという名前の新規シートを最後に挿入。
 newsheet = sheets["New"]  # 新規シートを取得。
 doc.lockControllers()  # コントローラをロック。
#  doc.addActionLock()  # ドキュメントの更新を保留
 controller.setActiveSheet(newsheet)  # 新規シートをアクティブにする。
 controller.freezeAtPosition(4, 5)  # E6で行と列を固定。
 for i, subcontroller in enumerate(controller):  # インデックスも取得する。
  cellrangeaddress = subcontroller.getVisibleRange()  # 見えているセル範囲のアドレスを取得。
  cellrange = subcontroller.getReferredCells()  # 見えているセル範囲を取得。
  cellrange[0, 0].setString("Index: {}\nStartRow: {}, EndRow: {}\nStartColumn: {}, EndColumn: {}"\
   .format(i, cellrangeaddress.StartRow, cellrangeaddress.EndRow, cellrangeaddress.StartColumn, cellrangeaddress.EndColumn))  # 各コントローラーのセル範囲の左上端セルにセル範囲アドレスを代入する。
  cellrange[0, 0].getRows()[0].setPropertyValue("OptimalHeight", True)
 controller.setActiveSheet(currentsheet)  # 元のシートをアクティブにする。
 doc.unlockControllers()  # コントローラのロックを解除。
#  doc.removeActionLock()  # ドキュメントの更新を保留を解除。 
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。
このマクロはNewという名前のシートを追加して(6行目)、そのシートのE6セルで行と列の固定をして(11行目)各枠のセル範囲アドレスをそのシートに出力します(15行目)。

行と列の固定や分割状態のセル範囲のアドレスの取得はコントローラでやらないといけないので、10行目で新規追加したシートをアクティブにしています。

これらの操作を見えないようにするために8行目でlockControllers()を使っています。

元のシートをアクティブにした後に19行目でunlockControllers()を使ってコントローラのロックを解除しています。

lockControllers()の代わりにaddActionLock()を使っても同じ結果でした。

Calc(57)lockControllers()やaddActionLock()でのマクロの速度比較のときと同様にlockControllers()とaddActionLock()の違いは見出せませんでした。

inBackGround.ods

このマクロを埋め込んだCalcドキュメントです。

Windows10でも同様な結果でした。

この埋め込みにはオートメーションのコードも付けたままにしてあります。

オートメーションではlockControllers()とaddActionLock()は効果がありませんでした。

次の関連記事:Calc(77)コントローラのロックとアクションのロックとリスナー

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ