前の関連記事: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()は効果がありませんでした。
0 件のコメント:
コメントを投稿