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

公開日: 2018年02月12日 更新日: 2019年05月11日

旧ブログ

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

前の関連記事: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, #マクロセレクターに限定表示させる関数をタプルで指定。
このマクロは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

«
Feb. 2018
»
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Created by Calendar Gadget

QooQ