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

1つの問題は、おそらくProceedループからConvert_Headings_to_Title_Case変更されないことです。おそらくHeading_findNext、Subではなく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

ワオ。本当に素晴らしい作品です、ジム。完全に動作します。自分が何をしているのかを知っているとき、これらのことがどれほど簡潔になりうるか驚くべきことです!本当にありがとう。残念ながら、賛成票を示すのに十分なポイントがありませんが、あなたの助けは大歓迎です。
ポールB.

@Paul B .:助かりました。答えを受け入れてください。
ジムK

できた 私はそれができることに気づきました。:)
ポールB.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.