Поиск цели в пользовательской функции для Libre Office Basic

Я пытаюсь использовать Libre Office Basic для написания определяемой пользователем функции для Libre Office Calc, которая запускает Goal Seek как функцию вместо того, чтобы я переходил в меню и щелкал.

Что я хочу сделать, так это передать ячейку в качестве первого аргумента формулы, вторым аргументом должно быть значение, которое я хочу установить для формулы, а третьим аргументом будет ячейка, содержащая переменную, которой нужно управлять. .

Так, например, я хочу ввести ячейку A3 в calc =GSeek2(A1,5,A2), где A1 содержит =A2 + 1, а A2 начинается с 0, а A3 равно 4.

Я думаю, что формулу и ячейку, которыми нужно манипулировать, нужно передать через функцию Goal Seek как адрес, но я не уверен. Я пробовал следующий код, но все время получаю «BASIC syntax error. Unnexpected symbol: Goal». Кто-нибудь знает, где я ошибаюсь?

Function GSeek2(Form As Range, Target as Double, Var as Range)

    Form = Form.Address
    Var = Var.Address

    With Worksheets("Sheet1")
        GSeek2 = .Range(Form).GoalSeek _
        Goal:=.Value(Target).Value, _
       ChangingCell:=.Range(Var)
    End With

End Function

person Brian Albert Monroe    schedule 04.11.2014    source источник
comment
Не пользователь LO, но в таблицах Excel нет свойства Value   -  person Tim Williams    schedule 04.11.2014
comment
Даже удалив весь .Value бит и заменив его на Goal:=5, я все равно получаю ту же ошибку: синтаксическая ошибка BASIC. Неожиданный символ: цель.   -  person Brian Albert Monroe    schedule 04.11.2014


Ответы (1)


Макросы Openoffice или libreoffice нельзя писать на VBA, как в Excel. Таким образом, ваш код VBA не будет работать. Вы должны работать со специальным диалектом BASIC и специальным API openoffice или libreoffice. Хорошей отправной точкой для этого является https://wiki.openoffice.org/wiki/Documentation/BASIC_Guide

К сожалению, вы не можете передавать объекты в качестве аргументов в пользовательские функции в openoffice или libreoffice. Таким образом, вы можете передавать только отдельные части адреса ячейки (лист, столбец, строка) в качестве аргументов.

Пример:

Function GSeek2(lSheetF as long, lColF as long, lRowF as long, lSheetV as long, lColV as long, lRwoV as long, dTarget as double) as double

 Dim oCellAddressFormula as new com.sun.star.table.CellAddress
 oCellAddressFormula.Sheet = lSheetF-1
 oCellAddressFormula.Column = lColF-1
 oCellAddressFormula.Row = lRowF-1

 Dim oCellAddressVaiable as new com.sun.star.table.CellAddress
 oCellAddressVaiable.Sheet = lSheetV-1
 oCellAddressVaiable.Column = lColV-1
 oCellAddressVaiable.Row = lRowV1-1

 oGoalResult = ThisComponent.seekGoal(oCellAddressFormula, oCellAddressVaiable, dTarget)
 GSeek2 = oGoalResult.Result

End Function

Использование в ячейке как

=GSEEK2(SHEET(A1),COLUMN(A1),ROW(A1), SHEET(A2),COLUMN(A2),ROW(A2), 5)
person Axel Richter    schedule 05.11.2014
comment
Привет, спасибо за ваш ответ, я боялся, что это было что-то особенное для LO, однако, если я введу ваш код как есть, я получу следующую ошибку, и строка 3 вашего кода будет выделена: BASIC runtime error. Argument is not optional. Есть мысли? - person Brian Albert Monroe; 05.11.2014
comment
Как вы пытаетесь запустить код? Вы не можете запустить функцию, у которой есть аргументы, без передачи аргументов. Вставьте функцию в модуль стандартной библиотеки документа. Сохраните и закройте BASIC IDE. Вызов пользовательской функции с формулой =GSEEK2(SHEET(A1),COLUMN(A1),ROW(A1), SHEET(A2),COLUMN(A2),ROW(A2), 5) в ячейку. - person Axel Richter; 06.11.2014