入力フォームでボタンを押し、データを反映した別シートを印刷

宛名ラベルを印刷するマクロを組んでいます。
発送先入力するシート、宅配便用シート、定形外用シートの3つを用意しており、発送先入力シートで「宅配便」ボタンを押すと宅配便用の、「定形外」ボタンを押すと定形外用のレイアウトで印刷します。
具体的にはボタンを押すと、

①ThisComponent.getCurrentController().setActiveSheet()で当該シートをアクティブにし、
②ThisComponent.print()で印刷

しているだけです。
以前はこれで当該シートが印刷されていたのに、2025年4月にバージョンアップしたら、当該シートではなく発送先入力シートが印刷されるようになってしまいました。
ところが②の行にブレークポイントを設定し、一時停止後にF5で実行再開すると、ちゃんと当該シートが印刷されます。

更には、マクロの最後に「入力データをクリアしますか」というmsgboxを表示していますが、libreofficeをver.25.8.4.2に更新したら、このmsgboxに回答しないとプリンタへデータが送られないようになってしまいました。(以前はmsgboxが表示されたままでも印刷された)

これを解決する方法はないものでしょうか。

ThePhantom様、例えば以下のようなイメージでDispatcher経由で印刷を試みるといかがでしょうか?当方の環境(26.2.2)では期待したイメージで動作しました。

Sub Test
  Dim oDoc As Object
  Dim oController As Object
  Dim oSheet As Object
  
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oSheet = oDoc.Sheets.getByName("Sheet3")
  oController.setActiveSheet(oSheet)
    
  Dim oDispatcher As Object
  oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  oDispatcher.executeDispatch(oController.Frame, ".uno:Print", "", 0, Array())
    
  MsgBox "Hello"    
End Sub

Version: 26.2.2.2 (X86_64)
Build ID: 1f77d10d6938fd34972958f64b2bcfa54f8b1ba5
CPU threads: 4; OS: Windows 11 X86_64 (build 22631); UI render: Skia/Vulkan; VCL: win
Locale: ja-JP (ja_JP); UI: ja-JP
Calc: threaded

2 Likes

私もsu_doさんと同じく期待どおりの動作をしているように思います。
テストファイルask133881.ods (16.8 KB)

Version: 25.8.6.2 (X86_64)
Build ID: b4b39682cd9868fa725bc664aff94278d315bd04
CPU threads: 8; OS: Windows 11 X86_64 (build 26200); UI render: Skia/Vulkan; VCL: win
Locale: ja-JP (ja_JP); UI: ja-JP
Calc: threaded
3 Likes

Dispatcher経由形式にしてみたところ、印刷ダイアログが開くようになりました。
しかしそのプレビュー内容は、発送先入力シートです。
executeDispatchにブレークポイントを設定して一時停止させると、プレビューには当該シートが表示されます。

うーん、環境が特殊だからかな…
(参加したばかりで、小さなテキスト枠を埋め込む方法が分からないので、下にコピペします)

Version: 25.8.4.2 (X86_64) / LibreOffice Community
Build ID: 580(Build:2)
CPU threads: 8; OS: FreeBSD 14.1; UI render: default; VCL: qt6 (cairo+xcb)
Locale: ja-JP (ja_JP.UTF-8); UI: ja-JP
Calc: threaded

ボタンに設定するイベントを「マウスを押した時」にしてみてください。
実行時ではフォーカスがボタンにくるため、カレントのframeがシートでなくなっているのかもしれません。

1 Like

ooBasicを知らないのに余計な口出しかもですが、setActiveSheetという
名前からしてカッコ内にどのシートかの指定が必要そうに見えますけど・・・。

もちろん実際にはThisComponent.getSheets().getbyName(hoge)で取得したオブジェクトを引数にしています。