LibreScript: dừng vòng lặp macro ở cuối tệp


0

Tôi đã có một macro LibreOffice Writer tìm đoạn Tiêu đề tiếp theo và chuyển đổi nó thành trường hợp Tiêu đề. Hiện tại tôi phải gọi nó nhiều lần cho đến khi kết thúc tập tin. Tôi đang cố gắng thiết lập một vòng lặp sẽ làm mọi thứ, nhưng dừng lại ở EOF. Nhưng vòng lặp không hoạt động.

Bất kỳ trợ giúp sẽ được đánh giá cao. Đây là những gì tôi có.

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

Macro được gọi để tìm các tiêu đề là:

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

Câu trả lời:


0

Một vấn đề có lẽ là Proceedtừ vòng lặp trong Convert_Headings_to_Title_Casekhông bao giờ được thay đổi. Có lẽ bạn dự định viết Heading_findNextdưới dạng Hàm chứ không phải là Sub và trả về giá trị boolean như thế nào Proceed = Heading_findNext().

Ngoài ra, hãy chắc chắn để bắt đầu con trỏ xem ở đầu tài liệu.

Đây là mã làm việc chính xác.

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

Ồ Tác phẩm thực sự tốt đẹp, Jim. Hoạt động hoàn hảo. Thật ngạc nhiên khi những điều này ngắn gọn có thể như thế nào khi bạn biết những gì bạn đang làm! Cám ơn rất nhiều. Thật không may, tôi không có đủ điểm để upvote của mình hiển thị, thật không may, nhưng sự giúp đỡ của bạn được đánh giá cao.
Paul B.

@Paul B.: Vui mừng vì nó hữu ích. Hãy chấp nhận câu trả lời .
Jim K

Làm xong. Chỉ cần nhận ra tôi có thể làm điều đó. :)
Paul B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.