[Решено] Как в LO обрабатывать событие Worksheet_SelectionChange

Автор Sirius34, 7 мая 2024, 12:13

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

Sirius34

Всем доброго времени суток!

Переделываю экселевский файл для работы в LO на линуксе (мороки много, но деваться некуда).
Нарисовалась проблема.
Есть таблица со списком файлов, которые должны открываться по нажатию кнопки.
Текст на кнопке меняется в зависимости от того, какая именно ячейка в списке выбрана.
' vba xlsm
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub   
    MxSpec = ActiveSheet.Range("G1").Value + 1   
    If Target.Row >= 2 And Target.Row <= MxSpec And Target.Column = 2 Then _
        ActiveSheet.DrawingObjects("Кнопка 3").Characters.Text = "Открыть базу данных " & """" & ActiveCell.Value & """"
    On Error GoTo 0
    End Sub
И по нажатию кнопки должен открываться соответствующий файл.
Собственно, файл открывается, хотя пароль и режим открытия не отрабатываются, но с этим я позже буду разбираться.
Как изменить надпись на кнопке - разобрался, хотя почему-то в LO изменился номер кнопки :)
' VBA+StarBasic
Option VBASupport 1
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim oModel As Object
oModel=ThisComponent.DrawPages(0).Forms(0).GetByName("Button 2")
If Target.Count > 1 Then Exit Sub   
MxSpec = ActiveSheet.Range("G1").Value + 1   
If Target.Row >= 2 And Target.Row <= MxSpec And Target.Column = 2 Then _
oModel.Label = "Открыть базу данных " & """" & ActiveCell.Value & """"
On Error GoTo 0   
End Sub
Но всё работает до момента сохранения xlsm-файла в формат ods.
После этого скрипт изменения надписи перестаёт действовать.

Путём долгих мытарств и экспериментов пришёл к выводу, что LO не умеет обрабатывать событие Worksheet_SelectionChange, даже с учётом опции "VBASupport 1".
Аналогичного события в LO я не нашёл. Те, что есть в списке, отрабатываются не так, как это делает Excel.

Что посоветуете?

economist

Цитата: Sirius34 от  7 мая 2024, 12:13Но всё работает до момента сохранения xlsm-файла в формат ods.
После этого скрипт изменения надписи перестаёт действовать.

Alt+F12 - Загрузка... - Свва VBA - все флажки стоят?

Номер и имя кнопки - не одно и то же, разница из-за разной базы отсчета 0/1.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Цитата: Sirius34 от  7 мая 2024, 12:13Что посоветуете?
Посмотрите тему там про события листа и документа
Поддержать наш форум можно здесь

Sirius34

Цитата: economist от  7 мая 2024, 13:00Alt+F12 - Загрузка... - Свва VBA - все флажки стоят?
Да. Всё включено.
Я эти флажки всегда перепроверяю, если что-то не так работает.

Sirius34

Цитата: bigor от  7 мая 2024, 13:07Посмотрите тему там про события листа и документа
Это я уже смотрел. И событие LO "OnSelect" тоже пытался подвязать.

Пробовал такой скрипт, чтобы вообще проверить - как это работает.
Private Sub xlsSelectionChange(oEvent)
    Dim oDoc As Object
    Dim oSheets As Object
    Dim oSht As Object
    Dim namBasLst As String

    oDoc = ThisComponent
    oSheets = oDoc.getSheets()
    namBasLst = "Baseus_list"
    oSht = oSheets.getByName(namBasLst)
    MxSpec = oSht.getCellByPosition(6, 0).Value + 1

    Dim x1, x2, y1, y2 As Integer

    x1 = oEvent.RangeAddress.StartRow
    x2 = oEvent.RangeAddress.EndRow
    y1 = oEvent.RangeAddress.StartColumn
    y2 = oEvent.RangeAddress.EndColumn

    if x1>=2 and x2<=MxSpec and y1=1 and y2=1 then
        Print "Выбор правильный"
    else
        Print "Выбор неправильный"
    Endif
End Sub

По итогу - пришлось завершать Libre через диспетчер задач, т.к. скрипт ушёл в бесконечный цикл.
Если я правильно понимаю, то засада в том, что событие OnSelect в либре кардинально отличается от события Worksheet_SelectionChange: эксель банально фиксирует получение фокуса ячейкой или диапазоном, а либре почему-то фиксирует в дополнение ещё что-то (как собственно и написано в Вашем файле - макрос срабатывает дважды).
Пару раз я успевал словить момент, что после выбора мной одной ячейки и отработки моего скрипта визуально оказывается выделенным синим цветом сразу группа ячеек. И скрипт или просто срабатывает ещё раз, или уже зацикливается на многократную сработку, по количеству выделенных ячеек, которое постоянно увеличивается.
Если очень принципиально, могу попробовать через OBS сделать захват экрана, чтобы визуально показать проблему...

