Vba 用于更改标题样式的Microsoft Word宏

Vba 用于更改标题样式的Microsoft Word宏,vba,ms-word,Vba,Ms Word,我试图在Word中创建一个宏,它可以改变一组约150个独特标题的样式。所有样式必须相同。我当前的代码可以正常工作并正确更改格式,但一次只能更改一个标题。 简单地说,这是丑陋的 我正在寻找一些我可以重用的东西,并可能在将来应用到更多的项目中 可能使用循环命令?我不知道,我对使用VBA还是有点陌生 Sub QOS_Headings() Dim objDoc As Document Dim head1 As Style, head2 As Style, head3 As Style, head4 As

我试图在Word中创建一个宏,它可以改变一组约150个独特标题的样式。所有样式必须相同。我当前的代码可以正常工作并正确更改格式,但一次只能更改一个标题。 简单地说,这是丑陋的

我正在寻找一些我可以重用的东西,并可能在将来应用到更多的项目中

可能使用
循环
命令?我不知道,我对使用VBA还是有点陌生

Sub QOS_Headings()
Dim objDoc As Document
Dim head1 As Style, head2 As Style, head3 As Style, head4 As Style
    Set objDoc = ActiveDocument
    Set head1 = ActiveDocument.Styles("Heading 1")
    Set head2 = ActiveDocument.Styles("Heading 2")

With objDoc.Content.Find
    .ClearFormatting
    .Text = "Section A.^p"
    With .Replacement
    .ClearFormatting
    .Style = head1
    End With
    .Execute Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceOne
End With
End With
End Sub

如果你无法自动识别你想要的标题,你可能需要把所有的东西都写一次。为此,创建一个单独的函数。可能是这样的:-

Private Function SearchCriteria() As String()

    Dim Fun(6) As String                 ' Fun = Designated Function return value

    ' The number of elements in the Dim statement must be equal to
    ' the number of elements actually declared:
      ' observe that the actual number of elements is one greater
      ' than the index because the latter starts at 0
    Fun(0) = "Text 1"
    Fun(1) = "Text 2"
    Fun(2) = "Text 3"
    Fun(3) = "Text 4"
    Fun(4) = "Text 5"
    Fun(5) = "Text 6"
    Fun(6) = "Text 7"

    SearchCriteria = Fun
End Function
您可以添加任意数量的元素。理论上,如果它们在文档中是唯一的,就足够了。我将在下面补充一些实际问题。使用以下代码测试上述功能

Private Sub TestSearchCriteria()

    Dim Crits() As String
    Dim i As Long

    Crits = SearchCriteria
    For i = 0 To UBound(Crits)
        ' prints to the Immediate Window:
        ' select from View tab or press Ctl+G
        Debug.Print Crits(i)
    Next i
End Sub
现在,您已经准备好尝试实际处理文档。这是代码。它不会影响任何更改。它只是测试和准备的基础设施

Sub ChangeTextFormat()

    Dim Crits() As String
    Dim Rng As Range
    Dim Fnd As Boolean
    Dim i As Long

    Crits = SearchCriteria
    For i = 0 To UBound(Crits)
        ' find the Text in the document
        Set Rng = ActiveDocument.Content
        With Rng.Find
            .ClearFormatting
            .Execute FindText:=Crits(i), Forward:=True, _
                     Format:=False, Wrap:=wdFindStop
            Fnd = .Found
        End With

        If Fnd = True Then
            With Rng
                Debug.Print .Text
'                .MoveStart wdWord, -2
'                With .Font
'                    .Italic = True
'                    .Bold = True
'                End With
            End With
        Else
            Debug.Print "Didn't find " & Crits(i)
        End If
    Next i
End Sub
该过程的前半部分将使用测试过程中已知的相同循环查找文档中的每个搜索条件。但是现在文本被送入
Find
方法,该方法将找到的文本分配给
Rng
范围。如果找到了该项,您现在就拥有了名为
Rng
的句柄

子部分的后半部分处理搜索结果。如果找到文本,则找到的文本(即
Rng.text
)将打印到即时窗口,否则原始文本
crit(i)
“未找到”

如果找到文本,则要为其指定样式。但是,在这样做之前,您应该处理找到的文本和要格式化的文本之间的差异。这种差异可能是物理上的,比如你没有在标准中写出整个文本长度,也可能是技术上的,比如排除段落标记。在我上面的小节中,只有随机代码(将
Rng
扩展为前面的两个单词,并将所有内容格式化为粗体斜体)。考虑这个代码占位符。< /P>
出于您的目的,像这样的代码也许可以完成这项工作<事实上,这是一个完全不同的问题,我敦促你不要急于得到这个结果。您现在拥有的部件需要首先进行彻底测试。

您有两项任务。一个是查找文本,另一个是对其应用样式。因为所有的样式都是相同的,所以您可以安全地集中精力指定文本。如果你在谷歌上搜索类似“查找所有事件”的内容,你会找到循环浏览文本的代码。你应该让它工作。然后,您可以对找到的每一位文本应用一种格式。注意我的用词。我说的是“应用格式”,而不是像代码建议的那样用格式替换文本。那不行。我还极力避免使用“select”这个词,因为使用
Range
对象会更好。好的,循环位很有用——不过我试图查找的代码都是唯一的。有没有想过如何编写宏来查找不在任何地方重复的多个字符串值?或者,输入我希望找到的所有值,但只输入一次,然后执行样式代码。谢谢你的详细回复。