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▼ページトップへ