VBA getcrossreferenceitems(wdRefTypeNumberedItem)段落截止?

时间:2017-02-02 21:49:03

标签: vba

我正在使用excel vba从word文档中提取信息。 在word文档中,有编号列表的级别。例如:

1. ABC
   1.1 DEF
       1.1.1 ABCDEF
2. AAA
   2.1 BBB
       2.1.1. CCC

我需要获得每个级别中每个标题的完整上下文,并将它们放入excel范围,即{"1.ABC", "1.1 DEF", "1.1.1 ABCDEF", "2. AAA", "2.1 BBB", "2.1.1. CCC"}

我使用的功能是:

For Each sec In objDoc.getcrossreferenceitems(wdRefTypeNumberedItem)

但是,如果标题太长,我的标题会被截断。例如,我有(出于保密原因添加了随机文本):

“5.2.11。当前参考文献:作为评估过程的一部分,XXX将执行2340AERTQ3493YR。选择ADT34534FDGSR时,请确保它们是AERA34AEFDS。”

但只有

  

5.2.11。当前参考文献:作为评估过程的一部分,XXX将进行234

显示

,句子的其余部分消失了。

如果有人有替代解决方案,请告诉我。

2 个答案:

答案 0 :(得分:0)

我确认了这种行为。一个可以解决的虽然精心设计的解决方案是扫描文档中所有编号的项目,这些项目为您提供全文,然后针对GetCrossReferenceItems返回的列表进行交叉引用。有一些工作涉及但工作,并使您能够创建一个具有可参考标题和NumberedItems的列表,这是我用来构建一个更友好的Word替代自己的实现。

您必须匹配格式Word适用于GetCrossReferenceItems返回的列表,即。特殊字符的识别和删除。

小心跟踪更改。 GetCrossReferenceItems中存在一个错误,这意味着GetCrossReferenceItems不会返回在文本开头有跟踪更改的项目(在我的情况下为标题),但内部仍然在列表中,因此索引是偏移的。如果有问题的项目是项目11,则GetCrossReferenceItems为属于项目12的项目提供项目11.解决方法是在GetCrossReferenceItems之前接受所有修订并在之后撤消它。

这并不容易,但有效。

答案 1 :(得分:0)

我在MSWord中遇到了类似的问题。我发现以下代码中缩短了一些段落的文字

Sub bug()
    items = ActiveDocument.GetCrossReferenceItems(wdRefTypeNumberedItem)

    For idx = 1 To UBound(items)
        MsgBox items(idx)      
    Next

End Sub

我必须使用一个很长的解决方案(在Python中,抱歉。但是在VBA中很容易重写):

varHeadings = []
for par in objDoc.Paragraph:
    if par.Range.ListFormat.ListType == win32com.client.constants.wdListOutlineNumbering:
        idx = par.Range.ListFormat.ListString
        txt = par.Range.Text.strip('\n').strip('\r')    
        varHeadings.append('%s%s' % (idx, par.Range.Text))    

哪个确实有用。但是,正如我所说,这是一些乏味的。所以我错过了MSWord中的一些VBA功能,或GetCrossReferenceItems已知错误,无法在VBA中找到任何替换?