LibreOffice Calc Basic - 画面の更新を抑止/再開する方法
◆Excelの場合
Microsoft Excelの場合、ApplicationオブジェクトのScreenUpdatingプロパティにFalseを設定すると画面の更新を抑止することができます。画面の更新を抑止してからデータを書き込んだりするマクロを実行すると、マクロが高速に動作します。
ApplicationオブジェクトのScreenUpdatingプロパティにTrueを代入すれば、画面の更新を再開することができます。
次の例では、Sheet1のセルA1に1から順に1000まで数値を代入していますが、Application.ScreenUpdating = Falseステートメントをその前に記述しているので、画面上は1から順に数字が表示されず、いきなり最後の1000が表示されます。
Sub SnputValue() Dim i% Application.ScreenUpdating = False For i = 1 To 1000 Step 1 ThisWorkbook.Sheets(1).Cells(1, 1).Value = i Next i Application.ScreenUpdating = True End Sub
◆LibreOfficeの場合
これをLibreOffice Basicで実現するためには、ThisComponent オブジェクトのLockControllersメソッドを使用します。
画面の更新を再開するには、UnlockControllersメソッドを使用します。
または、addActionLockメソッドとremoveActionLockメソッドでも同じ効果が得られます。
Sub SnputValue Dim i% oDoc = ThisComponent oController = oDoc.getCurrentController() oSheets = oDoc.getSheets() rem 画面の更新抑止 oDoc.LockControllers for i=1 to 1000 step 1 ThisComponent.Sheets(0).getCellByPosition(0,0).Value=i next i rem 画面の更新再開 oDoc.UnlockControllers End Sub
◆ExcelとLibreOfficeの違い
Microsoft Excelでは、シートの選択でこのステートメントを使用すると、別のシートを選択して元のシートに戻っても、別のシートは一切表示されません。しかし、LibreOfficeでは、別のシートが表示されます。
以下のサンプルコードは、あまりに早すぎて実行状況が見えないのでウェイトを入れています。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub SlectSheet() ' 画面の更新抑制 Application.ScreenUpdating = False Worksheets("Sheet2").Activate DoEvents Sleep 400 Worksheets("Sheet3").Activate DoEvents Sleep 400 Worksheets("Sheet1").Activate ' 画面の更新再開 Application.ScreenUpdating = True End SubLibreOffice サンプルコード
Sub SelectSheet oDoc = ThisComponent oController = oDoc.getCurrentController() oSheets = oDoc.getSheets() rem 画面の更新抑止 VBAのApplication.ScreenUpdating = False oDoc.LockControllers oController.setActiveSheet(oSheets.getByName("Sheet2")) wait 400 oController.setActiveSheet(oSheets.getByName("Sheet3")) wait 400 oController.setActiveSheet(oSheets.getByName("Sheet1")) rem 画面の更新再開 VBAのApplication.ScreenUpdating = True oDoc.UnlockControllers End Sub▼ページトップへ