Помогите с кодом basic

Автор Qwe, 23 сентября 2024, 06:01

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

Qwe

у меня есть макрос но его работа она постоянная и когда я выхожу с документа мне выходит ошибка по поводу восстановления документов вот полный текст ошибки: Восстановление документа LibreOffice произошел сбой работы libreoffice в следствии неожиданной ошибки. Все файлы, над которыми Вы работали будут сохранены. Эти файлы будут автоматически восстановлены при следующем запуске LibreOffice Будут восставлены следующие файлы: и список пуст я заметил что если у меня открыт код моего макроса то файл закрывается без проблем и не выдает эту ошибку, я добавил макрос который выключает работу макросов и назначил его на событие документ закрыт и на документ будет закрыт но видя по всему макрос не успевает срабатывать и при закрытии документа мне снова выдает ошибку
Вот мой макрос:
Dim stopListener As Boolean
Dim previousSheet As String
Dim cycleCompleted As Boolean
Sub StartSheetChangeListener()
    stopListener = False
    cycleCompleted = False
    previousSheet = ThisComponent.CurrentController.ActiveSheet.Name
    Do While Not stopListener
        OnTimerEvent
        Wait 100 ' Задержка в 100 миллисекунд
    Loop
    cycleCompleted = True
End Sub

Sub OnDocumentClose()
    On Error Resume Next
    ThisComponent.CurrentController.removeEventListener(oSheetChangeListener) ' oSheetChangeListener - ваш обработчик
    StopAllMacros()
    On Error GoTo 0
    MsgBox "Документ закрывается. Завершаем выполнение макроса."
End Sub

Sub OnTimerEvent()
    Dim oSheet As Object
    On Error Resume Next ' Начинаем игнорировать ошибки
    oSheet = ThisComponent.CurrentController.ActiveSheet
    If Not IsNull(oSheet) Then
        ' Проверяем, изменился ли активный лист
        If oSheet.Name <> previousSheet Then
            previousSheet = oSheet.Name
            OnSheetChanged()
        End If
    End If
    On Error GoTo 0 ' Сброс обработки ошибок
End Sub

Sub OnDocumentOpen()
    previousSheet = ThisComponent.CurrentController.ActiveSheet.Name
    StartSheetChangeListener()
End Sub

Sub CloseToolbars()
    CloseToolbar("private:resource/toolbar/custom_toolbar_9a755dbe")
    CloseToolbar("private:resource/toolbar/custom_toolbar_e03db63b")
    CloseToolbar("private:resource/toolbar/custom_toolbar_4d2db229")
End Sub

Sub OpenToolbar(toolbarName As String)
    Dim oToolbar As Object
    On Error Resume Next ' Игнорируем ошибки, если панель не найдена
    oToolbar = ThisComponent.CurrentController.Frame.LayoutManager.getElement(toolbarName)
    If IsNull(oToolbar) Then
        ThisComponent.CurrentController.Frame.LayoutManager.createElement(toolbarName)
    End If
    ThisComponent.CurrentController.Frame.LayoutManager.showElement(toolbarName)
    On Error GoTo 0 ' Включаем обработку ошибок обратно
End Sub

Sub CloseToolbar(toolbarName As String)
    Dim oToolbar As Object
    On Error Resume Next ' Игнорируем ошибки, если панель не найдена
    oToolbar = ThisComponent.CurrentController.Frame.LayoutManager.getElement(toolbarName)
    If Not IsNull(oToolbar) Then
        ' Проверяем, открыта ли панель перед закрытием
        If oToolbar.isVisible() Then
            ThisComponent.CurrentController.Frame.LayoutManager.hideElement(toolbarName)
        End If
    End If
    On Error GoTo 0 ' Включаем обработку ошибок обратно
End Sub

Sub OnSheetChanged()
    Dim oSheet As Object
    oSheet = ThisComponent.CurrentController.ActiveSheet

    ' Закрываем все панели перед открытием нужной
    CloseToolbars()

    ' Проверяем имя активного листа и открываем соответствующую панель
    Select Case oSheet.Name
        Case "Настроечный лист"
            OpenToolbar("private:resource/toolbar/custom_toolbar_9a755dbe")
        Case "Печатный лист"
            OpenToolbar("private:resource/toolbar/custom_toolbar_e03db63b")
        Case Else
            OpenToolbar("private:resource/toolbar/custom_toolbar_4d2db229")
    End Select
End Sub
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub StopAllMacros()
    stopListener = True
   
    ' Ожидаем завершения цикла с таймаутом
    Dim startTime As Long
    startTime = Now()
    Do While Not cycleCompleted
        DoEvents ' Позволяет обработать другие события
        If DateDiff("s", startTime, Now()) > 5 Then ' Таймаут 5 секунд
            Exit Do
        End If
        Wait 50 ' Небольшая пауза
    Loop
End Sub

Function IsDocumentClosing() As Boolean
    On Error Resume Next
    IsDocumentClosing = ThisComponent.getArgs().hasByName("Close")
    On Error GoTo 0
End Function

Novernor

попробуй создать глобальную булеву переменную, и сделать что бы пока макрос работает она была true, а на выключение макроса сделай условие, что когда макрос завершается переменная становится false и только после этого закрывается документ