LibreOffice : 파일 끝에서 매크로 루프 중지


0

다음 제목 단락을 찾아서 제목 케이스로 변환하는 LibreOffice Writer 매크로가 있습니다. 현재 파일 끝에 도달 할 때까지 반복해서 호출해야합니다. 모든 작업을 수행하지만 EOF에서 멈추는 루프를 설정하려고합니다. 그러나 루프가 작동하지 않습니다.

도움을 주시면 감사하겠습니다. 여기 내가 가진 것입니다.

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

제목을 찾기 위해 호출되는 매크로는 다음과 같습니다.

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

답변:


0

한 가지 문제는 아마도 Proceed루프에서 Convert_Headings_to_Title_Case변경되지 않는다는 것입니다. 아마도 Heading_findNextSub가 아닌 Function 으로 작성 하고 같은 부울 값을 반환하려고했습니다 Proceed = Heading_findNext().

또한 문서 시작 부분에서보기 커서를 시작하십시오.

올바른 작업 코드는 다음과 같습니다.

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. 완벽하게 작동합니다. 당신이하고있는 일을 알 때이 일들이 얼마나 간결한 지 놀랍습니다! 정말 고마워. 유감스럽게도 본인의 투표에 대한 충분한 포인트가 없지만 귀하의 도움에 감사드립니다.
Paul B.

@Paul B .: 기뻤습니다. 제발 대답을 받아 .
Jim K

끝난. 내가 할 수 있다는 것을 깨달았습니다. :)
Paul B.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.