11月のカレンダー
1234567
891011121314
15161718192021
22232425262728
2930     
最近の日記
全体の新着
各月の日記
ユーザーRSS
hanyaさんの公開日記
10月03日
01:13
OOo Basic のマクロで、長方形でないセル範囲に同じ背景色を設定したいとき、いくつかのセル範囲に分割して取得、背景色を設定します。そのとき、次の二つの方法に速度差はあるでしょうか?どちらが早いか予想してみてください。

1. 分割した各セル範囲ごとに背景色を設定
2. css.sheet.SheetCellRanges を利用して一度に背景色を設定

マクロを始めようと思っていたりする人はコードを考えてみてください。1 は書けても、2 は使ったことのない人が多いかもしれません。

コードは下記参照、途中の If 文で True を指定した方が 1、False を指定すると 2 になります。2 の方法ではコンテナオブジェクトを再利用しています。

ここで注目するのは、背景色を設定する setPropertyValue("CellBackColor", ...) メソッドを呼び出す回数です。1 では範囲を二つに分けているため 2 回、2 ではコンテナオブジェクトを介して 1 回です。

それぞれ実行して必要時間を計測してみます。

Sub Main
oDoc = ThisComponent

oDoc.disableSetModified()
oDoc.lockControllers()
oRange = oDoc.getSheets().getByIndex(0).getCellRangeByPosition(0, 2, 10, 10)

t1 = GetSystemTicks()
If True Then
' 8500, 600
For i = 0 To 1999
oRange1 = oRange.getCellRangeByPosition(0, 0, 1, 0)
oRange2 = oRange.getCellRangeByPosition(1, 1, 2, 1)

oRange1.setPropertyValue("CellBackColor", 1000000)
oRange2.setPropertyValue("CellBackColor", 1000000)
Next
Else
' 6500, 900
oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
For i = 0 To 1999
oRange1 = oRange.getCellRangeByPosition(0, 0, 1, 0)
oRange2 = oRange.getCellRangeByPosition(1, 1, 2, 1)

oRanges.addRangeAddresses( _
Array(oRange1.getRangeAddress(), oRange2.getRangeAddress()), False)
oRanges.setPropertyValue("CellBackColor", 1000000)
oRanges.removeRangeAddresses( _
Array(oRange1.getRangeAddress(), oRange2.getRangeAddress()))
Next
End If
oDoc.unlockControllers()
oDoc.enableSetModified()

t2 = GetSystemTicks()
msgbox (t2 - t1)
End Sub

| - | total/msec | B/msec |
| 1 | 8500 | 600 |
| 2 | 6500 | 1500 |
total: 2000 回実行時
B: セルの背景色を設定せずに実行時

繰り返し回数はあまり多くありませんが、セル範囲コレクションへの追加と削除が行われているにもかかわらず、2 の方が早く終了しています。
セルの背景色を設定せずに実行した結果をみると、コレクションへの追加と削除にかかった時間は 900 msec / 2000 times ほどです。
公開日記トップへ
oooug-jp SNS

●サイドメニュー

  • 公開日記
  • >公開日記はログインしなくても読めます

http://www.ospn.jp/

inetd