Вставка таблицы Excel в документ Word с помощью кода VBA Excel. Метод Selection.PasteExcelTable: синтаксис, параметры, пример использования.
Метод Selection.PasteExcelTable
Метод Range.Paste, использующийся в VBA Word для вставки в документ таблиц, скопированных в буфер обмена из другого документа Word, не применим для вставки в документ таблиц, скопированных из книги Excel. Для этих целей используется метод Selection.PasteExcelTable.
Синтаксис
1 |
Expression.PasteExcelTable(LinkedToExcel, WordFormatting, RTF) |
Expression — переменная, представляющая объект Selection. В том числе, это может быть курсор или закладка.
Параметры
Все параметры метода Selection.PasteExcelTable логического типа и являются обязательными.
Параметр | Описание |
---|---|
LinkedToExcel | True — вставленная таблица связывается с исходным файлом Excel, чтобы изменения, внесенные в файл Excel, отображались в Microsoft Word. False — связь между вставленной таблицей и таблицей в исходном файле не устанавливается. |
WordFormatting | True — вставленная таблица будет отформатирована как таблица документа Word. False — вставленная таблица будет отформатирована в соответствии с исходным файлом Excel. |
RTF | True — Excel-таблица будет вставлена в расширенном текстовом формате (RTF). False — Excel-таблица будет вставлена в формате HTML-таблицы. |
Пример вставки Excel-таблицы
Допустим, у нас есть таблица Excel, начинающаяся с ячейки A1 (или с любой другой), и нам необходимо скопировать эту таблицу в существующий документ Word, вставив ее на место закладки "Закладка1".
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub Primer() Dim myWord As New Word.Application, myDoc As Word.Document 'Открываем существующий документ Word Set myDoc = myWord.Documents.Open("C:\Тестовая\Документ1.docx") 'Копируем таблицу на активном листе в буфер обмена 'Вместо ячейки Range("A1") можно указать любую другую, расположенную внутри таблицы Range("A1").CurrentRegion.Copy 'Вставляем таблицу из буфера обмена на место закладки myDoc.Bookmarks("Закладка1").Range.PasteExcelTable False, False, False 'Отображаем программу Word myWord.Visible = True 'Очищаем переменные Set myWord = Nothing Set myDoc = Nothing End Sub |
Если необходимо таблицу вставить в конец документа, строку
1 |
myDoc.Bookmarks("Закладка1").Range.PasteExcelTable False, False, False |
следует заменить на
1 2 3 4 5 6 7 8 9 10 |
With myDoc 'Переводим курсор в конец документа .Range(.Range.Characters.Count - 1, .Range.Characters.Count - 1).Select 'Добавляем перенос строки, если необходимо .ActiveWindow.Selection.InsertAfter vbCr 'Переводим курсор в конец документа .Range(.Range.Characters.Count - 1, .Range.Characters.Count - 1).Select 'Вставляем таблицу из буфера обмена .ActiveWindow.Selection.PasteExcelTable False, False, False End With |
Здравствуйте, Евгений. Спасибо за статью. То, что надо. Только небольшую заметку надо по поводу подключения библиотеки (Tools -> References -> Microsoft Word xx.0 Object Library), а то будет появляться сообщение (User-defined type is not defined). И ещё я сделал для связи:
подскажите как сделать во вставленной таблице все тексты и значения по центру (повторюсь, в таблице количество строк меняется, поэтому диапазон должен быть ко всей таблице)? Или лучше это сделать макрорекордером ворд?
Тут же вопрос: можно ли обновить документ не открывая его? (я предполагаю уже макросами ворда надо пользоваться).
Отвечу сам себе по поводу вставленной таблицы в ворде: принимает формат того абзаца на котором закладка. Шаблон ворда поправил теперь как надо встаёт таблица. Но есть «но». Дальнейшее не имеет отношения к эксель, но я опишу для информативности. Шаблон в Ворде у меня построен на Слиянии так же из другого документа Эксель в шаблон Ворд, а таблица которую вставляю из другого документа Эксель, так вот при вставке Нашей Таблицы в шаблоне Ворд «теряется» исходный документ Слияния. Наверно «действия» вставки таблицы форматирует ссылку на документ Слияния.
Огромное спасибо за пример! То что нужно! Но столкнулся с проблемой, которую пока не могу решить: у меня в экселе несколько листов из которых нужно скопировать таблицы и вставить вместо соответствующих закладок в ворд. Так вот, после копирования первой таблицы и вставки ее на место первой закладки, программа по необъяснимой для меня причине вставляет скопированную таблицу вместо всех закладок. Названия закладок разные, но почему-то они заменяются все. Вот фрагмент кода:
Добрый день, Максим!
Попробуйте переопределить закладки. Выделите в документе текст закладки без пробела в конце и снова вставьте закладку с тем же именем. И так со всеми закладками.
Здравствуйте!
При использовании кода:
почему-то не сохраняется форматирование таблицы как в Excel, при вставке таблицы «руками» через «Сохранить исходное форматирование» все копируется, как надо. Подскажите как поправить код?
Как прикрепить скрин не знаю.
Здравствуйте, Kirill!
Попробуйте заменить последний параметр с
False
наTrue
.Евгений, здравствуйте!
Спасибо большое за подсказку!
К сожалению не помогло(( Таблица вставляется «криво». Даже уже и не знаю как быть.
Upd.
Евгений, я был не прав! Помогло! Спасибо!
Здравствуйте, Евгений. Как можно из разных документов эксель в один ворд вставлять таблицы по закладкам. По отдельности для каждого документа ваш код работает хорошо. Пробовал переделать код из урока «VBA Excel. Bookmarks – закладки в документе Word» 5-й части, не получилось. Посмотрел, что вам писал здесь «Максим от 14.04.2022 в 17:06» у меня похожая ситуация, но у меня разные файлы эксель и «Максим» выложил часть кода. Если сможете, помогите.
Здравствуйте, Алексей!
Примерный код будет таким:
Код расположен в отдельной книге «Книга1.xlsm». Все книги должны быть открыты.
Здравствуйте, Евгений. Это замечательно с разных книг вставить в один документ. А как начать работу с открытым документом ворд? У меня задача сделать мини отчёт в ворд: 1. Из 1-го файла эксель сделать 1-ую страницу в ворд и часть отчёта, файл эксель я закрываю (чтобы не путаться). 2. Из 2-го файла эксель сделать 2-ую часть отчёта в том же документе ворд. Первая часть задачи выполняется и остаётся открытым файл ворд. Вторую часть задачи не могу осилить.
Ещё попробую перефразировать, из другого файла эксель макрос на вставку в уже открытый файл ворд.
Думал через этот код выполнить :
но здесь не проект.
Добрый день, Алексей!
Это проблема тоже решаема:
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке.
Здравствуйте, Евгений. Спасибо! Соединил ваши макросы в один и получил то, что надо.