VBA Word-遍历段落以设置样式

时间:2018-07-21 17:44:49

标签: vba macos ms-word word-vba

我有一个简单的脚本,它会遍历并设置以某个字符开头的所有段落的样式。容易,我想。它将更改所有段落,使其具有与“详细信息”样式相同的属性。但是出于某种原因,只有最后一段以“ Details”作为样式结尾,而所有段落都回到“ Normal”。到目前为止,这是我的代码:

Sub Format_doc()
Dim txt As String

For Each par In ActiveDocument.Paragraphs
    txt = par.Range.Text
    If Left(txt, 1) = "/" Then
        par.Style = "Details"
        par.Range.Text = Right(txt, Len(txt) - 1)
    End If
Next
End Sub

我想使它们与样式保持联系,因为我在另一个宏中切换了“隐藏”字体属性。我需要多次为这些段落切换此隐藏属性,并且分配单个段落样式似乎是一个简单的解决方案。这是其他代码:

Sub Toggle_hidden()
    ActiveDocument.Styles("Details").Font.Hidden = Not ActiveDocument.Styles("Details").Font.Hidden
End Sub

解决方案?我在Mac上工作,但最终它将在Windows上结束。

2 个答案:

答案 0 :(得分:0)

您的代码在这里工作正常。但这可能是由于MacWord的版本...我在Office 2016(Office 365订阅)中进行了测试。

如果它对您不起作用,则可能与您通过基本上替换段落内容来删除/的方式有关。这也会影响段落标记,该段落标记负责段落格式(包括样式)的格式化。请尝试以下操作,该操作将显式删除第一个字符并使其他所有内容保持不变:

Sub Format_doc()
Dim txt As String
Dim par As Word.Paragraph

For Each par In ActiveDocument.Paragraphs
    txt = par.Range.Text
    If Left(txt, 1) = "/" Then
        par.Style = "Details"
        'par.Range.Text = Right(txt, Len(txt) - 1)
        par.Range.Characters(1).Delete
    End If
Next
End Sub

答案 1 :(得分:0)

这是另一种方法,也应该可行-并且速度更快。

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "^p/"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = False
    .Execute
  End With
  Do While .Find.Found
    With .Duplicate
      .Start = .Start + 1
      .End = .Paragraphs(1).Style = "Details"
    End With
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub