LibreOffice: остановить цикл макроса в конце файла
У меня есть макрос 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
1 ответ
Одна проблема, возможно, заключается в том, что Proceed
из цикла в Convert_Headings_to_Title_Case
никогда не меняется Возможно, вы намеревались написать Heading_findNext
как функция, а не как Sub, и возвращают логическое значение, такое как 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