Что-то вроде следующего, возможно. Поскольку я не могу воспроизвести ваши документы, моя тестовая среда не была идентичной ...
Следующий код объявляет объект Word.Table
и Excel.Worksheet
в списке объявленных переменных.
Объекту «Рабочий лист» присваивается значение ActiveSheet
и позднее для каждого добавленного рабочего листа. Использование объекта вместо выделения или «активного» чего-либо почти всегда предпочтительнее - тогда для человека и VBA понятнее, что имеется в виду. ws
также используется для более точного определения спецификаций Range
.
Перед зацикливанием таблиц для рабочего листа Name
устанавливается значение, сохраненное в Filename
для документа Word.
Объект Table установлен на таблицу WordDoc.tables(tableStart)
. Более эффективно работать с объектом, а не каждый раз запрашивать полный «путь» к объекту. Это также легче читать.
Перед переходом к следующему документу Word добавляется новый лист.
Sub ImportWordTable()
Dim WordApp As Object
Dim WordDoc As Object
Dim tbl As Object
Dim arrFileList As Variant, FileName As Variant
Dim tableNo As Integer 'table number in Word
Dim tableStart As Integer
Dim tableTot As Integer
Dim ws As Worksheet
Dim Target As Range
'On Error Resume Next
arrFileList = Application.GetOpenFilename("Word files (*.doc; *.docx),*.doc;*.docx", 2, _
"Browse for file containing table to be imported", , True)
If Not IsArray(arrFileList) Then Exit Sub '(user cancelled import file browser)
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = True
Set ws = ActiveSheet
ws.Range("A:AZ").ClearContents
For Each FileName In arrFileList
Set WordDoc = WordApp.Documents.Open(FileName, ReadOnly:=True)
With WordDoc
tableNo = WordDoc.tables.Count
tableTot = WordDoc.tables.Count
If tableNo = 0 Then
MsgBox WordDoc.Name & " contains no tables", vbExclamation, "Import Word Table"
ElseIf tableNo > 1 Then
tableNo = InputBox(WordDoc.Name & " contains " & tableNo & " tables." & vbCrLf & _
"Enter the table to start from", "Import Word Table", "1")
End If
ws.Name = FileName
For tableStart = 1 To tableTot
Set Target = ws.Range("A1")
Set tbl = .tables(tableStart)
With tbl
.Range.Copy
'Target.Parent.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
Target.Activate
ws.Paste
Set Target = Target.Offset(.Rows.Count + 2, 0)
End With
Next tableStart
.Close False
End With
Set ws = ws.Parent.Worksheets.Add
Next FileName
ws.Delete 'the last sheet is one too many
WordApp.Quit
Set WordDoc = Nothing
Set WordApp = Nothing
End Sub