Top > OOobbs > 47

OOobbs/47 Edit

  • サマリ: Writerのテンプレートを開き、テキスト枠にA1の値を書き込む。
  • 環境: Calc
  • 状態: 解決
  • 投稿者: ジュビー?
  • 投稿日: 2005-01-07 (金) 11:32:19

質問 Edit

Calc上のコードから、Writerのテンプレートを開く事はできるのですが、 その中にある、テキスト枠の中に、A1の値を書き込もうと思っても、 どうやってよいものか、見当もつきません。ご指導の程、 よろしくお願いします。

前提とする情報 Edit

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

とすれば出来ます。

回答 Edit

  • "A1" の値というのがどこから取得する (現在のシートでいいのでしょうか?) のか分からないので,とりあえず Writer ドキュメントでテキストフレームに文字列などを書き込む方法です。 -- はにゃ?? 2005-01-07 (金) 20:18:46

テキストフレーム (テキスト枠) は 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 によって取得します。

このコンテナでは,個々のテキストフレームは名前とインデックスによって管理されています。使いそうなメソッドは次のものです。

Methods of object "SwXTextFrames"
SbxBOOL hasElements ( void )テキストフレームメンバーがあるかどうか
SbxEMPTY getByName (
SbxSTRING )
テキストフレームオブジェクトを名前指定で取得する
SbxARRAY getElementNames ( void )全てのテキストフレーム名の配列を戻す
SbxBOOL hasByName (
SbxSTRING )
名前のテキストフレームがあるかどうか
SbxLONG getCount ( void )存在するテキストフレーム数
SbxEMPTY getByIndex (
SbxLONG )
テキストフレームオブジェクトをインデックス指定で取得する

なので,上記の例ではテキストフレームがあるかどうかと,その数を調べています。

次に,テキストフレームオブジェクトについてです。

テキストフレームオブジェクトは,前出のテキストフレームコンテナオブジェクトから取得します。取得したオブジェクトを利用してテキストの挿入や枠の設定などが行えます。

まず,テキストフレームオブジェクトを取得してみます。

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

テキストカーソルなどの使用も可能ですので,複雑な書式などにはテキストインターフェースを取得して使用してください。

結論 Edit

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

感想・コメント・メモ Edit

  • Calc の方からセルの値を取得する方はいいでしょうか? -- はにゃ?? 2005-01-07 (金) 21:04:16
    • 大丈夫です。 -- ジュビー? 2005-02-26 (土) 05:45
  • はにゃ?さん。丁寧な御回答を素早く頂いたにもかかわらず、超長期に渡って反応できずにいた事をお詫び致します。
  • おかげさまで、やりたかった事はなんとか達成できました。大変ありがとうございました。 -- ジュビー? 2005-02-26 (土) 05:45
  • 実は、質問をした当初、Writerドキュメントを開いた後は、Writer内のマクロコードに処理を引き継がなければならないものと、思いこんでおり、そのやり方を必死に探しておりました。
  • OpenOfficeは統合されたソフトなので、Writerが起動し、Writer ドキュメントを読込んだ後も、Calc内に記述されたコードが引き続き処理を行うことが出きる。後で考えてみれば当たり前のことですが、新鮮な驚きでした。 -- ジュビー? 2005-02-26 (土) 05:45


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes