前の関連記事:Calc(75)カラーパレットの色の名前と値の一覧
バックグラウンドでコントローラでドキュメントを操作するマクロ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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, #マクロセレクターに限定表示させる関数をタプルで指定。 |
行と列の固定や分割状態のセル範囲のアドレスの取得はコントローラでやらないといけないので、10行目で新規追加したシートをアクティブにしています。
これらの操作を見えないようにするために8行目でlockControllers()を使っています。
元のシートをアクティブにした後に19行目でunlockControllers()を使ってコントローラのロックを解除しています。
lockControllers()の代わりにaddActionLock()を使っても同じ結果でした。
Calc(57)lockControllers()やaddActionLock()でのマクロの速度比較のときと同様にlockControllers()とaddActionLock()の違いは見出せませんでした。
inBackGround.ods
このマクロを埋め込んだCalcドキュメントです。
Windows10でも同様な結果でした。
この埋め込みにはオートメーションのコードも付けたままにしてあります。
オートメーションではlockControllers()とaddActionLock()は効果がありませんでした。
0 件のコメント:
コメントを投稿