尝试在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个标题)。
我在这里很茫然,因为我真的不明白发生了什么,或者如何规避这个问题。是否有其他人知道发生了什么或我做错了什么?
答案 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)
希望它有所帮助。