2017-06-09 89 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