【LibreOffice/Basic】Calcでアクティブシートにページスタイル(ページ設定)を追加するマクロ

Jacop です。

Calcでアクティブシートにページスタイル(ページ設定)を追加するマクロをBasicで作ってみました。

## はじめに
Office から LibreOffice に乗り換えて、Calc使ってると
　**ページ設定ってシート毎に出来ないの？**
って思ったことってありませんか？、自分はあります。

ということで、まずは、マクロを使わずできる方法を Google先生で調査。

### (1) 一度 Excel形式で保存して、Calcで読み込む

[一瞬でシートごとにスタイルを設定する | OpenOffice.org導入支援](http://www.fujisekkei.sakura.ne.jp/ooo/?p=340)
ここで説明されてる方法が、一番手っ取り早い。

要は、CalcでExcel形式に保存すると Excelに合わせるためにページ設定を追加する動作を利用した方法。

注意点は、副作用(CalcとExcelとの差)が出る可能性がある
例えば、オートシェイプの位置がずれる等々・・・

### (2) 手動で個別に、ページ設定を追加していく

[JA福岡 LibreOffice Writer ＆ Calc よく利用する機能マニュアル](http://www.ja-fukuoka.or.jp/blog/pdf/libreoffice_manual.pdf)
このPDFの6ページ目に載ってる方法が、LibreOffice的には王道。

要は、使う分のページ設定を１つ１つ手動で追加していく方法。
この方法だと、副作用は出ないはず。

注意点は、シートの数が増えて、いろいろなページ設定したい、という場合、かなり面倒くさい。

## もう少し使いやすくするため、マクロ化に踏み切った

で、出来上がったのが以下のマクロ(Basic)。

```vb
'=============================================================================
' 新しいページスタイルを作成してアクティブシートに設定する
'=============================================================================
Sub makeNewPageStyle2ActiveSheet

  Dim oNewStyle      As Object	'新しいページスタイル object
  Dim sNewStyleName  As String	'新しいページスタイル名

  Dim oStyleFamilies As Object	'ドキュメントのスタイルたち object
  Dim oActiveSheet   As Object	'アクティブシート object

  'ページ設定ダイアログ表示用
  Dim oFrame         As Object	'ドキュメントのフレーム object
  Dim oDispatcher    As Object	'com.sun.star.frame.DispatchHelper


  oStyleFamilies = ThisComponent.StyleFamilies
  oActiveSheet   = ThisComponent.CurrentController.getActiveSheet()


  '-- 新しい PageStyle の名前  "PageStyle_アクティブシート名"
  sNewStyleName = "PageStyle_" & oActiveSheet.Name

  '-- 新しい PageStyle object を作成
  oNewStyle = ThisComponent.createInstance("com.sun.star.style.PageStyle")

  '-- 新しい PageStyle を StyleFamilies に追加する
  '   PageStyle を現在のドキュメントのStyleFamiliesに追加しただけ
  oStyleFamilies.getByName("PageStyles").insertByName(sNewStyleName, oNewStyle)

  '-- 新しい PageStyle の設定を変更
  '   試しにA3用紙にしてみる
  '   設定できる内容は以下参照
  '     com.sun.star.style.PageProperties   汎用設定
  '     com.sun.star.sheet.TablePageStyle   Calc固有設定
  '   ※注意 StyleFamiliesに追加してからでないと設定変更効かなかった
  oNewStyle.setPropertyValue("IsLandscape", True)	'横向き
  oNewStyle.setPropertyValue("Width",  42000)		'紙の横の長さ A3
  oNewStyle.setPropertyValue("Height", 29700)		'紙の縦の長さ A3

  '-- アクティブシートの PageStyle を作成した PageStyle に変更
  oActiveSheet.PageStyle = sNewStyleName
'  oActiveSheet.setPropertyValue("PageStyle", sNewStyleName)	'これと同じ

  '-- ページ設定ダイアログ表示
  '   ！！注意！！
  '       Basic IDE で Run するとexecuteDispatchでクラッシュする
  '       必ず、Calcから ツール＞マクロ＞マクロの実行... から実行すること
  oFrame      = ThisComponent.CurrentController.Frame
  oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  oDispatcher.executeDispatch(oFrame, ".uno:PageFormatDialog", "", 0, Array())

End Sub
```

## マクロの説明
ここからはかなり適当に書いてるのでツッコミはなしで。

### まず、LibreOffice(OpenOffice) Calc のスタイルってどうなってるの？
  + セルスタイルとページスタイルの2つがある
  + ドキュメント単位でスタイル管理
  + デフォルトスタイルはアプリケーションレベルで保持
  + 比較的わかりやすく書いてあるのは、ここ  
　[表計算ドキュメントの書式設定 - Apache OpenOffice Wiki](https://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Formatting_Spreadsheet_Documents)
  + 詳しすぎて理解不能になるほど書いてあるのは、  
ここの 8.4 スプレッドシート 全体的なドキュメント特徴  
　[デベロッパーのガイド - OpenOffice](http://openoffice-docj.osdn.jp/tr/translated/DevelopersGuide/DevelopersGuide.htm)  
※ ちなみに、以下から丸ごとダウンロードできるので落としておくと色々捗る。  
　[Developers Guide](http://openoffice-docj.osdn.jp/tr/translated/developerguide.html)

###じゃあ、Excelのページ設定と何が違うの？

+ Excel は、ページ設定をシートが管理。
+ Calc は、ドキュメントが管理してるページ設定をシートにリンクする感じ。

管理してる人が違うらしい。

### ページ設定追加の手順は？

1. PageStyle(ページ設定) を作成
2. StyleFamilies(スタイル管理してる所)のPageStyles(ページスタイルグループ) に作成したPageStyle追加
3. アクティブシートのページスタイル名を作成したものに変更
4. ページ設定ダイアログ表示（設定もついでに）

って流れになる。

## 最後に
細かい説明は、思いっきり端折ってます。
後は、マクロを見てもらってGoogle先生で調べてもらえればと・・・

以下に作成時にいろいろGoogle先生で調べて参考になったページ。

+ Writer でのスタイル追加が参考になりました  
　[LibreOffice - Writerを起動し、2枚目のページスタイルを横にする方法](http://www7b.biglobe.ne.jp/~whitetiger/ex/liboffice010.html)
+ ページ設定内容  
　[LibreOffice: PageProperties Service Reference](https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1PageProperties.html)
+ ここのMacroの杜はサンプル数が豊富でかなりありがたい  
　[OSS( Open Source Software )でいこう!!「　OpenOffice.org / LibreOfficeを使おう編　」](http://openoffice3.web.fc2.com/index.html)

以上、Jacopでした。