OOobbs/47
質問
Calc上のコードから、Writerのテンプレートを開く事はできるのですが、 その中にある、テキスト枠の中に、A1の値を書き込もうと思っても、 どうやってよいものか、見当もつきません。ご指導の程、 よろしくお願いします。 前提とする情報
Calcドキュメント内のマクロから、実行時点でアクティブなシートのA1の内容を取得するには、本サイトのこのあたりにも詳しい説明がありますが、 Sub get_Val Dim my_Val my_Val = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("A1").String End Sub 等とすれば出来ます。 また、Calcドキュメント内のマクロより、C:\test.stwというテンプレートからWriter ドキュメントを新規作成するには、本サイトのこのあたりにも詳しい説明がありますが、 Sub New_from_template Dim mArg() StarDesktop.loadComponentFromURL("file:///C:/test.stw","_blank",0,mArg()) End Sub とすれば出来ます。 回答
テキストフレーム (テキスト枠) は Writer ドキュメントごとに TextFrames プロパティーによって取得できるコンテナにまとめられています。 Sub textframes_1 Dim oDoc As Object Dim oTextFrames As Object oDoc = ThisComponent oTextFrames = oDoc.TextFrames MsgBox oTextFrames.hasElements() MsgBox oTextFrames.getCount() End Sub oDoc をここでは ThisComponent から取得したドキュメントオブジェクトとしています。 テキストフレームコンテナ,ドキュメントに含まれるテキストフレーム全てがまとめられたオブジェクト,はドキュメントオブジェクト oDoc のプロパティー TextFrames によって取得します。 このコンテナでは,個々のテキストフレームは名前とインデックスによって管理されています。使いそうなメソッドは次のものです。
なので,上記の例ではテキストフレームがあるかどうかと,その数を調べています。 次に,テキストフレームオブジェクトについてです。 テキストフレームオブジェクトは,前出のテキストフレームコンテナオブジェクトから取得します。取得したオブジェクトを利用してテキストの挿入や枠の設定などが行えます。 まず,テキストフレームオブジェクトを取得してみます。 Sub textframe_1 Dim oDoc As Object Dim oTextFrames As Object Dim oTextFrame As Object oDoc = ThisComponent oTextFrames = oDoc.TextFrames If oTextFrames.hasElements() Then oTextFrame = oTextFrames.getByIndex(0) MsgBox oTextFrame.Name MsgBox oTextFrame.Width End If End Sub この例では,テキストフレームオブジェクトをインデックスによって取得しています。(名前が分からなかったので) 特定のテキストフレームの名前を調べるには,テキストフレームを選択して,右クリックのコンテキストメニューから「キャプション」を選びます。表示されるダイアログの「名前」に表示されているのがそのテキストフレームの名前です。 例では,テキストフレームを取得して,その名前 Name プロパティーおよびその幅 Width プロパティーを使用しています。 名前を使用してテキストフレームオブジェクトを取得するには,getByName メソッドを getByIndex メソッドの代わりに使用します。 oTextFrame = oTextFrames.getByName("Frame 1") テキストフレームに文字列を挿入するには,String プロパティーを使用するのが最も簡単な方法です。しかし,このプロパティーでは文字のサイズなどを指定することはできません。 Sub textframe_1 Dim oDoc As Object Dim oTextFrames As Object Dim oTextFrame As Object oDoc = ThisComponent oTextFrames = oDoc.TextFrames If oTextFrames.hasElements() Then oTextFrame = oTextFrames.getByName("Frame 1") oTextFrame.String = "文字列" End If End Sub テキストカーソルなどの使用も可能ですので,複雑な書式などにはテキストインターフェースを取得して使用してください。 結論
loadComponentFromURLは、ドキュメントオブジェクトとして使える、XComponentを返すので、それを利用します。 Dim oDoc As Object oDoc = StarDesktop.loadComponentFromURL("file:///C:/test.stw","_blank",0,Arg()) このオブジェクトoDocが、開いた後のドキュメントへのアクセスを可能にします。 『Calcドキュメント内のマクロから、"C:\test.stw"というテンプレートから作成したWriter ドキュメント内の"frame1"という名前のテキスト枠に、実行時点でアクティブだったシートのA1の内容を、書き入れる』コード例を示します。 Sub Sample_47_1 Dim oDoc As Object Dim oTextFrames As Object Dim oTextFrame As Object Dim URL As String Dim frame_Name As String Dim myValue As String Dim mArg() myValue = ThisComponent.CurrentController.ActiveSheet.getCellByPosition(0,0).String URL = "file:///C:/test.stw" frame_Name = "frame1" oDoc = StarDesktop.loadComponentFromURL(URL, "_blank", 0, mArg()) oTextFrames = oDoc.TextFrames If oTextFrames.hasByName(frame_Name) Then oTextFrames.getByName(frame_Name).String = myValue End If End Sub 感想・コメント・メモ
|