Тема: OOo Basic: работа с диапазонами ячеек Calc
Пример демонстрирует простейшие приёмы работы с диапазонами ячеек Calc: получение текущего выделения, разбор ячеек в нём, доступ к данным ячеек, установка данных ячеек.
Макрос обрабатывает текущую ячейку, выделенный диапазон или группу диапазонов (все диапазоны должны состоять из одной колонки). Макрос удаляет из текста ячеек запятые, а затем разбивает текст каждой ячейки, ориентируясь по пробелам, и размещает разбитый текст по соседним ячейкам справа от обрабатываемой ячейки. Макрос предназначен для облегчения копи-пастинга табличных данных из документов PDF в Calc (по умолчанию такие данные вставляются в Calc в одну колонку, и таблица "сминается"). После такой вставки можно выделить вставленные данные и запустить этот макрос, который "поправит" эти данные.
' Макрос "Таблица из PDF"
Sub PasteTableFromPDF()
sel = ThisComponent.CurrentController.getSelection()
' sel - это объект ScCellObj, ScCellRangeObj или ScCellRangesObj
If sel.getImplementationName() = "ScCellObj" Then ' одна ячейка
CellProcessing sel
ElseIf sel.getImplementationName() = "ScCellRangeObj" Then ' диапазон
RangeProcessing sel
ElseIf sel.getImplementationName() = "ScCellRangesObj" Then ' группа диапазонов
For i = 0 To sel.getCount() - 1
RangeProcessing sel.getByIndex(i)
Next
End If
End Sub
'==================================================================================================
' Обработка одной ячейки (конечная процедура)
Sub CellProcessing(oCell)
' адрес ячейки:
col = oCell.getRangeAddress().StartColumn
row = oCell.getRangeAddress().StartRow
txt = oCell.getFormula()
txt = Replace(txt, ",", "") ' убрать запятые
'txt = Replace(txt, ".", ",") ' заменить точки на запятые
' разнос текста ячейки вправо, с заменой значений соседних ячеек:
arr = Split(txt)
ActiveSheet = ThisComponent.CurrentController.ActiveSheet
For i = 0 To UBound(arr)
cell = ActiveSheet.getCellByPosition(col + i, row)
cell.setFormula(arr(i))
Next
End Sub
'==================================================================================================
' Обработка диапазона ячеек
Sub RangeProcessing(oRange)
startCol = oRange.getRangeAddress().StartColumn
endCol = oRange.getRangeAddress().EndColumn
If endCol <> startCol Then
Exit Sub ' диапазон должен состоять из единственного столбца
End If
startRow = oRange.getRangeAddress().StartRow
endRow = oRange.getRangeAddress().EndRow
For i = 0 To endRow - startRow
CellProcessing oRange.getCellByPosition(startCol, i)
Next
End Sub
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.