Большой значок Checkbox в LibrieOffice Calc + VBA

Автор DigitaLS, 2 февраля 2023, 11:38

0 Пользователи и 1 гость просматривают эту тему.

DigitaLS

Добрый день Друзья! Прошу помочь с реализацией задачи в LibrieOffice:
Нужно сделать значок Checkbox1 большого (произвольного) размера и зависимый от этого Checkbox1 такой же на другой странице.

Есть две картинки: чистый квадрат и квадрат с галочкой.
Реализовать появление и исчезновение "галочки" в квадрате смог только путём наложения двух кнопок друг на друга.
При нажатии на кнопку "пустой квадрат" кнопка скрывается и появляется кнопка "квадрат с галочкой".
Вот примерный код:
Sub onChk1 'Часть кода для появление кнопки "квадрат с галочкой"
oSheet = ThisComponent.CurrentController.ActiveSheet
oButton = oSheet.DrawPage.Forms.getByIndex(0).getByName("onChk1")
oButton.EnableVision = True 'Появление кнопки с галочкой
oSheet = ThisComponent.CurrentController.ActiveSheet
oButton = oSheet.DrawPage.Forms.getByIndex(0).getByName("offChk1")
oButton.EnableVision = False 'Скрывание кнопки без галочки
End Sub

Sub offChk1 'Часть кода для появление кнопки "пустой квадрат"
oSheet = ThisComponent.CurrentController.ActiveSheet
oButton = oSheet.DrawPage.Forms.getByIndex(0).getByName("offChk1")
oButton.EnableVision = True 'Появление кнопки без галочки
oSheet = ThisComponent.CurrentController.ActiveSheet
oButton = oSheet.DrawPage.Forms.getByIndex(0).getByName("onChk1")
oButton.EnableVision = False 'Скрывание кнопки с галочкой
End Sub

но это как то криво, ещё и почему то работает на одном листе, а на другом нет.
Так же нет реализации Boolean для того, что бы передать значение другому листу

В общем: я не смог найти рабочую реализацию для данной задачи.
Даже не смог найти код при помощи которого можно было бы просто получить значение
стандартного Checkbox (встроенного в компоненты LibrieOffice Calc): типа True или False

Прошу помочь с данной задачей. Возможно есть способы проще и с небольшим кодом
Так, как мне нужно будет сделать такую реализацию на ~30 Checkbox-ов

ps. В качестве материалов был ещё рассмотрен такой способ основанный на Excel, но в LibrieOffice по моему такое реализовать нельзя
из за отсутствия линков копируемых объектов https://www.youtube.com/watch?v=oYGL6teh-zw

sokol92

#1
Цитата: DigitaLS от  2 февраля 2023, 11:38Возможно есть способы проще и с небольшим кодом
В любой ячейке выравниваем значение по центру, размер шрифта 24 (например), и числовой формат:
"🗹";"🗹";"☐"

Значение 0 будет отображаться как пустой квадрат, иные числовые значения как квадрат с галочкой.  :)
Владимир.

DigitaLS

Цитата: sokol92 от  2 февраля 2023, 17:18Значение 0 будет отображаться как пустой квадрат, иные числовые значения как квадрат с галочкой.  :)
Это всё замечательно, но как реализовать это в коде?

sokol92

Выделите один или несколько диапазонов на листе документа Calc и вызовите макрос Test.
Option Explicit
' Форматирует специальным образом выделенные ячейки:
Sub test
  With ThisComponent.CurrentSelection  
    .HoriJustify=com.sun.star.table.CellHoriJustify.CENTER  ' или 2 - по центру
    .VertJustify=com.sun.star.table.CellVertJustify.CENTER  ' или 2 - по центру
    .CharHeight=26                                              ' размер шрифта    
    .NumberFormat=FindCreateNumberFormatStyle("""🗹""; ""🗹"";""☐""")
  End With 
End Sub

Используется функция из знаменитой книги А.Питоньяка (отредактирована):
' Возвращает номер числового формата.
' Первоисточник - книга А.Питоньяка [OOME_4_0.odt](https://www.pitonyak.org/OOME_4_0.odt).
' Параметры:
' sFormat   Формат (строка).
' oDoc      Документ. Если  параметр опущен, то используется текущий документ.
' locale    Локаль. Если параметр опущен, то используется локаль по умолчанию.
Function FindCreateNumberFormatStyle (Byval sFormat As String, Optional Byval oDoc, Optional Byval locale)
  Dim oDocument As Object
  Dim aLocale as new com.sun.star.lang.Locale
  Dim oFormats As Object
  Dim formatNum As Long
  oDocument = IIf(IsMissing(oDoc), ThisComponent, oDoc)
  oFormats = oDocument.getNumberFormats()
  If ( Not IsMissing(locale)) Then aLocale = locale
 
  formatNum = oFormats.queryKey (sFormat, aLocale, TRUE)
  If (formatNum = -1) Then
    formatNum = oFormats.addNew(sFormat, aLocale)
    If (formatNum = -1) Then formatNum = 0
  End If
  FindCreateNumberFormatStyle = formatNum
End Function

Владимир.

DigitaLS

#4
:beer:
Спасибо sokol92 !
Попробовал реализовать на основе предложенного Вами варианта с шрифтом и спецсимволами.
Приладить Ваш код не сумел. Накидал немного по другому:

Sub Checkbox1
Dim oSheet1 as Object 'Назначаем переменные для 1 листа
Dim oCell1 as Object

Dim oSheet2 as Object 'Назначаем переменные для 2 листа
Dim oCell2 as Object

oSheet1 = ThisComponent.CurrentController.getActiveSheet() 'Указываем переменной активный лист
oCell1 = oSheet1.getCellRangeByName("C3") 'Присваиваем другой переменной имя ячейки с галочкой 🗹

oSheet2 = ThisComponent.Sheets.getByName("Лист 2") 'Указываем название второго листа для дублирования
oCell2 = oSheet2.getCallRangeByName("A15") 'Присваиваем переменной куда дублировать галочку 🗹

If oCell1.GetString()=("🗹") Then 'Проверяем на состояние галочки "🗹" (при нажатии на кнопку)
  oCell1.SetString("☐") 'Если стоит галочка "🗹", то меняем на "☐" (пустой квадрат)
  Else
  oCell1.SetString("🗹") 'Если стоит галочка "☐" , то меняем на "🗹" (квадрат с галочкой)
  oCell2.SetString("🗹") 'Дублируем запись в ячейку другого листа символа "🗹" (квадрат с галочкой)
End If
End Sub

Столкнулся с несколькими сложностями:
1 - Сложность: Хотел назначить Макрос на обычную кнопку, но она не может быть подложена под текст (символ).
Вышел из положения так:
- Создал графический элемент белого цвета и присвоил ему макрос кнопки.
- (Нашёл всё таки в меню (Клик правой кнопкой мыши)/Расположение/Позади текста)
- Разместил за символом галочка 🗹

2 - Сложность: разместить символ с левой стороны ячейки, так, что бы символ примыкал к краю ячейки.
Видимо в самом шрифте существует интервал вокруг символа "☐".
Здесь не нашёл решения. Максимум сместить позиционирование влево.