Автоматизація рутинних задач з обробки та аналізу даних є важливою частиною роботи з електронними таблицями. Однією з таких задач є створення таблиці унікальних значень зі вказівкою кількості їх повторень у вихідних даних. Розв’язання цієї задачі може бути виконане за допомогою макросів у LibreOffice Calc, що значно спрощує та прискорює процес аналізу даних.
Основною проблемою, з якою можуть зіткнутися користувачі при роботі з макросами, є помилки у коді, що ведуть до некоректної роботи макросу або його зовсім зупиняють. Одна з таких помилок – “BASIC runtime error. Property or method not found: setValue”, що вказує на використання неправильного методу або властивості об’єкта. Щоб вирішити цю проблему, необхідно звернути увагу на коректність використання API LibreOffice Calc для роботи з клітинками та діапазонами.
Для створення таблиці унікальних значень з кількістю їх повторень у LibreOffice Calc потрібно виправити помилки в макросі, наведеному вище, та використовувати правильні методи для роботи з даними. Ось оновлений та коректний код макросу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Sub GenerateUniqueValueTableCorrectly() Dim oSheetA As Object Dim oSheetB As Object Dim oCell As Object Dim oCursor As Object Dim DataArray() As New com.sun.star.beans.PropertyValue Dim i As Long Dim sCellContent As String Dim oUniqueValues As Object Dim Key As Variant Dim Value As Variant ' Встановлення джерельного та цільового аркушів oSheetA = ThisComponent.getSheets().getByName("BD-direta") oSheetB = ThisComponent.Sheets.getByName("Estatistica") ' Створення словника для унікальних значень та їх кількостей oUniqueValues = CreateUnoService("com.sun.star.container.HashMap") ' Отримання діапазону даних oCursor = oSheetA.createCursor() oCursor.gotoEndOfUsedArea(False) oCursor.gotoStartOfUsedArea(True) ' Заповнення словника даними For Each oCell In oCursor sCellContent = oCell.String If oUniqueValues.containsKey(sCellContent) Then oUniqueValues.put(sCellContent, oUniqueValues.get(sCellContent) + 1) Else oUniqueValues.put(sCellContent, 1) End If Next ' Запис унікальних значень та їх кількостей у цільовий аркуш i = 0 For Each Key In oUniqueValues.keySet() Value = oUniqueValues.get(Key) oSheetB.getCellByPosition(0, i + 64).setString(Key) ' Унікальне значення oSheetB.getCellByPosition(1, i + 64).setValue(Value) ' Кількість i = i + 1 Next End Sub |
У цьому макросі використовується об’єкт HashMap
для зберігання пар унікальне значення – кількість його повторень. Це дозволяє ефективно обробляти великі обсяги даних без необхідності вручну перевіряти кожне значення на унікальність. Макрос автоматично проходить по всім клітинкам вказаного діапазону, визначає унікальні значення та рахує кількість їх повторень, а потім виводить результат у вказаному місці на іншому аркуші.
Для застосування цього макросу в LibreOffice Calc: