2016-10-26 17 views
1

私はOOo CalcでOpenOffice数式エディタを自動入力する方法は?

問題は、文字列式のマークアップとして出力されます(私は教師です)私は簡単に新しいワークシートを作成し更新することができ算数の問題の配列を生成する疑似乱数とOpenOfficeのCalcのスプレッドシートの数式を使用しています形。 OOo数式は、これらの文字列コマンドをエディタに入力して、きれいにフォーマットされた数式を表示します。

1) go to source cell and copy string mark-up to clipboard 
2) select target cell and clear existing contents and objects 
3) create new Math object anchored to target cell 
4) open Math editor window and paste in mark-up string 
5) exit Math editor window and return cursor to source cell 

結果:与えられた算術問題の素敵な数学表現

は私が手動でこの次のステップを行うことができます。

さまざまなシートのソースセルの列全体でこれを実行できる必要があります。 ...ソースが更新されると、リスナーを追加して動的に更新することもできます。

固定されたペアのセルでこれを達成するコードはCell content inside formulaですが、私の最善の努力にもかかわらず、私は敗北を認めなければなりませんでした - このコードを一般化することは、

絶対的な理想は、スプレッドシート関数のように呼び出すことができるマクロ関数です。上記のアルゴリズムを実行し、必要に応じて動的に更新できる入力引数(sourceCell、targetCell、listenerON/OFF)を使用します。

誰かが私を助けることができますか?このような解決策、またはあらゆる種類の回避策が非常に役立ちます。 UPDATE 2016年10月27日


はあなたに仕事をしたジム・Kを、ありがとうございました、しかしdispacherの使用は、私が予想していなかった困難の全体のホストが付属しています。 OpenOfficeフォーラムでCharlie Young's postが見つかりました。これはAPIを利用しています。私は自分のコードの私の適応を以下に挙げました。

誰も私が説明したのと同様の方法でそれを関数に統合する手助けができますか?ターゲットセルにMathオブジェクトの配置を解決する方法がわかりません。

APIコードは、コードが更新されるたびに新しいMathオブジェクトを作成するため、優れています。既存のものは削除する必要があります。

私は、関数内から既存のオブジェクトを削除できないという限界が残っていると思います。これは関数によって呼び出されたサブルーチンによって実行されたとしても当てはまりますか?

function InsertFormula(paraFromCell, paraToCell) 
    Dim oDoc As Object 
    Dim oSheet As Object 
    Dim oShape As Object 

    oDoc = ThisComponent 
    oSheet = oDoc.Sheets(0) 

    oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape") 
    oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997" 

    oSheet.Drawpage.Add(oShape) 
    oShape.Model.Formula = paraFromCell 

    oShape.setSize(oShape.OriginalSize) 
end function 

次の更新

私はかなり早く、今の私自身の問題を解決するために管理してきた...

私はサブではなく、機能と行くことにしました、私はシートにアクセスして既存のオブジェクトを削除することができます。コードが添付されています - ソースセルは列Cにあり、ターゲットセルは列Aの行に一致しています。これまでは$ A $ 1にオブジェクトを送ることしかできませんでした。

新しいオブジェクトを特定のセルにアンカーするにはどうすればよいですか?

Mifeetの例から始め
REM ***** BASIC ***** 

Sub InsertThisFormula 

    Dim oDoc As Object 
    Dim oSheet As Object 
    Dim oShape As Object 
    Dim sourceCell As Object 
    Dim targetCell As Object 

    oDoc = ThisComponent 
    oSheet = oDoc.Sheets(1) 

    Dim n As Integer 
    n = 1 'number of rows of formulas 

    for i = 0 To n-1 
    rem loop through cells 
    sourceCell = oSheet.getCellByPosition(2, i) 
    targetCell = oSheet.getCellByPosition(0, i) 

    rem clear target cell object/s 
    targetCell.ClearContents(128) 

    oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape") 
    oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997" 

    oSheet.Drawpage.Add(oShape) 
    oShape.Model.Formula = sourceCell.string 

    oShape.setSize(oShape.OriginalSize) 

    Next i 

