Я использую формулы электронных таблиц OpenOffice Calc с псевдослучайными числами для создания массивов арифметических задач, которые я могу легко обновить для создания новых рабочих листов (я учитель)
Проблемы выводятся в виде разметки формул в строковой форме. Формулы OOo Math используют эти строковые команды, введенные в редактор, для отображения хорошо отформатированных математических выражений.
Я могу сделать следующий шаг вручную:
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
Результат: красивое математическое выражение заданной арифметической задачи.
Мне нужно сделать это для целых столбцов исходных ячеек на разных листах. ... даже лучше, чтобы затем добавить слушателя для динамического обновления по мере обновления источников.
Я нашел здесь код: Содержимое ячейки внутри формулы, которое достигает этого для фиксированной пары ячеек, но несмотря на все мои усилия, мне пришлось признать поражение - обобщение этого кода просто вне моей компетенции!
Абсолютным идеалом была бы функция макроса, которую я мог бы вызвать как функцию электронной таблицы; с входными аргументами (sourceCell, targetCell, listenerON / OFF), которые могут запускать вышеуказанный алгоритм и при необходимости динамически обновляться.
Кто-нибудь может мне помочь? Подобное решение или любой другой обходной путь были бы чрезвычайно полезны.
ОБНОВЛЕНИЕ 2016/10/27
Спасибо, Джим К., это сработало, но использование диспетчера сопряжено с целым рядом трудностей, которых я не предвидел. Я только что нашел Чарли Сообщение Янга на форуме OpenOffice, в котором используется API. Я включил свою адаптацию его кода ниже.
Может ли кто-нибудь помочь мне интегрировать его в функцию таким же образом, как я описал? Я не знаю, как решить размещение объекта Math в целевой ячейке.
Код API великолепен, поскольку он будет создавать новый объект Math при каждом обновлении кода. Однако существующие необходимо удалить.
Я думаю, что ограничение, связанное с невозможностью удалить существующие объекты из функции, сохранится. Будет ли это так, даже если это делается подпрограммой, вызываемой функцией?
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
СЛЕДУЮЩЕЕ ОБНОВЛЕНИЕ
Я довольно быстро умудряюсь решать собственные проблемы ...
Я решил использовать подпрограмму, а не функцию, поэтому я могу получить доступ к листу для удаления существующих объектов. Код прилагается - исходные ячейки находятся в столбце C, а целевые ячейки - в совпадающих строках столбца A. Пока я могу отправлять объекты только в $ A $ 1.
Как привязать каждый новый объект к определенной ячейке?
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
Solved
из заголовка и опубликуйте найденное вами решение как правильный ответ. - person Jongware   schedule 29.10.2016