目次
無料のスプレッドシート LibreOffice Calc のセルを、 Basic の中でまとめて扱う方法について書きました。 Microsoft Office Excel の VBA では、 Range として複数のセルを扱うことができますね。
環境
- LibreOffice 5.2.0.4
方法
LibreOffice Calc には CellRange
というのがあり、 getCellRangeByPosition
を使って取得します。
1 |
getCellRangeByPosition(left, top, right, bottom) |
left, top, right, bottom には、 それぞれ一番左のセルの列、一番上のセルの行、一番右のセルの列、一番下のセルの行を渡します。
ほかに、 getCellRangeByName
という関数もあります。
何が嬉しいのか
getCellRangeByPosition
を知らなくても、 getCellByPosition
さえあればセルの操作はできます。 しかし、 getCellRangeByPosition
を使うと大幅に時間を短縮できることがあります。
たとえば20000行200列の表があると考えてください。 この表の行の背景色を、1行おきに変えることを考えます。
getCellByPosition
を使ってセル毎に処理をすると次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub Main Dim document As Object Dim sheet As Object document = ThisComponent sheet = document.sheets(0) document.LockControllers Dim rowIndex As Integer Dim columnIndex As Integer For rowIndex = 1 To 20000 Step 2 For columnIndex = 0 To 199 sheet.getCellByPosition(columnIndex, rowIndex).CellBackColor = _ RGB(225,225,255) Next columnIndex Next rowIndex document.UnlockControllers End Sub |
しかしこれはものすごく時間がかかります。 セルひとつひとつに対して背景色を変えていますから。
それが CellRange
で1行分のセルを取得して、 1行の背景色を一度に変えると時間が大幅に短縮されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub Main Dim document As Object Dim sheet As Object document = ThisComponent sheet = document.sheets(0) document.LockControllers Dim rowIndex As Integer For rowIndex = 1 To 20000 Step 2 sheet.getCellRangeByPosition(0, rowIndex, 199, rowIndex).CellBackColor = _ RGB(225,225,255) Next rowIndex document.UnlockControllers End Sub |