前の関連記事: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 件のコメント:
コメントを投稿