Доступ до діапазонів робочих аркушів ЕТ Calc.

Макроси для обробки електронних таблиць, порівняно з обробкою тексту в текстовому документі, виглядають значно простішими і зрозумілішими, що зумавлено самою структурою електронних. Тут доводиться мати справу з сімействами іменованих та проіндексованих об’єктів: робочі аркуші в робочих книгах мають унікальні імена та порядкові номери, комірки на робочому листі визначаються парою номерів чи унікальним іменем, утвореним з імені стовпця та номера рядка і т. д. Для звертання до самої робочої книги будемо використовувати не надто універсальний але найпростіший спосіб — через об’єкт ThisComponent.

Документ ЕТ Calc, тобто робоча книга, створюється на основі сервісу com.sun.star.sheet.SpreadsheetDocument, який має властивість Sheets для доступу до сімейства робочих аркушів. Вибрати конкретний робочий аркуш можна за його номером у переліку, наприклад:
MsgBox ThisComponent.Sheets(0).Name

Нагадаємо, що в OOo Basic індексація елементів масивів та сімейств починається з 0. Інший спосіб — звертання до робочого аркуша за іменем, для цього потрібно застосувати до сімейства Sheets метод getByName з інтерфейсу com.sun.star.container.XNameContainer. Цьому ж інтерфейсу належать методи hasByName, insertByName та removeByName, що дозволяють, відповідно, перевірити існування елемента з заданим іменем, додати елемент із заданим іменем та видалити елемент, вказавши його ім’я.

Комірки в межах робочого аркуша можна визначати за іменем або за індексом. Звертання за іменем здійснюється за допомогою методу getCellRangeByName і повертає об’єкт типу Range (діапазон). Цей метод може звертатися як до окремої комірки так і до прямокутного діапазону заданого іменами комірок, що лежать у протилежних його кутах, розділеними двокрапкою, наприклад
Sub MainRange()
ThisComponent.Sheets(0).getCellRangeByName(“A10:B2″).CellBackColor = 344
ThisComponent.Sheets(0).getCellRangeByName(“A1″). _
setString(“Колір фону 344″)
End Sub

Набір властивостей та методів отриманого таким способом об’єкта буде, очевидно, залежати від того чи складається діапазон з однієї комірки чи з декількох.

Інший спосіб звертання до комірок дає метод getCellByPosition, що підтримує звертання до комірок за індексом, тобто за номерами стовпця та рядка, на перетині яких розташована комірка. Слід звернути увагу, що:

  • номерація рядків і стовпців в OOo Basic починається з 0
  • перший параметр методу є номером стовпця, а другий — номером рядка, навідміну від колекції Cells у VBA.

Так, наприклад, до комірки ”C7” другого робочого аркуша робочої книги з макросом можна звернутися інструкцією
ThisComponent.Sheets(1).getCellRangeByName(“C7″)
так само як і інструкцією
ThisComponent.Sheets(1).getCellByPosition(2, 6)

Найпоширенішим завданням простих макросів, пов’язаним з комірками робочих аркушів ЕТ є, очевидно запис-читання даних та тексту а також формул. Хоча більшість прикладів у літературі довідкових системах пропагують загальноприйняте в ООП звертання до даних об’єкта за допомогою відповідних методів з префіксами get та set, OOo Basic дозволяє пряме звертання до властивостей Value, String та Formula. Нехай змінна-об’єкт MyCell вказує на деяку комірку робочого аркуша, наприклад, після виконання інструкцій
Dim MyCell As Object
MyCell = ThisComponent.Sheets(0).getCellByPosition(3, 4)

  • записати в цю комірку число 7 можна інструкцією
    MyCell.Value = 7
    або з використанням відповідного методу
    MyCell.setValue(7)
  • отримати число з цієї комірки в змінну n можна інструкцією
    n = MyCell.Value
    або з використанням відповідного методу
    n = MyCell.getValue()
  • записати в цю комірку текст “Сума” можна інструкцією
    MyCell.String = “Сума”
    або з використанням відповідного методу
    MyCell.setString(“Сума”)
  • отримати текст з цієї комірки в змінну S можна інструкцією
    S = MyCell.String
    або з використанням відповідного методу
    S = MyCell.getString()

Аналогічним способом можна задати(отримати) в комірці текст формули за допомогою властивості Formula та пари методів setFormula та getFormula.

Що ж до форматування комірок, слід зазначити, що комірки ЕТ Calc підтримують сервіси com.sun.star.style.CharacterProperties і com.sun.star.style.ParagraphProperties, властивості яких відповідають за форматування тексту в комірках. Решта властивостей форматування комірок, не пов’язаних з текстом визначаються сервісом com.sun.star.table.CellProperties.

Ще одна важлива особливість використання макросів в електронних таблицях — можливість використання макросів-функцій в якості функцій робочого аркуша. В Microsof Excel кожна доступна для виконання VBA-функція розпізнається майстром функцій і відображається в категорії “Фунції користувача” (User Defined) і її можна використовувати створення формули в комірці. В OpenOffice.org Calc (LibreOffice Calc) ця можливість трохи не допрацьована, використовувати функції користувача можна, але вони не розпізнаються майстром функцій. Відповідно, для того щоб використати макрос-функцію у формулі, користувач сам повинен знати назву, кількість та тип аргументів цієї функції.