有人可以指出这个宏有什么问题吗?我正在尝试搜索带有标记“vv”的段落,然后将其段落样式更改为“_Verse”。如果我在其中放置一个断点并一次手动转到一个段落,该宏就会起作用。但是当它单独放置时,它会最大化 CPU 核心,我必须强制 LO 关闭。
问题似乎是该行在
Loop While oEnum.hasMoreElements()
到达文件末尾时没有恢复。
谢谢。
sub findvv
rem define variables
dim document as object
dim dispatcher as object
oEnum = ThisComponent.Text.createEnumeration()
rem
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem
dim args1(21) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 1
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 65536
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = "^vv"
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = ""
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 1073743104
args1(18).Name = "SearchItem.Command"
args1(18).Value = 0
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 2
args1(21).Name = "Quiet"
args1(21).Value = true
Do
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
applyverse
Loop While oEnum.hasMoreElements()
end sub
sub applyverse
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Template"
args1(0).Value = "_Verse"
args1(1).Name = "Family"
args1(1).Value = 2
dispatcher.executeDispatch(document, ".uno:StyleApply", "", 0, args1())
end sub
在我看来,您没有必要在一个代码中混合两种方法。要解决所描述的问题,其中之一就足够了。如果您拥有通过 获取的所有文本段落
.Text.createEnumeration()
,则只需使用 获取下一段oEnum.nextElement()
,使用 读取其文本值.getString()
并检查左侧两个字符是否与vv模式匹配如果要使用内置的正则表达式搜索,则创建一个搜索描述符,在其中指示搜索模式以及是否需要使用正则表达式进行搜索。使用一个命令
.FindAll()
,找到与模板相对应的所有段落,并为每个段落指定所需的段落样式。两个代码都执行相同的工作,并且两个代码都比宏记录器为您生成的代码要短一些(而且我认为它更容易阅读,不是吗?)