LibreOffice: pára o loop da macro no final do arquivo

0

Eu tenho uma macro do LibreOffice Writer que encontra o próximo parágrafo Heading e converte-o para o caso Title. Atualmente tenho que invocá-lo repetidamente até que o final do arquivo seja atingido. Estou tentando configurar um loop que fará tudo, mas pare no EOF. Mas o loop não está funcionando.

Qualquer ajuda seria apreciada. Aqui está o que eu tenho.

sub Convert_Headings_to_Title_Case

rem define variables
    dim document   as Object
    dim dispatcher as Object
    Dim Proceed As boolean

rem get access to the document
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem loop not working
Do 
' Call other macro to find next Heading:
    Heading_findNext

    dispatcher.executeDispatch(document, ".uno:EndOfLineSel", "", 0, Array())

    dispatcher.executeDispatch(document, ".uno:ChangeCaseToTitleCase", "", 0, Array())

Loop While Proceed

end sub

A macro que está sendo chamada para encontrar os títulos é:

sub Heading_findNext
'moves text cursor, but not view cursor, to heading
Dim oStyle, oCurs, oDoc, oVC, Proceed
oDoc = ThisComponent.Text
oVC = ThisComponent.CurrentController.getViewCursor
oCurs = ThisComponent.Text.createTextCursorByRange(oVC)

Do
    Proceed = oCurs.gotoNextParagraph(false)
    oStyle = Mid(oCurs.ParaStyleName, 1, 2)
    Select Case oStyle
        Case "_H", "He"
        oVC = ThisComponent.CurrentController.getviewcursor()
        oVC.gotoRange(oCurs, False)
        Exit Do
    End Select
Loop While Proceed <> false
end sub
    
por Paul B. 22.01.2018 / 03:15

1 resposta

0

Um problema talvez seja que Proceed do loop em Convert_Headings_to_Title_Case nunca seja alterado. Talvez você pretendesse escrever Heading_findNext como uma Função em vez de um Sub e retornar um valor booleano como Proceed = Heading_findNext() .

Além disso, certifique-se de iniciar o cursor de visualização no início do documento.

Aqui está o código de trabalho correto.

Sub Convert_Headings_to_Title_Case
    Dim oDoc, oFrame, dispatcher As Object
    Dim oVC, oCurs As Object
    Dim sStyleNamePart As String
    oDoc = ThisComponent
    oFrame = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
    oVC = oDoc.CurrentController.getViewCursor()
    oVC.gotoStart(False)
    oCurs = oVC.getText().createTextCursorByRange(oVC)
    While oCurs.gotoNextParagraph(False)
        sStyleNamePart = Mid(oCurs.ParaStyleName, 1, 2)
        If sStyleNamePart = "_H" Or sStyleNamePart = "He" Then
            oVC.gotoRange(oCurs, False)
            dispatcher.executeDispatch(oFrame, ".uno:EndOfLineSel", "", 0, Array())
            dispatcher.executeDispatch(_
                oFrame, ".uno:ChangeCaseToTitleCase", "", 0, Array())
        End If
    Wend
End Sub
    
por 22.01.2018 / 15:13