2017-05-04 595 views
2

我正在構建一個循環遍歷文檔的每個單詞的宏,並通過正則表達式檢查它是否匹配模式,如果是,則將所找到的單詞寫入Excel工作表。它是這樣的:Word VBA:如何獲取當前節號

For Each sentence In ActiveDocument.StoryRanges 
    For Each w In sentence.Words 
     myWord = w 
     If TestRegExp(myPattern, myWord) Then 
      WKS.Cells(myCount, 1).Value = myWord 
      myCount = myCount + 1 
     End If 
    Next 
Next 

這部分工作正常。現在我還想要找到每個找到的單詞部分(又名「在發現的單詞出現的部分」)。我發現命令「selection.Information」,但無論我嘗試什麼,我只得到「Section = 1」。即使我只是檢查整個文檔的部分(「ActiveDocument.Sections.Count」),我只能得到1.因此,必須有部分關閉,但這個文檔肯定有部分。有沒有人知道我做錯了什麼?

+0

既然你的避風港並沒有標明答案或其他情況,並且你沒有定義你認爲是一個部分的內容,我將其標記爲「你不清楚你要問什麼」並投票結束。 –

回答

0

由於文檔的邏輯結構可能與顯示的文本不匹配,所以頁面和Word中的章節編號很困難。例如,我可以在文檔中間重置頁碼。

類似地,對於單詞的「部分」是通過插入分節符(無論下一頁,連續,下一個奇數,下一個偶數等)來分隔文檔的各個部分。然而,讀者通常認爲作爲在「標題1」樣式段落之前出現的數字的「部分」。再次,我可以重置這些數字中檔。因此,具有3個部分(邏輯)的文檔可能只有兩個標題:第1部分中沒有,第2部分中標有「1.簡介」的標題以及第3部分中標有「附錄A詞彙表」的標題中的標題。 (邏輯)的部分仍然是1,2,3 ......

w = ActiveDocument.Sentences(10).Words(1) ' given some word in the document 
MsgBox w.Information(wdActiveEndPageNumber) ' logical page number 
MsgBox w.Information(wdActiveEndAdjustedPageNumber) ' displayed page number 
MsgBox w.Information(wdActiveEndSectionNumber) ' logical section number 

作爲用於顯示的部分數,這是存在由於是「標題1」的風格和該樣式已經被設置到一個多層次的編號格式......在一般情況下,顯示該列表項目的號碼似乎非常困難。

我見過的解決方案涉及搜索匹配標題樣式的上一段,然後從中獲取.ListFormat.ListString。

MsgBox w.GoTo(What:=wdGoToHeading, Which:=wdGoToPrevious).ListFormat.ListString 

但得到的上一個標題任何水平,而不只是「標題1」。

0

SectionsStoryRanges不同,它們是StoryRanges(wdMainTextStory)範圍的一部分。您可以使用For循環,而不是For Each循環得到WdStoryType號:

For i = 1 To ActiveDocument.StoryRanges.Count   ' or 1 To 17 
    For Each w In ActiveDocument.StoryRanges(i).Words 
     If TestRegExp(myPattern, w) Then 
      WKS.Cells(myCount, 1).Value = myWord 
      myCount = myCount + 1 
      Debug.Print i, myCount, w     ' i has the WdStoryType number 
     End If 
    Next 
Next 

而且,可能不需要RegExp,如Word有通配符查找和替換https://superuser.com/questions/86397/wildcards-in-word,和VBA有Like Operator