4月のカレンダー
 123456
78910111213
14151617181920
21222324252627
282930    
最近の日記
全体の新着
各月の日記
ユーザーRSS
hanyaさんの公開日記
10月05日
23:57
Ruby-UNO バインでイングにまた手を出していますが、Ruby で書いたスクリプトプロバイダが一つの問題を除けば快調です。Ruby のコードを書いた後では Python でインデントがめんどくさくなったり、Basic で then を書くのをよく忘れます・・・。

今日のマクロなお題
「Writer ドキュメント中のある一つの表の一つ前の段落は取得できるか?」

考えてみてくださいね。


- 答え -
もう答えを書いてみます。ドキュメントは次のようになっていると考えてください。
----
最初の行(段落)
表1 (index 0)
二番目の段落
表2
表3 (index 2)
最後の行
---
コードのインデントは全角スペースです。

まず、最初の表の上の段落を見つけるには次のようにしてみます。
Sub FindParagraph1
 oDoc = ThisComponent
 oText = oDoc.getText()
 oTables = oDoc.getTextTables()
 oTable = oTables.getByIndex(0)

 oTmpPara = Null
 oParaEnum = oText.createEnumeration()
 Do While oParaEnum.hasMoreElements()
  oPara = oParaEnum.nextElement()
  If EqualUnoObjects(oPara, oTable) Then
   Exit Do
  End If
  oTmpPara = oPara
 Loop
 msgbox oTmpPara.getString()
End Sub
テキストオブジェクトのコンテンツの列挙に段落と表が含まれることを利用しています。必要に応じて要素のサービスを調べる必要があります。ここで、表がフレームなどに入っている可能性を考慮するなら、テキストオブジェクトは表オブジェクトから取得してください。
このコードの問題点は、表2と表3の様に連続しているような場合には使えません。まぁ、そもそも表が連続している場合には直前に段落がないわけです。

表の直前にある既存の段落を編集したいのでなければ、挿入してしまいましょう。
oPara = oDoc.createInstance("com.sun.star.text.Paragraph")
oText.insertTextContentBefore(oPara, oTable)

これを利用すればテキストカーソルを表の直前の段落に移動できます。段落オブジェクトを取得できるわけではありません。
Sub FindParagraph4
 oDoc = ThisComponent
 oText = oDoc.getText()
 oTables = oDoc.getTextTables()
 oTable = oTables.getByIndex(2)

 oPara = oDoc.createInstance("com.sun.star.text.Paragraph")
 oText.insertTextContentBefore(oPara, oTable)
 oCursor = oText.createTextCursorByRange(oPara)
 oCursor.gotoPreviousParagraph(False)
 oText.removeTextContent(oPara)
 oCursor.gotoEndOfParagraph(True)
 s = oCursor.getString()
 oCursor.setString("!")
End Sub

Writer で表を挿入してからキャプションを挿入、さらに同じ表にキャプションを挿入する操作をするともう一つ増えます。直前または直後に段落を挿入してフィールドなどを入力しているだけのようです。キャプションがあったりなかったりといったドキュメントの体裁を整えるマクロでは直前や直後の段落を調べる必要が出てくるかもしれません。

答えを書いている間に次のお題が思い浮かびました。
公開日記トップへ
oooug-jp SNS

●サイドメニュー

  • 公開日記
  • >公開日記はログインしなくても読めます

http://www.ospn.jp/

inetd