LibreOffice: остановить цикл макроса в конце файла

499
Paul B.

У меня есть макрос 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

1 ответ на вопрос

0
Jim K

Возможно, одна проблема заключается в том, 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 
Вот это да. Действительно хорошая работа, Джим. Работает отлично. Удивительно, насколько лаконичны эти вещи, когда вы знаете, что делаете! Спасибо. К сожалению, у меня недостаточно очков, чтобы показать мой голос, но ваша помощь очень ценится. Paul B. 6 лет назад 0
@ Пол Б .: Рад, что это было полезно. Пожалуйста, [примите ответ] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Jim K 6 лет назад 0
Готово. Просто понял, что могу это сделать. :) Paul B. 6 лет назад 0

Похожие вопросы