1

私は疑似乱数を含む 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
4

2 に答える 2

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
于 2016-10-31T19:05:37.003 に答える