2013-03-12 13 views
9

È possibile posizionare il contenuto di una cella all'interno di una formula. Per formula intendo l'editor di formule matematiche (inserire-> oggetto-> formula).Contenuto di celle all'interno della formula

+0

Nessuna reazione ancora, e questa sarebbe una caratteristica così bella! –

risposta

4

In base alle mie conoscenze, non esiste un modo per fare riferimento a una cella da una formula. L'editor di formule matematiche non ha alcuna conoscenza di OO Calc. Tuttavia, è possibile creare una nuova formula ogni volta che è necessario utilizzando le macro.

Seguire thesse passaggi per farlo funzionare:

  1. mettere la formula matematica che si desidera inserire in una cella. Per esempio, mettere alcuni numeri a celle A1, A2, A3 e mettere quanto segue per cella C3:

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

    Questo genererà qualcosa come {1} over {2 `+` 3} `= in C3

  2. Creare una macro dal codice qui sotto. In OO Calc, selezionare

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

    Creare una nuova macro e incollare il codice di seguito.

  3. Ora è possibile eseguire macro utilizzando Tools > Macros > Run Macro. Esegui o insertFormula che inserisce la formula matematica generata dalla cella C3 o addFormulaListener che registrerà un listener e rigenererà la formula per te ogni volta che i contenuti di C3 cambiano.

Ecco il codice. Contiene costanti formulaCellFrom e formulaCellTo, che specificano quale cella ha l'origine della formula matematica e quale è la cella di destinazione in cui deve essere posizionato l'oggetto formula generato. Si noti che la cella di destinazione deve essere sufficientemente grande per la formula generata, altrimenti la macro non eliminerà il vecchio contenuto della cella durante la rigenerazione della formula.

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 

Il codice è stato adattato da this question. Apparentemente, la macro deve essere creata in My Macros e non funziona se incorporato nel foglio di calcolo (misura di sicurezza? Semplicemente non ha funzionato per me). Le celle di origine e di destinazione sono hardcoded ma è possibile modificare la macro in base alle proprie esigenze. Non sono esperto in Visual Basic, ma tali modifiche dovrebbero essere semplici.

+0

Per seguire questi passaggi, avevo bisogno di cambiare 'formulaCellFrom' in" $ C $ 3 ". –

Problemi correlati