1

Тема: 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
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.