Вставка таблицы Excel в документ Word с помощью кода VBA Excel. Метод Selection.PasteExcelTable: синтаксис, параметры, пример использования.
Работа с Word из кода VBA Excel
Часть 6. Вставка таблицы Excel в документ Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Метод 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 приведет к ошибке.
Здравствуйте, Евгений. Спасибо! Соединил ваши макросы в один и получил то, что надо.
Добрый день, Евгений!
Не нашел соответствующую тему и поэтому напишу здесь.
Подскажите пожалуйста, как из кода VBA Excel зайти в конструктор формул Word? Необходимо произвести несколько замен в формуле, которая создана конструктором в документе Word, но не получается.
Метки в тексте код находит замечательно, а вот метки в формуле игнорирует.
Добрый день, Kirill!
Попробуйте в самом Word записать макрос по созданию и редактированию формул. Если не получится, то вряд ли это вообще возможно через VBA. Проверить не могу, так как в моей версии Word конструктор формул отсутствует.
Спасибо большое за ответ!
Здравствуйте. Евгений, наконец-то вас нашла. Мне понравился ваш макрос, сохранила себе, а вот ресурс забыла.
Вы отвечали
этот макрос можно использовать для вывода табличек с разных листов одного файла?
Я сделала все ссылки под свой и у меня ничего не получается
Добрый день, Ната!
На какой строке кода у вас происходит ошибка?
Вот спасибо, за вопрос. Сразу перечитала статьи и поняла, что инструменты (библиотеку) ворда не подключила. Подключила и опять ошибка: Microsoft excel ожидает пока другое приложение завершит действие ole, и так циклично пока не попытаешься открыть файл ворд. И выходит ошибка 4198. Я думаю ошибка с открытием ворда.
Ната, попробуйте перезагрузить компьютер и запустить код только с открытием файла Word:
Всё сделала как вы сказали, открылся файл ворд. В этот же макрос добавила строчку:
и зависает долго около минуты работает и опять выдаёт: Microsoft excel ожидает пока другое приложение завершит действие ole.
в
Workbooks("Книга2.xlsm")
я полностью прописываю путь к файлу так же:Ната, книги Excel для работы этого кода должны быть уже открыты и обращаться к ним нужно только по имени:
Workbooks("Книга2.xlsm")
. Если предполагается, что книга будет закрыта, ее нужно предварительно открыть.Спасибо вам за разъяснения, поняла и многое не прочитала. Работает макрос только с открытым листом. А я хотела чтобы макрос с разных страниц-листов собирал таблички, у меня их три. Можно такое организовать? А выполнение макроса запускала с четвёртой. Простите, что доставила вам столько неудобств.
Здравствуйте, Евгений. Извините за назойливость. Подскажите, решение по этому макросу сложное? У вас в статьях я нашла «Вызов подпрограмм с аргументами в пределах одного модуля»:
я в правильном направлении двигаюсь?
Добрый день, Ната!
А по какой причине вам не подходит код, который вы разместили в первом комментарии?
Евгений, спасибо Вам огромное за помощь!!! Дошло до меня :)))) Нашла свои ошибки.
Здравствуйте Евгений!
Подскажите пожалуйста как скопировать данные из excel в word с последовательным добавлением строк в word не применяя закладки (количество строк в Excel все время разное)?
Здравствуйте, Андрей!
Вам подойдет код из параграфа «Вставка текста без форматирования» статьи VBA Excel. Редактирование документов Word.
Спасибо большое!!!!!
Добрыый день, Евгений!
Прошу помощи ибо не ведаю что творю 🙂
нужно скопировать диапазон из таблицы Excel в диапазон таблицы в Word
только ни как не пойму как заставить его принимать
Set WA = GetObject(, "Word.Application") ' -- Запускаем Word
If WA Is Nothing Then Set WA = CreateObject("Word.Application")
WA.Visible = True
WA.ScreenUpdating = True
Set WD = WA.Documents.Open(Filename:=TemplAd) ' -- Открываем шаблон спецификации
ActiveWorkbook.Sheets("Лист1").Range("A2:H3").Copy
WD.Tables(1).Cell(WdRow, 3).Range.Select
WD.Selection.Paste
Здравствуйте.
Вставил таблицу на n строк. Заполняю. Но таблица заканчивается.
Как узнать что больше нет пустых строк и как добавить новые пустые строки ?
Спасибо
Обсуждение закрыто.