Вставьте ячейку с помощью основного макроса в LibreOffice Calc

Я пытаюсь вставить ячейку, начинающуюся с первой ячейки в диапазоне (через метод .getCellRangeByName() активного листа документа).

Я узнал, как это сделать с помощью диспетчера из библиотеки OpenOffice (.uno:InsertCell), но я бы предпочел использовать что-то, что не требует диспетчера, если это возможно.

Пример кода, который я планирую подключить к кнопке...

Sub AddManualBalance(EntryDate As Date, EntryAmount As Currency)

    Dim Doc As Object
    Dim Sheet As Object
    Doc = ThisComponent
    If Doc Is Nothing Then
        Return
    EndIf
    Sheet = Doc.getCurrentController().getActiveSheet()
    If Sheet Is Nothing Then
        Return
    EndIf

    Dim TargetCells As Object
    TargetCells = Sheet.getCellRangeByName("B9:C9");

    // insert a cell in both the B and C columns at position 9,
    // then move all other cells down

    // add my EntryDate as a value to the new cell in B column
    // add my EntryAmount as a value to the new cell in C column

End Sub

Заранее благодарю за любую помощь!

P.S. Мне действительно не нравится Basic, но кажется, что с электронными таблицами и автоматизацией офисных приложений это предпочтительный язык. Есть ли способ сделать макросы LibreOffice/OpenOffice на более C-подобном языке?


person John Suit    schedule 09.09.2015    source источник


Ответы (2)


Следующий код делает то, что вы хотите:

Dim Doc As Object
Dim Sheet As Object
Dim oDestCell As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress

Doc = ThisComponent
Sheet = Doc.Sheets(0)

CellRangeAddress.Sheet = 0
CellRangeAddress.StartColumn = 1
CellRangeAddress.StartRow = 8
CellRangeAddress.EndColumn = 2
CellRangeAddress.EndRow = 8

Sheet.insertCells(CellRangeAddress, com.sun.star.sheet.CellInsertMode.DOWN)

oDestCell=Sheet.getCellByPosition(1,8)
oDestCell.setValue(EntryDate)

oDestCell=Sheet.getCellByPosition(2,8)
oDestCell.setValue(EntryAmount)

Вы можете прочитать о C++ и LibreOffice на странице api.libreoffice.org.

person Maciej    schedule 10.09.2015
comment
Спасибо! Ваш код помог мне добраться туда, куда я хотел. Я изменил его, чтобы он соответствовал моему коду, и благодаря вашей помощи отвечу на свой вопрос ниже. Однако API на C++ мне особо не помогает, так как я хочу альтернативный макроязык, а не редактировать сам LibreOffice. Я обнаружил, что вы можете добавить javascript в Calc, но не уверен, работает ли это как макрос или нет, и можете ли вы использовать javascript для написания новых функций, используемых в ячейках, как вы можете с Basic (например: функция MYFUNC (parm1 как объект , парм2...)) - person John Suit; 10.09.2015

Благодаря Mac мой код теперь...

Public Doc As Object
Public Sheet As Object

Sub AddManualBalance()

    GetCurrentSheet()

    REM insert two new cells, move cells down
    Dim TargetCells As New com.sun.star.table.CellRangeAddress
    TargetCells.Sheet = 3
    TargetCells.StartColumn = 1
    TargetCells.StartRow = 8
    TargetCells.EndColumn = 2
    TargetCells.EndRow = 8
    Sheet.insertCells(TargetCells, com.sun.star.sheet.CellInsertMode.DOWN)

    REM get date and balance from text boxes, add value to cells
    Dim BalanceDate As Object
    Dim BalanceAmount As Object
    Dim Forms As Object
    Dim MainForm As Object
    Forms = Doc.getCurrentController().getActiveSheet().getDrawPage().getForms()
    MainForm = Forms("MainForm")
    BalanceDate = MainForm.getByName("BalanceDate")
    BalanceAmount = MainForm.getByName("BalanceAmount")
    Sheet.getCellByPosition(1,8).setValue(BalanceDate.CurrentValue)
    Sheet.getCellByPosition(2,8).setValue(BalanceAmount.CurrentValue)

End Sub

Sub GetCurrentSheet()

    REM get references to document and active sheet, test if exist
    If ThisComponent Is Nothing Then
        Return
    End If
    Doc = ThisComponent
    If Doc Is Nothing Then
        Return
    EndIf
    Sheet = Doc.getCurrentController().getActiveSheet()

End Sub
person John Suit    schedule 10.09.2015