8

セルの内容を数式内に配置することは可能ですか。数式とは、数式エディタ([挿入]->[オブジェクト]->[数式])を意味します。

4

1 に答える 1

3

私の知る限り、数式からセルを参照する方法はありません。数式エディタには、OOCalcに関する知識がありません。ただし、マクロを使用して、必要に応じていつでも新しい数式を作成できます。

これらの手順に従って、機能させます。

  1. 挿入する数式をセルに入力します。たとえば、セルA1、A2、A3にいくつかの数字を入れ、セルC3に次の数字を入れます。

    =CONCATENATE("{";A1;"}";"over {";A2;" `+` ";A3;"}";" `=` ";A4).
    

    {1} over {2 `+` 3} `=これにより、C3のようなものが生成されます

  2. 以下のコードからマクロを作成します。OO Calcで、

    Tools > Macros > Organize Macros > OpenOffice.org Basic > My Macros > Standard
    

    新しいマクロを作成し、以下のコードを貼り付けます。

  3. これで、を使用してマクロを実行できますTools > Macros > Run MacroinsertFormulaセルC3から生成された数式を挿入するかaddFormulaListener、リスナーを登録してC3の内容が変更されるたびに数式を再生成するいずれかを実行します。

これがコードです。これには定数formulaCellFromとが含まれformulaCellTo、どのセルに数式のソースがあり、どのセルが生成された数式オブジェクトが配置されるターゲットセルであるかを指定します。ターゲットセルは、生成された数式に対して十分な大きさである必要があることに注意してください。そうでない場合、数式を再生成するときにマクロはセルの古いコンテンツを削除しません

const formulaCellFrom As String = "$C$1"
const formulaCellTo As String = "$C$10"

rem ----------------------------------------------------------------------
rem Adds listener for changes of the math formula
sub addFormulaListener
dim oSheet as Object
dim oCell as Object
rem go to cell containing markup 
oSheet =  ThisComponent.CurrentController.ActiveSheet
oCell = oSheet.getCellRangeByName(formulaCellFrom)
rem add listener
oListener = CreateUnoListener( "formulaListener_", "com.sun.star.chart.XChartDataChangeEventListener" )
oCell.addChartDataChangeEventListener(oListener)
end sub

rem ----------------------------------------------------------------------
rem Listener for cell changes
sub formulaListener_chartDataChanged
dim oCell as Object

rem remember current cursor position
oCell = ThisComponent.CurrentSelection

rem call insertFormula
call insertFormula

rem restore cursor position
ThisComponent.CurrentController.select(oCell)
end sub 

rem ----------------------------------------------------------------------
rem Creates a math formula from text in cell C1 and inserts it into cell C10
sub insertFormula

dim document as object
dim dispatcher as object
rem get access to the document
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 = formulaCellFrom
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 = formulaCellTo
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, toCellArgs())

rem delete previous content
dim deleteArgs(0) as new com.sun.star.beans.PropertyValue
deleteArgs(0).Name = "Flags"
rem flags: A = All, S = String, V = Value, D = DateTeim, F = Formula, ...
rem ... N = Notes, T = Formats, O = Objects
deleteArgs(0).Value = "AO" 
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, deleteArgs())

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

rem get access to the document
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())
end sub

コードはこの質問から採用されました。どうやら、マクロはで作成する必要がありMy Macros、スプレッドシートに埋め込んだときに機能しません(セキュリティ対策?それは私にとっては機能しませんでした)。ソースセルとターゲットセルはハードコーディングされていますが、必要に応じてマクロを変更できます。私はVisualBasicに精通していませんが、そのような変更は簡単なはずです。

于 2013-05-23T16:50:55.180 に答える