Top > OOobbs > 69

OOobbs/69 Edit

  • サマリ: MathとCalcの連携
  • 環境: Calc
  • 状態: 解決
  • 投稿者: 奈保?
  • 投稿日: 2005-05-27 (金) 02:00:59

質問 Edit

はじめまして

OpenOffice.org触りはじめたばかりで、ほとんどわかっていない初心者です。

Calcのセルに入力してある数式を獲得して、

Mathに渡して、数式のオブジェクトを作り、

任意のCalcのシートに貼付けたいのですが、その方法がわかりません。

というか、上記のようなをすることが可能なのかもわからない初心者ですが、

アドバイスいただけますと幸いです。

回答 Edit

  • OLE オブジェクトを挿入する方法でもできるかもしれませんが,OLE オブジェクトを取り扱ったことがないのでこの方法については私は分かりません。

その代わり他の方法を示します。

Writer で文字を選択状態のときにメニューから挿入 - オブジェクト - 数式を選択すると選択状態の文字列を数式として挿入してくれる機能を使うことにします。この挿入による方法は直接的に Calc から使用することができません。セル内の文字列を選択状態にしておいても数式が挿入されず,数式の入力が促されるだけです。

次のような場合を考えてみました。

  • 現在選択中のセルに文字列として数式が入力されている。文字列がないときには処理を行わない。

上記のときに次の順序に従ってマクロが処理を行います。

  1. セル内の文字列を取得する
  2. Writer ドキュメントをバックグラウンドで作成
  3. バックグラウンドで作成した Writer ドキュメントにセルから取得した文字列を入力
  4. 入力した文字列を選択する
  5. 選択した文字列から数式を作成させる (作成された数式は選択状態になっている)
  6. コピーする
  7. Calc に貼り付ける

後処理としてバックグラウンドで作成した Writer ドキュメントを閉じる。

ファイル: fileinsertformula.sxc

ファイルを開き Sheet1 のセル "C5"(数式の入力されているセル) を選択して,メニューからツール - マクロ - マクロの実行からドキュメントの "Standard" ライブラリの Module1 モジュールにある Main プロシージャを実行してください。

コードは次のとおりになっています。

Sub Main
Dim oDoc As Object, oController As Object, oFrame As Object
Dim oSelectedCell As Object
Dim sFormula As String
Dim oWriter As Object, oWriterFrame As Object, oWriterText As Object
Dim aArgs(0) As New com.sun.star.beans.PropertyValue
Dim aEmptyArg()
Dim oDispatch As Object
  
  oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
  
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oSelectedCell = oController.getSelection()
  sFormula = oSelectedCell.getString()
  If NOT (sFormula = "") Then
    aArgs(0).Name = "Hidden"
    aArgs(0).Value = true
    oWriter = StarDesktop.loadComponentFromUrl("private:factory/swriter","_blank",0,aArgs())
    oWriterFrame = oWriter.getCurrentController().getFrame()
    oWriter.getText().setString(sFormula)
    oDispatch.executeDispatch(oWriterFrame,".uno:SelectAll","",0,aEmptyArg())
    oDispatch.executeDispatch(oWriterFrame,".uno:InsertObjectStarMath","",0,aEmptyArg())
    oDispatch.executeDispatch(oWriterFrame,".uno:Copy","",0,aEmptyArg())
    oWriter.close(true)
    oFrame = oController.getFrame()
    oDispatch.executeDispatch(oFrame,".uno:Paste","",0,aEmptyArg())
  End If
  
End Sub

例えば,セルに文字列として "A = %pi r^{2}" と入力されているときには Math に従って数式が作成されます。

質問で "Calcのセルに入力してある数式を獲得して" とある部分は Calc のシート上で使用される計算式の数式のことを指しているのでしょうか?

質問の内容をもう少し具体的に書いてもらえるともう少しうまく作成できるかもしれません。

とりあえずのところマクロの説明は後で書きます。

ページの編集に関しては 簡単ヘルプ/bbs をみてもらえるとすぐに分かると思います。

  • はにゃ?? 2005-05-28 (土) 02:23:13
  • 返答ありがとうございます。

ご指摘のとおり"Mach" は "Math"の綴り間違いです。もうしわけありませんでした。Mathに修正しました。

"Calcのセルに入力してある数式を獲得して"というのは、 Calc のシート上で使用される計算式の数式ではなく、Mathで使用できる数式…データのつもりでした。

作成していただいたものの解釈で間違いはありません、ありがとうございます。

未熟ものですので、コードを読ませていただいても、理解できておりません。 もうしわけありませんが、マクロの解説もよろしくお願いいたします。

  • 奈保? 2005-05-29 (日) 03:32:33
  • このページに説明が書かれているページへ誘導しながらコードの解説をしていきます。

コードの始めの部分は変数定義部分です。変数の定義に関しては OOo のヘルプに記載があります。

Sub Main
Dim oDoc As Object, oController As Object, oFrame As Object
Dim oSelectedCell As Object
Dim sFormula As String
Dim oWriter As Object, oWriterFrame As Object, oWriterText As Object
Dim aArgs(0) As New com.sun.star.beans.PropertyValue
Dim aEmptyArg()
Dim oDispatch As Object

ここで特に,aArgs() 配列は他の変数の定義方法と違っていますが struct の定義には New キーワードを使用します。

続いて,

  oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")

