尝试插入大量CrossReferences时VBA崩溃

时间:2017-06-02 15:00:19

标签: vba word-vba

尝试在VBA for Word中运行以下内容时遇到了一个神秘的问题:

Option Explicit

Sub Test()
    Dim allHeadlines As Variant
    Dim i As Integer

    allHeadlines = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)  ' Gets all headlines

    For i = 1 To UBound(allHeadlines)
        Selection.InsertCrossReference ReferenceType:="Nummeriertes Element", _
        ReferenceKind:=wdNumberRelativeContext, ReferenceItem:=Str(i), _
        InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
        SeparatorString:=" "
    Next
End Sub

这个想法很简单:只需获取所有标题并自动将其记录下来。 (实际上,我的意图有点不同,但我尽可能地打破了程序。)" Nummeriertes Element"表示"编号元素"。

在296个元素之后,程序在Selection.InsertCrossReference命令中崩溃时出现非常不明确的错误(运行时错误' 4198':"命令失败")。如果我忽略错误并尝试继续前进,Word会崩溃同样没有特定的"堆损坏"错误。

令我困扰的是,如果我重新启动Sub,它将立即失败并出现运行时错误' 4198'。我必须完全重新启动Word以便能够再次运行Sub,然后它将再次崩溃在同一点(296个元素)。似乎有些缓冲区已满,在重新启动Word之前不会被清除,但这非常烦人(我在本文档中超过300个标题)。

我在这里很茫然,因为我真的不明白发生了什么,或者如何规避这个问题。是否有其他人知道发生了什么或我做错了什么?

1 个答案:

答案 0 :(得分:0)

您收到错误的原因是您的文档中没有"Nummeriertes Element"引用,可能,更有可能的是,您有295 "Nummeriertes Element"个你的文件。当它试图将引用插入"Nummeriertes Element"(296)时,就会发生爆炸。在快速抨击一对夫妇之后的轰炸可能只是Word的一个问题(我已经看到一些非常奇怪的事情发生在word和.docm腐败)。不幸的是,你得到了那个可怕的错误,这绝对没有任何意义。

Option Explicit

Sub Test()
    Dim allHeadlines As Variant
    Dim doc As Document
    Dim i As Integer

    allHeadlines = ActiveDocument.GetCrossReferenceItems(wdRefTypeHeading)  ' Gets all headlines

    For i = 1 To UBound(allHeadlines)
        Selection.InsertCrossReference ReferenceType:=wdRefTypeHeading, _
            ReferenceKind:=wdNumberRelativeContext, ReferenceItem:=i, _
            InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
            SeparatorString:=" "
    Next i
End Sub

这将交叉引用您的标题。当您在后端指定ReferenceType"Nummeriertes Element"时(我假设),它正在执行GetCrossReferenceItems(wdRefTypeNumberedItem),然后您指定要通过序号{{1}获取它并尝试抓住不存在的wdNumberRelativeContext

当您将GetCrossReferenceItems(wdRefTypeNumberedItem)(296)更改为ReferenceType时,它会在序号中交叉引用标题,而不是您编号的列表项。您可以然后将wdRefTypeHeading放到str(i)

希望它有所帮助。