LibreOffice: Stoppen Sie die Makroschleife am Ende der Datei

587
Paul B.

Ich habe ein LibreOffice Writer-Makro, das den nächsten Überschrift-Absatz findet und ihn in den Titel-Fall konvertiert. Derzeit muss ich es wiederholt aufrufen, bis das Ende der Datei erreicht ist. Ich versuche, eine Schleife einzurichten, die alles macht, aber beim EOF aufhören. Aber die Schleife funktioniert nicht.

Jede Hilfe wäre dankbar. Hier ist was ich habe.

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 

Das Makro, das zum Auffinden der Überschriften aufgerufen wird, lautet:

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 Antwort auf die Frage

0
Jim K

Ein Problem ist vielleicht, dass Proceedvon der Schleife in Convert_Headings_to_Title_Casenie geändert wird. Vielleicht wollten Sie Heading_findNexteher als Funktion als als Sub schreiben und einen booleschen Wert wie Proceed = Heading_findNext().

Stellen Sie außerdem sicher, dass der Ansichtscursor am Anfang des Dokuments beginnt.

Hier ist korrekter Arbeitscode.

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 
Beeindruckend. Wirklich schöne Arbeit, Jim. Funktioniert perfekt. Erstaunlich, wie prägnant diese Dinge sein können, wenn Sie wissen, was Sie tun! Vielen Dank. Ich habe leider nicht genug Punkte, um meine Meinung zu zeigen, aber Ihre Hilfe wird sehr geschätzt. Paul B. vor 6 Jahren 0
@ Paul B .: Schön, dass es hilfreich war. Bitte [akzeptieren Sie die Antwort] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Jim K vor 6 Jahren 0
Erledigt. Mir wurde gerade klar, dass ich das kann. :) Paul B. vor 6 Jahren 0