ですが,この部分についての説明のページを作成したのでそのページを見てください。このオブジェクトが必要なのは "コマンドによる作業" に相当します。OOoBasic/Generic/dispatch

そして次の部分は Math のための数式を書いたドキュメントのために必要な部分です。ドキュメントオブジェクトを取得し,選択状態のセルから,セルに入力されている文字列を取得します。

  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oSelectedCell = oController.getSelection()
  sFormula = oSelectedCell.getString()

OpenOffice.org Basic を始めるにあたって,ドキュメントにアクセスするために非常に重要なのがこの部分の ThisComponent です。これは OOoBasic のランタイム関数なのですが,ドキュメントオブジェクトへのショートカットを提供してくれます。詳しくは OOoBasic/Generic/document のページをみてください。

この部分の 2 行目では,選択セル範囲にアクセスするために現在のコントローラを取得してそこから選択されているオブジェクトを取得します。OOoBasic/Calc/selection

セルから値を取得するためにここでは getString メソッドを使っています。このメソッドはセルに入力されている文字列もしくはセルに表示されている文字列が取得できます。プロパティーで取得するときには String プロパティーを使って次のようにして行います。

  sFormula = oSelectedCell.String

セルに入力されている値の取得に関しては OOoBasic/Calc/contents

 If NOT (sFormula = "") Then

セルから取得した文字列が空の時には処理は行わないように条件分岐させています。() 括弧をつけないとなぜかうまくいきません。

つぎの部分は変数 aArgs(0) の struct に値を入れます。struct はそれ自体がオブジェクトのようにプロパティーを持ちます (メソッドは持っていません)。com.sun.star.beans.PropertyValue はよく使われる struct ですが,Name プロパティーと Value プロパティーを持っています。この Name に値の名前を,Value プロパティーには値を指定します。

ここで Hidden という名前で true の値を与えています。

    aArgs(0).Name = "Hidden"
    aArgs(0).Value = true

つづいて開く Writer ドキュメントのための設定を作成していますが,ここでは新たに作成される Writer ドキュメントがユーザーに非表示の状態で作成されるような設定です。false にするか,指定しなければ普通に表示される状態で Writer ドキュメントが作成されます。

    oWriter = StarDesktop.loadComponentFromUrl("private:factory/swriter","_blank",0,aArgs())

ここは新しく Writer ドキュメントを作成している部分です。この部分の説明も OOoBasic/Generic/document のページに譲ることにします。ドキュメントを読み込む Url アドレスに新規作成の特別な Url を指定し,最後の引数に先ほど作成した aArgs() 変数を指定しています。

StarDesktop の部分は StarDesktop へのショートカットを提供してくれるランタイム関数です。StarDesktop は OOo のタスクへのアクセスやドキュメントの読み込みなどを提供してくれる部分です。ドキュメントを開く際にはこの StarDesktop の loadComponentFromUrl メソッドを使います。このメソッドの引数は,

  1. 開くドキュメントのアドレスを Url 形式で。
  2. ドキュメントを開くフレーム指定
  3. 開くフレームを探すときのフラッグ
  4. 開くときのオプション引数

メソッドの戻り値は開いたドキュメントのドキュメントオブジェクトです。ここでは新規の Writer ドキュメントオブジェクトになります。

新しくドキュメントを開くときには OOoBasic/Generic/document のページの新規ドキュメントの項を見てください。

    oWriterFrame = oWriter.getCurrentController().getFrame()

コマンドを使った作業を行うためにフレームオブジェクトを取得しておきます。

    oWriter.getText().setString(sFormula)

先ほど loadComponentFromUrl メソッドで新たに作成した Writer ドキュメントに Calc のセルから取得した文字列を入力します。

ユーザーに見えないように開いている Writer ドキュメントですが,コマンドによる作業で次のことを行います。

    oDispatch.executeDispatch(oWriterFrame,".uno:SelectAll","",0,aEmptyArg())

入力した文字列をまずは全て選択させます。Writer では文字を選択した状態で数式の挿入をメニューから行うことで数式に変換されて入力されます。

    oDispatch.executeDispatch(oWriterFrame,".uno:InsertObjectStarMath","",0,aEmptyArg())

文字列から作成された数式は直後には選択状態なのでそのままコピーします。

    oDispatch.executeDispatch(oWriterFrame,".uno:Copy","",0,aEmptyArg())

Writer での作業はここまでで,もう Writer ドキュメントは要らないので閉じてやります。

    oWriter.close(true)

ドキュメントを閉じるにはドキュメントオブジェクトの close メソッドに true の引数を指定します。

最後に,Calc の方にコピーした数式を貼り付けます。

    oFrame = oController.getFrame()
    oDispatch.executeDispatch(oFrame,".uno:Paste","",0,aEmptyArg())

Calc でコマンドによる作業を行うためにフレームオブジェクトを取得します。そして貼り付けて終了です。

  • はにゃ?? 2005-05-29 (日) 17:26:41
  • 詳しい解説ありがとうございます。

やっと作りたいのものが形になりそうです。

(数学の教材用にランダムに数式を表示する、問題集のようなものをCalcでつくりたかったのです)

本当に、ありがとうございました。-- 奈保? 2005-05-29 (日) 20:20:05

  • よく分からないところなどがありましたら,質問していただけるとこちらもページの作成に助かります。 -- はにゃ?? 2005-05-29 (日) 21:21:46


Attach file: fileinsertformula.sxc 1191 download [Information]

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