economist

Если деваться некуда - то надо уходить от Excel-форматов на ODS. Добиться работы XLS/VBA на Win/Lin в Excel/Calc вперемешку - невозможно. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Sirius34

Так я и написал, что этим и занимаюсь.
Базовая часть файла (куча вкладок с отчётами, таблицами, кучей формул и др.) уже переконвертирована для использования в LO, сам файл в ods. Полностью файл нет никакого смысла выкладывать.
Сейчас работаю над переделкой исходных скриптов.
Часть пока - франкештейны (VBA + StarBasic), несколько ещё в чистом VBA.
Но и сделано уже тоже много.
А конкретно с этим обработчиком затык вышел, поэтому сюда и обратился.

bigor

Поддержать наш форум можно здесь

Sirius34

Цитата: bigor от  7 мая 2024, 14:58Ну так есть вариант OnFocus.
Это не выход, потому что тогда для изменения надписи на кнопке каждый раз придётся переключаться между вкладками (листами) документа, чтобы отработало событие OnFocus.
Это же получение фокуса листом, а не ячейкой...

rami

Сделайте вывод не в окошко "Print", а в ячейку, например "A1":
Private Sub xlsSelectionChange(oEvent)
    Dim oDoc As Object
    Dim oSheets As Object
    Dim oSht As Object
    Dim namBasLst As String
    Dim MxSpec%

    oDoc = ThisComponent
    oSheets = oDoc.getSheets()
    namBasLst = "Baseus_list"
    oSht = oSheets.getByName(namBasLst)
    MxSpec = oSht.getCellByPosition(6, 0).Value + 1

    Dim x1, x2, y1, y2 As Integer

    x1 = oEvent.RangeAddress.StartRow
    x2 = oEvent.RangeAddress.EndRow
    y1 = oEvent.RangeAddress.StartColumn
    y2 = oEvent.RangeAddress.EndColumn

    if x1>=2 and x2<=MxSpec and y1=1 and y2=1 then
        oSht.getCellRangeByName("A1").String = "Выбор правильный"
    else
        oSht.getCellRangeByName("A1").String = "Выбор неправильный"
    Endif
End Sub

Sirius34

#10
Цитата: rami от  7 мая 2024, 15:41Сделайте вывод не в окошко "Print", а в ячейку, например "A1":
В принципе, вариант... Цикличность направить на запись чего-либо в ячейки.

Поэкспериментировал. Пришёл к такому итогу:
Private Sub xlsSelectionChange(oEvent)

    Dim oDoc As Object
    Dim oSheets As Object
    Dim oSht As Object
    Dim namBasLst As String
    Dim newPromt As String
    Dim MxSpec%

    Dim oModel As Object
    oModel=ThisComponent.DrawPages(0).Forms(0).GetByName("Button 2")

    oDoc = ThisComponent
    oSheets = oDoc.getSheets()
    namBasLst = "Baseus_list"
    oSht = oSheets.getByName(namBasLst)
    MxSpec = oSht.getCellByPosition(6, 0).Value

    Dim x1, x2, y1, y2 As Integer

    x1 = oEvent.RangeAddress.StartColumn
    x2 = oEvent.RangeAddress.EndColumn
    y1 = oEvent.RangeAddress.StartRow
    y2 = oEvent.RangeAddress.EndRow
    newPromt = oSht.getCellByPosition(x1, y1).String

    If x1=x2 and x1=1 and y1>=1 and y2<=MxSpec Then
        oSht.getCellRangeByName("K1").String = ""
oModel.Label = "Открыть базу данных " & """" & newPromt & """"
    Else
        oSht.getCellRangeByName("K1").String = ""
    Endif
End Sub

Вроде работает. Попробую попозже на "живом файле".

Спасибо за помощь!

p.s. Забыл совсем.
Решение вопроса, конечно, теперь есть.
Но двойное срабатывание события OnSelect, хоть и написано в файлике уважаемого sokol92, что так и предусмотрено изначально,
у меня вызывает недоумение (логика от меня просто ускользает).
Ради любопытства в одну из ячеек записал счётчик, который плюсовал каждое срабатывание скрипта.
После этого делал одиночные нажатия на случайные ячейки (счётчик каждый раз прирастал на 2-3 единицы). А когда выбрал диапазон 4х5 примерно, то он сразу прирос почти на 40 единиц.
Чудеса...

bigor

Цитата: Sirius34 от  7 мая 2024, 19:30в файлике уважаемого bigor
уточню, что файлик не мой, а sokol92. Я в программировании не очень.
Поддержать наш форум можно здесь

Sirius34

Цитата: bigor от  7 мая 2024, 20:18уточню, что файлик не мой, а sokol92. Я в программировании не очень.
Прошу прощения, проглядел. Mea culpa...
Сейчас текст поправлю.
В любом случае - файлики пригодятся, так что - спасибо за ссылку.