私は疑似乱数を含む 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
結果: 与えられた算術問題の素敵な数式。
さまざまなシートのソース セルの列全体に対してこれを実行できる必要があります。...さらに良いことに、リスナーを追加して、ソースが更新されると動的に更新します。
私はここでコードを見つけました:固定されたセルのペアに対してこれを達成する数式内のセルの内容ですが、私の最善の努力にもかかわらず、敗北を認めなければなりませんでした.このコードを一般化することは、私の専門知識を超えています!
絶対的な理想は、スプレッドシート関数のように呼び出すことができるマクロ関数です。上記のアルゴリズムを実行し、必要に応じて動的に更新できる入力引数 (sourceCell、targetCell、listenerON/OFF) を使用します。
誰でも私を助けることができますか?このような解決策、またはあらゆる種類の回避策が非常に役立ちます。
2016/10/27更新
Jim K さん、ありがとうございました。うまくいきましたが、ディスパッチャの使用には、私が予期していなかった多くの問題が伴います。OpenOffice フォーラムで、API を利用しているCharlie Young の投稿を見つけました。私は彼のコードを以下に適応させました。
私が説明したのと同様の方法で関数に統合するのを手伝ってくれる人はいますか? Math オブジェクトのターゲット セルへの配置を解決する方法がわかりません。
コードが更新されるたびに新しい Math オブジェクトが作成されるため、API コードは優れています。ただし、既存のものは削除する必要があります。
関数内から既存のオブジェクトを削除できないという制限は続くと思います。関数によって呼び出されたサブルーチンによって行われた場合でも、これは当てはまりますか?
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 にしか送信できません。
新しい各オブジェクトを特定のセルに固定するにはどうすればよいですか?
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