Update: Installed and tested in Writer 7.3.6.2 with same result.
Windows 10
I have a lot of documents (chapters of a book) where normal paragraphs are styled with Text Body. I need a macro to change all of them so that the first paragraph after the first heading is set to Text Body First Para, and the same with each paragraph following a section marker (which is 5 asterisks).
The first bit is easy: move to the start of the document, move down one line, set the style.
Then I need a loop:
- Find “*****”
- If the text was found…
2 a) Move down a line
2 b) Change style - Repeat
I recorded a macro to do that once, and then added the repeat loop by hand. I need to determine whether the Find was successful or not. Here is the relevant section of my code:
Dim res As Object
...
dim args4(21) as new com.sun.star.beans.PropertyValue
args4(0).Name = "SearchItem.StyleFamily"
args4(0).Value = 2
args4(1).Name = "SearchItem.CellType"
args4(1).Value = 0
args4(2).Name = "SearchItem.RowDirection"
args4(2).Value = true
args4(3).Name = "SearchItem.AllTables"
args4(3).Value = false
args4(4).Name = "SearchItem.SearchFiltered"
args4(4).Value = false
args4(5).Name = "SearchItem.Backward"
args4(5).Value = false
args4(6).Name = "SearchItem.Pattern"
args4(6).Value = false
args4(7).Name = "SearchItem.Content"
args4(7).Value = false
args4(8).Name = "SearchItem.AsianOptions"
args4(8).Value = false
args4(9).Name = "SearchItem.AlgorithmType"
args4(9).Value = 0
args4(10).Name = "SearchItem.SearchFlags"
args4(10).Value = 0
args4(11).Name = "SearchItem.SearchString"
args4(11).Value = "*****"
args4(12).Name = "SearchItem.ReplaceString"
args4(12).Value = ""
args4(13).Name = "SearchItem.Locale"
args4(13).Value = 255
args4(14).Name = "SearchItem.ChangedChars"
args4(14).Value = 2
args4(15).Name = "SearchItem.DeletedChars"
args4(15).Value = 2
args4(16).Name = "SearchItem.InsertedChars"
args4(16).Value = 2
args4(17).Name = "SearchItem.TransliterateFlags"
args4(17).Value = 256
args4(18).Name = "SearchItem.Command"
args4(18).Value = 0
args4(19).Name = "SearchItem.SearchFormatted"
args4(19).Value = false
args4(20).Name = "SearchItem.AlgorithmType2"
args4(20).Value = 1
args4(21).Name = "Quiet"
args4(21).Value = true
res = dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args4())
While res.Result = true
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:StyleApply", "", 0, args3())
res = dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args4())
Wend
I used res.Result
based on this: LibreOffice: DispatchResultEvent Struct Reference
The problem is that it gets stuck in an infinite loop and I have to Ctrl-Backspace to stop it.
I also tried While dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args4())
(dropping the second call to executeDispatch). Same thing.
Tried using res.State=1
. Seems to return false all the time. Click DispatchResultState in the above link.
I also created a macro in Microsoft Word which worked fine there, but when I opened it in LO it wouldn’t loop even once:
Do While Selection.Find.Execute
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.Style = ActiveDocument.Styles("Text Body First Para")
Loop
It’s pretty irritating that LO doesn’t act like the documentation says it should. Perhaps I should try OO: This forum entry suggests it worked as recently as this March: Apache OpenOffice Community Forum - Searching command in macro need to return success - (View topic)