End Sub 
+1

あなたのタイトルから 'Solved'を削除して、あなたは正しい答えとして見つかったソリューションを投稿してください。 – usr2564301

答えて

0

My Macrosにこれを追加します。

rem ---------------------------------------------------------------------- 
rem Creates a math formula from text 
Function InsertFormulaFromCell(paramCellFrom, paramCellTo) 
    dim document as object 
    dim dispatcher as object 
    document = ThisComponent.CurrentController.Frame 
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 

    rem go to cell containing markup and copy it 
    dim fromCellArgs(0) as new com.sun.star.beans.PropertyValue 
    fromCellArgs(0).Name = "ToPoint" 
    fromCellArgs(0).Value = paramCellFrom 
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, fromCellArgs()) 
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) 

    rem go to cell where I want the formula displayed 
    dim toCellArgs(0) as new com.sun.star.beans.PropertyValue 
    toCellArgs(0).Name = "ToPoint" 
    toCellArgs(0).Value = paramCellTo 
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, toCellArgs()) 

    rem open Star.Math 
    oDesk = createUnoService ("com.sun.star.frame.Desktop") 
    dispatcher.executeDispatch(document, ".uno:InsertObjectStarMath", "", 0, Array()) 
    document = ThisComponent.CurrentController.Frame 
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 

    rem paste clipboard using Array() as place-holder for variable name 
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array()) 

    rem exit Star.Math 
    dispatcher.executeDispatch(_ 
     document, ".uno:TerminateInplaceActivation", "", 0, Array()) 
    InsertFormulaFromCell = "Math Formula updated " & Now() 
End Function 

それを実行するには、セルC5にこの式を置く:

=INSERTFORMULAFROMCELL("$C$3","$C$20") 

を今すぐ値が更新されると、それは別の式を作成します。

注:関数が他のセルにアクセスしないと考えられているため、Mipeetのコードの.uno:Deleteセクションを機能させることができませんでした。これは、手動で新しいものを作成する前に削除する必要があります。

+0

ジムKありがとう!それは実際には機能しますが、ディスパッチャを使ってこのように多くの問題が導入されたようです。 私はちょうど来た [this](https://forum.openoffice.org/en/forum/viewtopic.php?t=45282)投稿: https://forum.openoffice.org/en/forum /viewtopic.php?t=45282 はるかに洗練されたソリューションです。同じ機能をそれから取り出そうとしています。しかし、ターゲットセルに式を置くことができるようにする。 – rsmooo

0

(OPに代わって掲載された解決策)

これで解決しました。たくさんの検索の後、私は必要なものを見つけました!本当にシンプル。今後の改善は、セルを適切にサイズ変更することです。今はハッピー。 Jim Kとその他のStack Overflowコミュニティに感謝します!以下

コンプリートマクロ:

REM ***** BASIC ***** 

    Sub InsertThisFormula 

    Dim oDoc As Object 
    Dim oSheet As Object 
    Dim oShape As Object 
    Dim sourceCell As Object 
    Dim targetCell As Object 

    oDoc = ThisComponent 
    oSheet = oDoc.Sheets(1) 

    Dim n As Integer 
    n = 6 'number of rows of formulas 

    for i = 0 To n-1 
    rem loop through cells 
    sourceCell = oSheet.getCellByPosition(2, i) 
    targetCell = oSheet.getCellByPosition(3, i) 

    rem clear target cell object/s 
    targetCell.ClearContents(128) 

    oShape = oDoc.createInstance("com.sun.star.drawing.OLE2Shape") 
    oShape.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997" 

    oSheet.Drawpage.Add(oShape) 
    oShape.Model.Formula = sourceCell.string 

    oShape.setSize(oShape.OriginalSize) 

    oShape.Anchor = targetCell 
    oShape.MoveProtect = True 

    Next i 

End Sub 
関連する問題