2014-04-17 144 views
1

我有一个从Excel运行的VBA宏,用于从Word文档导入一些信息。在我开始解析之前,我想摆脱目录和其他字段。下面的代码(剥离到最低限度)适用于Office 2010,但不适用于Office 2013.我收到“对象字段中的方法删除失败” eror消息,但我不明白为什么。删除Word字段VBA不能在Word 2013中工作,在Word 2010中工作

感谢您的任何提示!

Sub ImportBOD() 

    Dim wdFileName As Variant 
    Dim WordApp As Object 

    Dim wdDoc As Word.Document 

    Dim fld As Word.Field 


    wdFileName = Application.GetOpenFilename("Word files (*.docx),*.docx", ,"Choose the Word document") 

    If wdFileName = False Then Exit Sub '(user cancelled import file browser) 

    Set WordApp = CreateObject("Word.Application") 

    Set wdDoc = WordApp.Documents.Open(wdFileName, ReadOnly:=True) 

    'Get rid of table of contents and other fields 
    For Each fld In wdDoc.ActiveWindow.Document.Fields 
     fld.Delete 
    Next 


    wdDoc.Close SaveChanges:=wdDoNotSaveChanges 

End Sub 
+0

。看到下面的回答+我的评论。 –

回答

1

不得不试图通过索引而不是删除它们?

For i = 1 to wdDoc.ActiveWindow.Document.Fields.Count 
    wdDoc.ActiveWindow.Document.Fields.Item(i).Delete 
Next i 

我有时发现,在循环在这种情况下fld去除活动对象并不总是成功的,VBA错误消息小于具体。此外,似乎SEQ(序列字段)和XE(IndexEntry字段)不能是Unlink ed,这向我暗示Delete可能会失败,尽管微软没有指定这种情况。

编辑

基于评论删除,你应该从最后一个项目去收集先当最后一个循环到第一

For i = wdDoc.ActiveWindow.Document.Fields.Count To 1 Step -1 
    wdDoc.ActiveWindow.Document.Fields.Item(i).Delete 
Next i 
+0

好主意,但删除时,从最后到第一项运行你的循环... –

+0

@KazJaw更新与最后到第一个循环 – engineersmnky

+0

感谢您的建议,不幸的是我得到同样的错误。然而,我做了一个解决方法:我使用了Unlink而不是Delete,这对我的目的来说没什么问题。我想摆脱田野的原因是,当我试图按段落处理文档时,遇到了问题,即逐段循环遍历文档。这些字段以某种方式干扰了处理,但是将它们转换为与Unlink相关的文本是有用的 – bbSTO