【问题标题】:Cell content inside formula公式内的单元格内容
【发布时间】:2013-02-28 10:35:31
【问题描述】:

是否可以将单元格的内容放在公式中。公式是指数学公式编辑器(插入->对象->公式)。

【问题讨论】:

  • 还没有反应,这将是一个很好的功能!

标签: openoffice-calc


【解决方案1】:

据我所知,无法从公式中引用单元格。数学公式编辑器不了解 OO Calc。但是,您可以在需要时使用宏创建新公式。

按照以下步骤使其工作:

  1. 将要插入的数学公式放入单元格中。例如,将一些数字放入单元格 A1、A2、A3,并将以下内容放入单元格 C3:

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

    这将在 C3 中生成类似于 {1} over {2 `+` 3} `= 的内容

  2. 从下面的代码创建一个宏。在 OO Calc 中,选择

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

    创建一个新宏并粘贴下面的代码。

  3. 现在您可以使用Tools > Macros > Run Macro 运行宏。运行 insertFormula 插入从单元格 C3 生成的数学公式,或者运行 addFormulaListener 它将注册一个侦听器并在 C3 的内容发生变化时为您重新生成公式。

这里是代码。它包含常量formulaCellFromformulaCellTo,它们指定哪个单元格具有数学公式源,以及哪个单元格是生成的公式对象应放置的目标单元格。 注意,生成公式时,目标单元格必须足够大,否则宏在重新生成公式时不会删除单元格的旧内容

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

代码改编自this question。显然,宏必须在My Macros 中创建,并且在嵌入电子表格时不起作用(安全措施?它对我不起作用)。源单元格和目标单元格是硬编码的,但您可以修改宏以满足您的需要。我不熟悉 Visual Basic,但这样的修改应该很容易。

【讨论】:

  • 要执行这些步骤,我需要将formulaCellFrom 更改为“$C$3”。
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多