2015-09-09 3 views
2

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

Я узнал, как это сделать с диспетчером из библиотеки 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-подобном языке?

ответ

1

После кода делает то, что вы хотите:

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

+0

Спасибо! Ваш код помог мне добраться туда, куда я хотел пойти. Я изменил его, чтобы он соответствовал моему коду, и я отвечу на свой вопрос ниже благодаря вашей помощи. Однако API на C++ мне действительно не помогает, так как я хочу альтернативный макроязык, а не самостоятельно редактировать LibreOffice. Я обнаружил, что вы можете добавить javascript в Calc, но не уверены, что это работает как макрос или нет, и если вы можете использовать javascript для записи новых функций, используемых в ячейках, например, с помощью Basic (например: function MYFUNC (parm1 как объект , parm2 ...)) –

1

Благодаря 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