我试图在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
答案 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