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では、別のシートが表示されます。
以下のサンプルコードは、あまりに早すぎて実行状況が見えないのでウェイトを入れています。

Excel VBAサンプルコード
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 Sub
LibreOffice サンプルコード
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
▼ページトップへ