2017-06-09 59 views
0

我正在尝试在Word中创建一个宏,它改变了一组〜150个唯一标题的样式。所有样式必须相同。我目前的代码可以正常工作并更改格式,但一次只能有一个标题。 简单来说,它很丑。Microsoft Word宏改变标题样式

我正在寻找可以重复使用的东西,并可能适用于未来的更多项目。

也许使用loop命令?我不知道,使用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 
+0

你有两个任务。一个是找到一个文本,另一个是应用一个样式。由于风格相同,所以您可以放心地专注于指定文本。如果你的谷歌的“找到所有的事件”,你会发现代码来循环你的文本。你应该做这个工作。然后,您可以将格式应用于您找到的每一段文字。注意我选择的单词。我说“应用格式”,而不是用代码所建议的格式替换文本。这是行不通的。我还努力避免使用“选择”这个词,因为使用Range对象会更好。 – Variatus

+0

确定循环位是有帮助的 - 但是我试图找到的代码都是唯一的。有关如何编写宏以查找多个不重复的字符串值的任何想法?或者,它可以输入我希望查找的所有值,但只需输入一次,然后执行样式代码。 – VBAmazing

回答

0

如果没有办法在其中您可以找出要自动元首你可能有一次写的一切。为此创建一个单独的函数。它可能看起来像这样: -

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)将打印到立即窗口,否则原始文本Crits(i)带有“未找到”。

如果找到文本,您想要为其分配样式。但在你这样做之前,你应该处理你找到的文本和你想要格式化的文本之间的区别。这种差异可能是物理的,就像你没有在标准中写出整个文本的长度,或者是技术性的,比如不包括段落标记。在我的上面的子代中,只有随机代码(通过前面两个单词扩展Rng并将所有内容格式化为粗体斜体)。考虑这个代码占位符。

为了您的目的,这样的代码可能会完成这项工作。 .Paragraphs(1).Style = Head1其实,这是一个相当不同的问题,我敦促你不要急于获得这个结果。您现在拥有的部分需要先进行彻底测试。

+0

我会试试这个。感谢您的详细回复。 – VBAmazing