2017-05-04 74 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