LibreOffice: zatrzymaj pętlę makr na końcu pliku

0

Mam makro LibreOffice Writer, które znajduje następny akapit nagłówka i konwertuje go na wielkość liter. Obecnie muszę go wywoływać wielokrotnie, aż do osiągnięcia końca pliku. Próbuję skonfigurować pętlę, która zrobi wszystko, ale zatrzymaj się na EOF. Ale pętla nie działa.

Każda pomoc będzie mile widziana. Oto co mam.

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

Wywoływane makro w celu znalezienia nagłówków to:

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
Paul B.
źródło

Odpowiedzi:

0

Być może jednym z problemów jest to, że Proceedz pętli Convert_Headings_to_Title_Casenigdy się nie zmienia. Być może chciałeś napisać Heading_findNextjako funkcję, a nie jako sub, i zwrócić wartość boolowską, taką jak Proceed = Heading_findNext().

Pamiętaj też, aby uruchomić kursor widoku na początku dokumentu.

Oto poprawny działający kod.

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
Jim K.
źródło
Łał. Naprawdę fajna robota, Jim. Działa świetnie. Niesamowite, jak zwięzłe mogą być te rzeczy, gdy wiesz, co robisz! Dzięki wielkie. Niestety nie mam wystarczającej liczby punktów, aby wyrazić opinię, ale twoja pomoc jest bardzo doceniana.
Paul B.
@Paul B .: Cieszę się, że był pomocny. Proszę zaakceptować odpowiedź .
Jim K
Gotowe. Właśnie zdałem sobie sprawę, że mogę to zrobić. :)
Paul B.