LibreOffice Calc Basic - アクティブなシートを印刷する方法

◆概要

 現在のドキュメントを印刷するマクロです。
このマクロを利用する前に、印刷したいシートをアクティブにする必要があります。
また、事前に印刷範囲を指定しておくことも必要です。
プロシージャーでPrintPageを呼び出してください。
テストする場合は、印刷したいシートをアクティブにしてからPrintPageにカーソルを置き、F5キーを押してください。

サンプルコード
rem 変数の宣言
public document   as object
public dispatcher as object

sub getDispatcher
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
end sub

sub PrintPage
    dim args1(2) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "Copies"
    args1(0).Value = 1
    args1(1).Name = "RangeText"
    args1(1).Value = "1"
    args1(2).Name = "Collate"
    args1(2).Value = false

    getDispatcher()
    dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
end sub

◆プリンターを指定して印刷する

 プリンターを指定して印刷するには、Nameプロパティにパソコンに接続されているプリンター名を指定します。

REM  *****  BASIC  *****

rem 変数の宣言
public document   as object
public dispatcher as object

sub getDispatcher
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
end sub

sub PrintPage
    dim args1(3) as new com.sun.star.beans.PropertyValue
    args1(0).Name="Name"
    args1(0).Value = "Canon MP500 Series Printer"
    args1(1).Name = "Copies"
    args1(1).Value = 1
    args1(2).Name = "RangeText"
    args1(2).Value = "1"
    args1(3).Name = "Collate"
    args1(3).Value = false

    getDispatcher()
    dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
end sub

注意
Excel VBAでは、別のシートから印刷範囲やシートを指定して印刷できますが、LibreOffice Basicでは必ず印刷するシートをアクティブにする必要があるようです。

また、LibreOffice マクロの場合は「Sheet1を印刷した後、Sheet2に移動する」というステートメントを一つのマクロで実行すると、移動先のシートが印刷されます(Excel VBAではそういうことはありません)。
これを避けるには、印刷するシート以外を非表示にして印刷し、印刷が終わったら非表示にしていたシートを再表示するようにします。
次の例は、Sheet1を印刷した後、Sheet2を選択しています。このマクロではSheet1が印刷されます。

sub PrintSingleSheet_test
    PrintSingleSheet("Sheet1")
    oDoc = ThisComponent 
    oController = oDoc.getCurrentController() 
    oSheets = oDoc.getSheets()
    oController.setActiveSheet(oSheets.getByName("Sheet2"))
End sub

Sub PrintSingleSheet(sSheetName as String)
' このマクロは、その名前に基づいて、単一のシートを印刷します。
' トリックは、すべてのシートを非表示にすることですが、1つは印刷する
' と直後にその状態を復元します。

   Dim oSheets as Object
   Dim bSheetIsVisible(255) as Boolean
   Dim bSheetExists
   Dim i as Long
   Dim oDoc as Object
   Dim args2(2) as New com.sun.star.beans.PropertyValue
   Dim dispatcher as Object  
   
   ' ワークブック内でシートを検索
   ' 見つからない場合は、メッセージを表示
   oSheets = ThisComponent.Sheets
   bSheetExists = FALSE
   For i = 0 to oSheets.getCount() - 1
      If sSheetName = oSheets.getByIndex(i).Name Then
         bSheetExists = TRUE
         Exit For
      End If
   Next i
   
   If Not(bSheetExists) Then
      MsgBox "シート""" & sSheetName & """ はこの文書には存在しません。何も印刷されません。"
      Exit Sub
   End If
   
  ' 印刷する必要があるもの以外のすべてのシートを隠す
   For i = 0 to oSheets.getCount() - 1
      bSheetIsVisible(i) = oSheets.getByIndex(i).IsVisible
      If sSheetName <> oSheets.getByIndex(i).Name Then
         oSheets.getByIndex(i).IsVisible = FALSE
      Else
         oSheets.getByIndex(i).IsVisible = TRUE
      End If
   Next i

   ' ドキュメントを印刷(見えているものだけ)
   oDoc = ThisComponent.CurrentController.Frame
   args2(0).Name = "Copies"
   args2(0).Value = 1
   args2(1).Name = "Selection"
   args2(1).Value = true
   args2(2).Name = "Collate"
   args2(2).Value = false
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   dispatcher.executeDispatch(oDoc, ".uno:Print", "", 0, args2())

   ' すべてのシートの可視性の状態を復元
   For i = 0 to oSheets.getCount() - 1
      oSheets.getByIndex(i).IsVisible =  bSheetIsVisible(i)
   Next i

End Sub
▼ページトップへ