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
S'il vous plaît supprimer 'Solved' de votre titre, et poster la solution que vous avez trouvé une bonne réponse. – usr2564301