Я не могу поручиться за знание Excel VBA, мне гораздо удобнее с Word VBA.
Есть две вещи, которые можно сделать, чтобы значительно упростить код OP.
С точки зрения Word используйте правильную коллекцию таблиц
с точки зрения VBA, отделите результаты поиска таблицы от заполнения таблицы.
Я предположил, что необходимость исключить упомянутые таблицы верхнего и нижнего колонтитула означает, что OP не заинтересован в таблицах, которые появляются в верхних или нижних колонтитулах. Это означает, что мы можем использовать коллекцию Word StoryRanges для выбора только тех таблиц, которые появляются в основном теле документа.
Таким образом
For Each tbl In doc.Tables
становится
For Each tbl In myDoc.StoryRanges(wdMainTextStory).Tables
, что Это, в свою очередь, означает, что мы можем исключить переменную iTbl и связанные с ней jiggery pokery, избегая таблиц в верхних и нижних колонтитулах. (Я выделил одну область в коде, где я не уверен в этом исключении)
Затем я использовал метод извлечения рефактора из fantasti c и бесплатный надстройку Rubberduck для VBA, чтобы сгенерировать новый метод, содержащий код для копирования строки, а затем пересмотрел этот метод, чтобы взять весь диапазон таблицы, а не только строку (PopulateTable).
Я также использовал метод .Add для объекта Table.rows как более простой способ добавление строки в таблицу.
Я не знаю, будет ли приведенный ниже код работать так, как задумано кодом OP, но он компилируется и не имеет результатов проверки Rubberduck, поэтому, по крайней мере, он синтаксически корректен.
Я надеюсь, что приведенный ниже код демонстрирует, как более глубокое понимание объектной модели Word и разделение задач (поиск таблицы и заполнение таблицы - это два разных действия) позволяют упростить код.
Option Explicit
Public Const kSchedRow As Long = 12
Public Sub PopulateTables(ByVal ipFileName As String)
Dim wdApp As Word.Application
Set wdApp = New Word.Application
Dim myDoc As Word.Document
Set myDoc = wdApp.Documents.Open(ipFileName)
Dim tbl As Word.Table
' Use the StoryRanges collection to select the correct range for the tables we want to populate
For Each tbl In myDoc.StoryRanges.Item(wdMainTextStory).Tables
With ThisWorkbook.Sheets("kVs") 'Excel sheet where the data resides to fill into Word Tables
' Define the excel range to be copied
Dim CopyRange As Excel.Range
Set CopyRange = .Range(.Cells(kSchedRow + 2, 1), .Cells(kSchedRow + 2, 1).End(xlDown))
' We are now copying tables from the main content of the document
' so I think this test is now redundant
'If .Cells(rw.Row, 1) = iTbl - 1 Then '
PopulateTable tbl, CopyRange
' End if
End With
Next tbl
End Sub
Public Sub PopulateTable(ByVal ipTable As Word.Table, ByVal ipCopyRange As Excel.Range)
Dim rw As Excel.Range
For Each rw In ipCopyRange
With ipTable.Rows
' add a row at the bottom of the table
.Add
'Add the Excel data to the Word Table
With .Last
.Cells.Item(1).Range.Text = CDate(rw.Cells.Item(rw.Row, 2)) & " - " & _
CDate(rw.Cells.Item(rw.Row, 3)) 'Time
.Cells.Item(2).Range.Text = rw.Cells.Item(rw.Row, 4) 'Company
.Cells.Item(3).Range.Text = rw.Cells.Item(rw.Row, 5) 'Address
.Cells.Item(4).Range.Text = rw.Cells.Item(rw.Row, 6) 'Telephone
.Cells.Item(5).Range.Text = rw.Cells.Item(rw.Row, 10)
End With
End With
Next
End Sub