Хитрость для добавления вещей в существующий контент в Word заключается в использовании Range
объектов. Представьте себе диапазоны, подобные невидимым выборкам , с основным отличием в том, что может быть только один выбор, но код может использовать столько диапазонов, сколько необходимо для манипулирования контентом.
К вашему комментарию: Selection
в Word очень похоже на ActiveCell
в Excel;Специалисты по кодированию в Excel всегда скажут: избегайте использования «Active» - ничего, работайте с конкретными объектами, например, Ranges вместо ActiveCell
. То же самое верно для Word :-) Вы никогда не можете быть уверены, какая ячейка активна или где выбор;Range("A3")
говорит вам точно, что имеется в виду, Document.Paragraphs(2)
то же самое.
В этом духе я изменил фрагмент кода в вопросе, объявив (Dim
) и создавая экземпляр (* 1014). *) объект Range
ко всему основному тексту документа. Затем диапазон «сворачивается» (воспринимается как нажатие стрелки вправо на выделенном фрагменте) до конечной точки, так что добавление нового содержимого не заменяет предыдущего содержимого (та же проблема, что и при наборе текста над выделением).
Dim rngTarget as Object 'Word.Range for early-binding or within Word
Set rngTarget = mydoc1.Paragraphs(1).Range
'Paste Table into MS Word
rngTarget.PasteExcelTable False, False, False
'Autofit Table so it fits inside Word Document
Set WordTable = mydoc1.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)
rngTarget.InsertAfter Chr(13) & "Hello"
rngTarget.Collapse Direction:=wdCollapseEnd
rngTarget.InsertBreak 7 'Word.WdBreakType.wdPageBreak (default type)
rngTarget.Collapse Direction:=wdCollapseEnd
Set tbl = ThisWorkbook.Worksheets(Sheet3.Name).UsedRange
tbl.Copy
rngTarget.PasteExcelTable False, False, False
Я также внес некоторые коррективы в очистку. При работе с внешним приложением важно правильно освобождать его объявленные и созданные экземпляры объектов. Это должно быть сделано в обратном порядке , в котором они были созданы. Если они не были правильно освобождены, они могут удержать их в памяти, что приведет к ошибкам при следующем запуске кода.
EndRoutine:
'Clear The Clipboard
Application.CutCopyMode = False
mydoc1.SaveAs Filename:=Application.ActiveWorkbook.Path & "\Application_Temp\" & "Sheet1"
mydoc1.Close
Set rngTarget = Nothing
Set WordTable = NOthing
Set tbl = Nothing
Set mdyDoc1 = Nothing
'Possibly you also want
'WordApp.Quit
'This you definitely need
Set WordApp = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True