Використання діалога для заповнення таблиці Calc

В цьому прикладі спробуємо створити невелике вікно діалогу з макросом, за допомогою якого будемо вводити дані у комірки робочого листа ЕТ Calc. Практична цінність такого інструменту невелика, але в якості вправи для вивчення програмування макросів, його використано у переважній більшості підручників з VBA. Щоб не заплутати початківця зайвим різноманіттям елементів керування, зведемо завдання до вводу даних лише у два стовпці таблиці: текстові дані з прізвищами учасників якого-небудь тестування і число — результат тестування у балах, а додатково “навчимо” макрос автоматично нумерувати записи в таблиці.

Створюємо діалог наступного вигляду

Лічильник для числового поля слід увімкнути у вікні властивостей.

Для його запуску, традиційно, використовуємо такий код (див. тут):

Dim MyDlg As Object
Sub RunDialog
MyDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
MyDlg.execute()
End Sub

  • Діалог і модуль з макросами в нашому проикладі розміщені в окремій робочій книзі, тому звертання до комірок її першого робочого листа здійснюємо з префіксом ThisComponent.Sheets(0) (деталі).
  • Макрос, що читатиме дані з полів діалога повинен визначити черговий рядок таблиці для запису даних. Для цього в циклі перевіряємо вміст комірок стовпця “A”, підраховуючи кількість зайнятих комірок за допомогою властивості EMPTY інтерфейсу com.sun.star.table.CellContentType.
  • Дані з числового поля зчитуємо за допомогою його властивості Value, з текстового — за допомогою властивості Text.

Код макроса, що читає дані з діалога і записує їх в таблицю може бути таким:

Sub InsertData
n = 1
UCell = ThisComponent.Sheets(0). _
getCellRangeByName(“A” & CStr(n))
While Not(UCell.getType() = _
com.sun.star.table.CellContentType.EMPTY)
n = n + 1
UCell = ThisComponent.Sheets(0). _
getCellRangeByName(“A” & CStr(n))
Wend
ThisComponent.Sheets(0).getCellRangeByName(“A” & CStr(n)). _
Value = n1
ThisComponent.Sheets(0).getCellRangeByName(“B” & CStr(n)). _
String = MyDlg.GetControl(“TextField1”).Text
ThisComponent.Sheets(0).getCellRangeByName(“C” & CStr(n)). _
Value = CSng(MyDlg.GetControl(“NumericField1”).Value)
End Sub

Його виконання слід призначити на подію “Виконати дію” (Execute action) кнопки “Записати“ на діалозі.

Використовуючи інші елементи керування, можна вдосконалити створений діалог і отримати форму для вводу даних на робочий лист для таблиць будь-якої структури.

Залишити відповідь