Top > OOobbs > 47
  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
  • Go to OOobbs/47.

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

*** 質問 [#oad50274]
Calc上のコードから、Writerのテンプレートを開く事はできるのですが、
その中にある、テキスト枠の中に、A1の値を書き込もうと思っても、
どうやってよいものか、見当もつきません。ご指導の程、
よろしくお願いします。
*** 前提とする情報 [#k08d2343]
Calcドキュメント内のマクロから、実行時点でアクティブなシートのA1の内容を取得するには、本サイトの[[このあたり>OOoBasic/Calc/contents#content_1_3]]にも詳しい説明がありますが、
 Sub get_Val
  Dim my_Val
  my_Val = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("A1").String
 End Sub
等とすれば出来ます。

また、Calcドキュメント内のマクロより、C:\test.stwというテンプレートからWriter ドキュメントを新規作成するには、本サイトの[[このあたり>OOoBasic/Generic/document#content_1_1]]にも詳しい説明がありますが、
 Sub New_from_template
  Dim mArg()
  StarDesktop.loadComponentFromURL("file:///C:/test.stw","_blank",0,mArg())
 End Sub
とすれば出来ます。
*** 回答 [#v856fc92]
-"A1" の値というのがどこから取得する (現在のシートでいいのでしょうか?) のか分からないので,とりあえず Writer ドキュメントでテキストフレームに文字列などを書き込む方法です。 -- [[はにゃ?]] &new{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 ''(&br; SbxSTRING ),テキストフレームオブジェクトを名前指定で取得する
,SbxARRAY ''getElementNames ''( void ),全てのテキストフレーム名の配列を戻す
,SbxBOOL ''hasByName ''(&br; SbxSTRING ),名前のテキストフレームがあるかどうか
,SbxLONG ''getCount ''( void ),存在するテキストフレーム数
,SbxEMPTY ''getByIndex ''(&br; 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

テキストカーソルなどの使用も可能ですので,複雑な書式などにはテキストインターフェースを取得して使用してください。
*** 結論 [#d8b4a813]
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
*** 感想・コメント・メモ [#d2ce6667]
-Calc の方からセルの値を取得する方はいいでしょうか? -- [[はにゃ?]] &new{2005-01-07 (金) 21:04:16};
--大丈夫です。 -- [[ジュビー]]
&new{2005-02-26 (土) 05:45};


-はにゃ?さん。丁寧な御回答を素早く頂いたにもかかわらず、超長期に渡って反応できずにいた事をお詫び致します。
-おかげさまで、やりたかった事はなんとか達成できました。大変ありがとうございました。 -- [[ジュビー]]
&new{2005-02-26 (土) 05:45};

-実は、質問をした当初、Writerドキュメントを開いた後は、Writer内のマクロコードに処理を引き継がなければならないものと、思いこんでおり、そのやり方を必死に探しておりました。
-OpenOfficeは統合されたソフトなので、Writerが起動し、Writer ドキュメントを読込んだ後も、Calc内に記述されたコードが引き続き処理を行うことが出きる。後で考えてみれば当たり前のことですが、新鮮な驚きでした。 -- [[ジュビー]]
&new{2005-02-26 (土) 05:45};

#comment

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