VBA代码打开许多单词表单并将数据导入Excel

时间:2017-03-08 17:04:47

标签: excel excel-vba ms-word vba

我试图在Excel中编写VBA以循环浏览许多Word文档(最多1,500或更多),并将每个文档的表单字段数据提取到同一电子表格中的单独行中。不幸的是,时间紧迫,我的VBA知识严重缺乏。

我从其他尝试过类似事情的人那里收集了我能做的事情后,创造了下面的弗兰肯斯坦式模块。我不确定如何解决我现在遇到的错误,甚至不肯定我会以正确的方式解决这个问题。当我执行下面的代码时,我得到"对象变量或没有设置块变量(错误91)"。它似乎在For Each循环中窒息。我假设变量定义或赋值不正确。

我想将其写为Excel VBA,以确保在不久的将来可以将Word表单分发给我的用户,同时让我的VBA模块正常工作。这些表格需要在本周寄出,他们会立即开始回复我。在过去的几年里,该部门的工作人员已经完成海量数据录入,将表格数据移植到Excel中 - 希望今年能够避免这种情况。

我还考虑将这些表单保存为仅限数据分隔的文本文件,但这需要打开每个Word文档,保存为分隔文本,将文件连接在一起并在Word中打开它。非常简单的过程,但我不想打开1,500个Word文档将它们保存为分隔文本。其余的都很容易。

我相信我还需要加强错误处理。当我运行另一个只处理一个文件的宏时,如果我在电子表格中有列标题并且Word文档保持打开状态,它就会失败。但现在这是次要问题。

提前感谢您提供的任何帮助。

 Sub MultFileLoad()

 'Remember: this code requires a reference to the Word object model

 Dim wdApp As New Word.Application
 Dim wdDoc As Word.Document
 Dim fName As String
 Dim i As Long, Rw As Long, f As Variant
 Dim file
 Dim Path As String

 ChDir ActiveWorkbook.Path
 Path = ActiveWorkbook.Path & "\"

file = Dir("C:\temp\test\*.docx")
Do While file <> ""
wdApp.Documents.Open Filename:=Path & file

 Rw = Cells(Rows.Count, 1).End(xlUp).Row + 2
 Cells(Rw, 1) = Cells(Rw - 1, 1) + 1
 i = 1
 For Each f In wdDoc.FormFields
 i = i + 1
 On Error Resume Next
 Cells(Rw, i) = f.Result
 Next

wdApp.ActiveDocument.Close

file = Dir()
Loop

wdApp.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
wdApp.Quit
Set wdApp = Nothing

Exits:
 End Sub

1 个答案:

答案 0 :(得分:0)

我明白了。仍需要进行更多清理并修复其他问题,但此代码适用于我的目的。希望其他人也能找到它的用途。

 Sub MultFileLoad()

 'Remember: this code requires a reference to the Word object model

 Dim wdApp As New Word.Application
 Dim wdDoc As Word.Document
 Dim fName As String
 Dim i As Long, Rw As Long, f As Variant 'Word.FormField
 Dim file
 Dim Path As String

 ChDir ActiveWorkbook.Path
 Path = ActiveWorkbook.Path & "\"

file = Dir("C:\temp\test\*.docx")
Do While file <> ""
wdApp.Documents.Open Filename:=Path & file

 Set wdDoc = wdApp.Documents.Open(Path & file)
 Rw = Cells(Rows.Count, 1).End(xlUp).Row + 1
 Cells(Rw, 1) = Cells(Rw - 1, 1) + 1
 i = 1
 For Each f In wdDoc.FormFields
 i = i + 1
 On Error Resume Next
 Cells(Rw, i) = f.Result
 Next

wdApp.ActiveDocument.Close

file = Dir()
Loop

wdApp.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
wdApp.Quit
Set wdApp = Nothing

Exits:
wdApp.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges
wdApp.Quit
Set wdApp = Nothing

 End Sub