1

J'utilise des formules de tableur Calc OpenOffice avec des numéros de pseudo-aléatoire pour générer des tableaux de problèmes arithmétiques que je peux facilement mettre à jour à la création de nouvelles feuilles de travail (je suis un enseignant)Comment remplir automatiquement l'éditeur de formules OpenOffice Math dans OOo Calc?

Les problèmes sont émis comme formule des marges dans la chaîne forme. Les formules OOo Math utilisent ces commandes de chaînes typées dans l'éditeur pour afficher des expressions mathématiques bien formatées.

je peux faire cette prochaine étape manuellement:

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 

Résultat: une belle expression mathématique du problème d'arithmétique donné.

Je dois pouvoir faire cela pour des colonnes entières de cellules sources sur différentes feuilles. ... encore mieux, pour ensuite ajouter un écouteur à mettre à jour dynamiquement lorsque les sources sont mises à jour.

J'ai trouvé le code ici: Cell content inside formula qui réalise cela pour une paire fixe de cellules, mais malgré tous mes efforts, j'ai dû admettre la défaite - généraliser ce code est tout simplement hors de mon expertise! L'idéal absolu serait une fonction macro que je pourrais appeler comme une fonction de feuille de calcul; avec des arguments d'entrée (sourceCell, targetCell, listenerON/OFF) qui pourraient exécuter l'algorithme ci-dessus et mettre à jour dynamiquement si nécessaire.

Quelqu'un peut-il m'aider? Une solution comme celle-ci, ou n'importe quelle solution de contournement serait extrêmement utile.


MISE À JOUR 2016/10/27

Merci Jim K, qui a fait le travail, mais l'utilisation du dispacher est livré avec toute une série de difficultés que je n'avais pas prévu. Je viens de trouver Charlie Young's post dans le forum OpenOffice qui utilise l'API. J'ai inclus mon adaptation de son code ci-dessous.

Quelqu'un peut-il m'aider à l'intégrer dans une fonction de la même manière que je l'ai décrit? Je ne sais pas comment résoudre le placement de l'objet Math dans la cellule cible.

Le code de l'API est génial car il créera un nouvel objet Math chaque fois que le code est mis à jour. Ceux qui existent déjà ont besoin d'être supprimés.

Je pense que la limitation de ne pas pouvoir supprimer des objets existants dans une fonction va persister. Serait-ce le cas même s'il est fait par un sous-programme appelé par la fonction?

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 

PROCHAINE MISE A JOUR

J'ai été la gestion de résoudre assez rapidement maintenant mes propres problèmes ...

J'ai décidé d'aller avec un sous, pas une fonction, donc je peux accéder à la feuille pour supprimer des objets existants. Le code est attaché - Les cellules sources sont dans la colonne C et les cellules cibles dans les rangées correspondantes de la colonne A. Jusqu'à présent, je ne peux envoyer des objets qu'à $ A $ 1.

Comment ancrer chaque nouvel objet à une cellule spécifique?

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 
+1

S'il vous plaît supprimer 'Solved' de votre titre, et poster la solution que vous avez trouvé une bonne réponse. – usr2564301

Répondre

0

A partir de l'exemple de Mifeet, ajoutez ceci à My Macros:

rem ---------------------------------------------------------------------- 
rem Creates a math formula from text 
Function InsertFormulaFromCell(paramCellFrom, paramCellTo) 
    dim document as object 
    dim dispatcher as object 
    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 = paramCellFrom 
    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 = paramCellTo 
    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, toCellArgs()) 

    rem open Star.Math 
    oDesk = createUnoService ("com.sun.star.frame.Desktop") 
    dispatcher.executeDispatch(document, ".uno:InsertObjectStarMath", "", 0, Array()) 
    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()) 
    InsertFormulaFromCell = "Math Formula updated " & Now() 
End Function 

Pour l'exécuter, mettre cette formule dans la cellule C5:

=INSERTFORMULAFROMCELL("$C$3","$C$20") 

Maintenant, lorsque les valeurs sont mises à jour, il crée une autre formule.

Remarque: Je n'ai pas réussi à faire fonctionner la section .uno:Delete du code de Mifeet, peut-être parce que les fonctions ne sont pas censées accéder à d'autres cellules. Cela peut nécessiter de supprimer manuellement les formules avant d'en créer de nouvelles.

+0

Merci Jim K! Cela fonctionne effectivement, mais de nombreux problèmes semblent avoir été introduits en utilisant le disperseur de cette manière. Je suis tombé juste [ce] (https://forum.openoffice.org/en/forum/viewtopic.php?t=45282) après: https://forum.openoffice.org/en/forum /viewtopic.php?t=45282 Une solution beaucoup plus élégante apparemment. Essayer d'obtenir la même fonctionnalité. Pourtant, être en mesure de placer la formule dans la cellule cible. – rsmooo

0

(solution publiée au nom de l'OP).

Ceci est maintenant résolu. Après beaucoup de recherches, j'ai trouvé ce dont j'avais besoin! Simple vraiment. Les améliorations futures pourraient être de redimensionner les cellules de manière appropriée. Heureux pour le moment. Merci à Jim K et au reste de la communauté Stack Overflow!

macro complète ci-dessous:

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