У меня нет опыта работы с VBA, поскольку я обычно использую Matlab или иногда Python, но кажется, что это самый полезный инструмент для моего проекта. В основном из большого количества файлов Word, я должен извлечь таблицу и поместить ее в один файл Excel.
Из урока YT у меня уже есть следующий базовый код:
Sub CopyTable()
Application.Templates.LoadBuildingBlocks
Dim xlApp As Excel.Application
Dim xlwb As Excel.Workbook
Dim doc As Document
Dim tbl As Table
Dim LastRow As Long, LastColumn As Integer
Dim tblRange As Range
Set doc = ThisDocument
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True
Set xlwb = xlApp.Workbooks.Add
Set tbl = doc.Tables(3)
With tbl
LastRow = .Rows.Count
LastColumn = .Columns.Count
Set tblRange = .Cell(1, 1).Range
tblRange.End = .Cell(LastRow, LastColumn).Range.End
tblRange.Copy
xlwb.Worksheets(1).Paste
End With
Set xlwb = Nothing
Set xlApp = Nothing
Set tblRange = Nothing
Set tbl = Nothing
Set doc = Nothing
End Sub
Однако теперь мне нужно применить этот код к определенной папке с несколькими файлами doc (x). Я хотел бы иметь таблицу каждого отдельного файла Word на отдельном листе в том же файле Excel. Как я могу сделать xlwb.Worksheets(1).Paste
динамическим?
Кроме того, возможно ли будет сначала вставить имя файла Word в лист Excel в первой ячейке, а затем скопировать таблицу рядом с ним?
Любое руководство по включению этих изданий будет высоко оценено.
ДОБАВЛЕНО:
Используя приведенный ниже совет, я начал кодировать скрипт в Excel:
Sub ImportWordTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim TableNo As Integer
Dim iRow As Long
Dim iCol As Integer
filelist = Application.GetOpenFilename("Word files (*.doc),*.doc", , _
"Browse for file containing table to be imported", MultiSelect:=True)
If IsArray(filelist) Then
For i = 1 To Len(filelist)
wdFileName = filelist(i)
Set wdDoc = GetObject(wdFileName)
With wdDoc
TableNo = wdDoc.Tables.Count
If TableNo = 0 Then
MsgBox "This document contains no tables", _
vbExclamation, "Import Word Table"
ElseIf TableNo > 1 Then
TableNo = InputBox("This Word document contains " & TableNo & " tables." & vbCrLf & _
"Enter table number of table to import", "Import Word Table", "1")
End If
With .Tables(TableNo)
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
'ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
'ActiveWorkbook.Sheets(Worksheets.Count).Name = Dir(wdFileName)
'Worksheets(Dir(wdFileName)).Activate
ActiveWorkbook.Sheets.Add(After:=Worksheets(Worksheets.Count)).Name = Dir(wdFileName)
Worksheets(Dir(wdFileName)).Activate
ActiveSheet.Cells(iRow, iCol) = WorksheetFunction.Clean(.Cell(iRow, iCol).Range.Text)
Next iCol
Next iRow
End With
End With
wdDoc.Quit savechanges = False
Next i
Else
wdFileName = filelist
Set wdDoc = GetObject(wdFileName)
With wdDoc
TableNo = wdDoc.Tables.Count
If TableNo = 0 Then
MsgBox "This document contains no tables", _
vbExclamation, "Import Word Table"
ElseIf TableNo > 1 Then
TableNo = InputBox("This Word document contains " & TableNo & " tables." & vbCrLf & _
"Enter table number of table to import", "Import Word Table", "1")
End If
With .Tables(TableNo)
For iRow = 1 To .Rows.Count
For iCol = 1 To .Columns.Count
Cells(iRow, iCol) = WorksheetFunction.Clean(.Cell(iRow, iCol).Range.Text)
Next iCol
Next iRow
End With
End With
End If
Set wdDoc = Nothing
End Sub
Теперь я могу выбрать несколько файлов, а также добавил функцию, которая называет листы именем файла. Однако код не работает должным образом после копирования информации из первого файла. Кажется, что цикл for не обновляется должным образом, когда я получаю сообщение: «это имя листа уже существует». Может быть, мне здесь не хватает некоторой логики VBA в отношении циклов и индексации.