Sub ExcelRangeToWord()
‘PURPOSE: Copy/Paste An Excel Table Into a New Word Document
‘NOTE: Must have Word Object Library Active in Order to Run _
(VBE > Tools > References > Microsoft Word 12.0 Object Library)
‘SOURCE: www.TheSpreadsheetGuru.com
Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table
‘Optimize Code
Application.ScreenUpdating = False
Application.EnableEvents = False
‘Copy Range from Excel
Set tbl = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects(«Table1»).Range
‘Create an Instance of MS Word
On Error Resume Next
‘Is MS Word already opened?
Set WordApp = GetObject(class:=»Word.Application»)
‘Clear the error between errors
Err.Clear
‘If MS Word is not already open then open MS Word
If WordApp Is Nothing Then Set WordApp = CreateObject(class:=»Word.Application»)
‘Handle if the Word Application is not found
If Err.Number = 429 Then
MsgBox «Microsoft Word could not be found, aborting.»
GoTo EndRoutine
End If
On Error GoTo 0
‘Make MS Word Visible and Active
WordApp.Visible = True
WordApp.Activate
‘Create a New Document
Set myDoc = WordApp.Documents.Add
‘Copy Excel Table Range
tbl.Copy
‘Paste Table into MS Word
myDoc.Paragraphs(1).Range.PasteExcelTable _
LinkedToExcel:=False, _
WordFormatting:=False, _
RTF:=False
‘Autofit Table so it fits inside Word Document
Set WordTable = myDoc.Tables(1)
WordTable.AutoFitBehavior (wdAutoFitWindow)
EndRoutine:
‘Optimize Code
Application.ScreenUpdating = True
Application.EnableEvents = True
‘Clear The Clipboard
Application.CutCopyMode = False
End Sub
In this part of the code we are determining if Microsoft Word is open or not. If Word is already open, we can set a variable equal to the entire program by using GetObject. If MS Word is not currently running we can use CreateObject to run an instance of Word and then set a variable equal to that specific instance of MS Word.
When using CreateObject, the target application will start running but it is not visible on screen. Therefore we need to turn the Visible setting on (equal to true). Also, VBA with Word is a little bit different than with Excel in that it is much more dependent on its window showing on screen. Therefore a second command must be written to Activate Microsoft Word.
Copy From Excel, Paste Onto Document
Now that you have a new document created, you can command Excel to paste your table into MS Word. Near the beginning of the code, there was a line that allowed you to specify the exact table you wanted to copy. The variable tbl was used to remember this table range and to allow you to reference the range later on in the code.
Guru Tip: It is a good idea to place code that may need to be manually changed at some point in the future near the beginning of the subroutine. This prevents you from having to scroll through your code and pinpoint the exact place where you spelled out which range you wanted to copy or which worksheet you wanted to pull data from. This can save you a bunch of time and prevent confusion!
Word has a special method called PasteExcelTable, which (as you can guess) allows you paste in an Excel table. There are three variables you can tweak to get you table looking and functioning just the way you want.
-
LinkedToExcel — True links the pasted table to the original Excel file so that changes made to the Excel file are reflected in Microsoft Word.
-
WordFormatting — True formats the table using the formatting in the Word document. False formats the table according to the original Excel file.
-
RTF — True pastes the Excel table using Rich Text Format (RTF). False pastes the Excel table as HTML.
Now for the last step! Depending on how large your table is, it may be spilling outside of your document page. In order to prevent this from happening you can go ahead and use AutoFitBehavior to resize the table to fit perfectly inside your Word document.
About The Author
Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.
Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!
— Chris
Founder, TheSpreadsheetGuru.com
Sub макрос()
Dim docSrc As Document, docRes As Document, rngTable As Range
Dim strFN As String
‘1. Отключение монитора. Может это уменьшит мерцание и может ускорит макрос.
Application.ScreenUpdating = False
‘2. Юзер выбирает файл, в котором таблица.
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add «Документы Word», «*.docx»
If .Show = 0 Then
Exit Sub
End If
strFN = .SelectedItems(1)
End With
‘3. Присваивание имени «docRes» активного файлу (в который надо вставить таблицу).
‘ После открытия другого файла, он станет неактивным.
Set docRes = ActiveDocument
‘4. Открытие файла, в котором таблица. При этом присваиваем файлу имя «docSrc».
Set docSrc = Documents.Open(FileName:=strFN)
‘5. Копирование таблицы из одного файла в другой.
With docRes.Range.find
‘ Текст-метка, куда надо вставить таблицу.
.Text = «~таблица~»
‘ Поиск текста-метки.
.Execute
‘ Присваиваем имя «rngTable» фрагменту, в котором находится текст-метка.
‘ Parent — это найденный текст.
Set rngTable = .Parent
End With
‘6. Убираем цветовую заливку.
rngTable.HighlightColorIndex = wdNoHighlight
‘7. Вставка таблицы. Копируется первая таблица из файла-источника.
docSrc.Tables(1).Range.Copy
rngTable.Paste
‘8. Очистка буфера обмена. Если таблица большая, то при закрытии ворда
‘ будет сообщение, что в буфере много данных.
‘ Просто копируем первый символ.
docSrc.Range.Characters(1).Copy
‘9. Закрытие файла-источника.
docSrc.Close SaveChanges:=False
’10. Включение монитора.
Application.ScreenUpdating = True
End Sub
[свернуть]
Answer taken from: http://www.mrexcel.com/forum/showthread.php?t=36875
Here is some code that reads a table from Word into the active worksheet of Excel. It prompts you for the word document as well as the table number if Word contains more than one table.
Sub ImportWordTable()
Dim wdDoc As Object
Dim wdFileName As Variant
Dim TableNo As Integer 'table number in Word
Dim iRow As Long 'row index in Excel
Dim iCol As Integer 'column index in Excel
wdFileName = Application.GetOpenFilename("Word files (*.doc),*.doc", , _
"Browse for file containing table to be imported")
If wdFileName = False Then Exit Sub '(user cancelled import file browser)
Set wdDoc = GetObject(wdFileName) 'open Word file
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)
'copy cell contents from Word table cells to Excel cells
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
Set wdDoc = Nothing
End Sub
This macro should be inserted into Excel (not Word) and put into a standard macro module rather than into the worksheet or workbook event code modules. To do this, go to the VBA (keyboard Alt-TMV), insert a macro module (Alt-IM), and paste the code into the code pane. Run the macro from the Excel interface as you would any other (Alt-TMM).
If your document contains many tables, as would be the case if your 100+ page table is actually a separate table on each page, this code could easily be modified to read all the tables. But for now I am hoping it is all one continuous table and will not require any modification.
Keep Excelling.
Damon
VBAexpert Excel Consulting
(My other life: http://damonostrander.com )
Вставка таблицы 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.
Selection.PasteExcelTable — это метод, предназначенный для вставки Excel-таблицы из буфера обмена в документ Word и ее форматирования в соответствии с заданными параметрами.
Синтаксис
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, начинающаяся с ячейки A1 (или с любой другой), и нам необходимо скопировать эту таблицу в существующий документ Word, вставив ее на место закладки «Закладка1».
Решение:
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 |
Если необходимо таблицу вставить в конец документа, строку
myDoc.Bookmarks(«Закладка1»).Range.PasteExcelTable False, False, False |
следует заменить на
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 |
ДОбрый день, уважаемые специалисты и гости форума.
Вопрос по VBA Word 2003.
Задача: в одном файле есть таблица, ее нужно перенести в другой файл без изменений, причем там, чтобы таблица была отобрана из всех таблиц в документе по совпадению строки. Получился следующий код:
Sub KopirovanieDatiVEtotGeFail() Dim strFIOTable As Range strFIOTable = MatchedTable("фамилия") Documents.Add Template:="c:UserslordDesktopTemplate.dot" End Sub Function MatchedTable(strMatch As String) For Each aTable In ActiveDocument.Tables aTable.Select Set tmpTable = Selection.Range Dim tableMatch As New RegExp tableMatch.Global = False tableMatch.Multiline = True tableMatch.IgnoreCase = True tableMatch.Pattern = strMatch '<--это "фаимлия" If tableMatch.Test(tmpTable) Then Dim rMatchedTable As Range Set rMatchedTable = tmpTable 'здесь нужна помощь 'strTable = tmpTable 'strTable.Select rMatchedTable.Select End If Next aTable MatchedTable = rMatchedTable 'здесь нужна помощь End Function
Проблема возникла с возвратом объекта «Таблица» из функции — не могу присвоить его в переменную и вставить в новый документ в нужную закладку. Если я делаю strTable (As String) = tmpTable, то вся таблица превращается в строку и в новый файл вставляется в виде
текста без разделителей. Если помечаю Function MatchedText(strMatch As String) As Range (чтобы из функции получить таблицу в качестве Range), то в самом конце функции я не могу присвоить MatchedTable = rMatchedTable (ругается на отсутсвие with, а я не
могу понять, где его вставить). Задача сводится к тому, чтобы на выходе функции получить таблицу в виде таблицы, а не строки, и перенести ее в новый файл без изменений. На выбор у меня (из моего понимания мануала) есть несколько вариантов:
— копать в сторону range…copy, range…paste
— копать в сторону метода ConvertToTable
Прошу Вашей помощи. Буду благодарен за любые советы.
Пробовал искать информацию самостоятельно: везде пишут только про вставку информации из таблицы, вставку информации из таблицы word в excel или наоборот, но вот как просто скопировать таблицу из word целиком — не могу понять. Заранее всем спасибо
Dedmoroz86 Пользователь Сообщений: 6 |
Друзья, помогите. Необходимо сделать следующее: Прикрепленные файлы
|
Grr Пользователь Сообщений: 595 |
#2 05.10.2016 05:23:55 Одна табличка 3х3
Изменено: Grr — 05.10.2016 10:18:41 |
|
JeyCi Пользователь Сообщений: 3357 |
#3 05.10.2016 07:22:29 4 таблицы
Прикрепленные файлы
Изменено: JeyCi — 05.10.2016 07:34:45 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Grr Пользователь Сообщений: 595 |
JeyCi, никакого пространства для самодеятельности не оставили |
JeyCi Пользователь Сообщений: 3357 |
#5 05.10.2016 07:34:29
названия таблиц из word’а выковыривать не буду чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Dedmoroz86 Пользователь Сообщений: 6 |
Огромное спасибо!!!! Помогло! =)))))) |
Dedmoroz86 Пользователь Сообщений: 6 |
Один вопрос остался, все цифры не поддаются математическим расчетам, в связи с тем что в конце каждой имеется пробел. Может существует макрос чтобы его убрать? Количество строк динамическое(т.е может быть меньше может быть больше). |
Grr Пользователь Сообщений: 595 |
Стандартный функционал — «Найти/Заменить»? |
JeyCi Пользователь Сообщений: 3357 |
#9 05.10.2016 12:34:13 после 18-й строки (перед Next i) — можете вставить проверку
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
Alex_24 Пользователь Сообщений: 9 |
#10 03.03.2018 16:30:49 Все похоже сделал правильно, а Excel ругается 5941 ошибкой. Что не так подскажите?
|
||
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Alex_24, Вы видели, как форумчане оформляют свой код? Вот и Вы оформляйте аналогично: для этого есть специальная кнопка <…> |
Alex_24, Вы код вручную набивали, что ли? Бросилось в глаза: Есть еще ошибки, но до устранения замечания не скажу где. Изменено: Казанский — 03.03.2018 21:39:38 |
|
nuroraf Пользователь Сообщений: 1 |
JeyCi, Как при копировании сохранить знаки переноса строки? Код рабочий, но перенос строки не сохраняет.
Можно ли скопировать такое точь в точь в ячейку на экзеле? |
sokol92 Пользователь Сообщений: 4445 |
#14 03.05.2019 21:09:47 Добавьте после строки 18 в #3:
Владимир |
||
Игорь Пользователь Сообщений: 2 |
[CODE][/CODE] Изменено: Игорь — 29.03.2023 15:27:31 |
Игорь Пользователь Сообщений: 2 |
#16 29.03.2023 13:14:58
Изменено: Игорь — 29.03.2023 15:31:11 |
||
Soferon 4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
||||||
1 |
||||||
Копирование таблицы из экселя в ворд07.09.2016, 11:28. Показов 13040. Ответов 20 Метки нет (Все метки)
Добрый день, помогите реализовать. такую фишку.
Вложения
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
07.09.2016, 11:42 |
2 |
|||
Так подойдёт ?
1 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
07.09.2016, 14:45 [ТС] |
3 |
Спасибо, нормально вот только вставляет криво. то есть растягивает. можно как то параметры вставки сделать меж строчный интервал и тому подобное. прост та таблица в экселе сделана с определенными размерами.
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
07.09.2016, 15:31 |
4 |
В Word при масштабе 100% отличий(растягиваний) — не заметил.
0 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
07.09.2016, 15:45 [ТС] |
5 |
растягивание по вертикали. в общем должно вылезти на 1 лист.
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
07.09.2016, 17:04 |
6 |
Если после копирования нельзя изменить высоту строк в таблице, то можете попробовать копировать рисунок и вставить не таблицу, а скриншот.
0 |
Soferon 4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
||||
08.09.2016, 09:31 [ТС] |
7 |
|||
pashulka, подумал над проблемой, можешь помочь с написанием кода. вот не много по другому записал ваш код. тоже рабочий до сохранения документа.
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
08.09.2016, 10:44 |
8 |
Где макрос, который, цитирую «записанный в ворде на форматирование текста»
0 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
08.09.2016, 12:32 [ТС] |
9 |
еще не записал. его. записать то не долго, а потом запустить. пока бьюсь с проблемой сохранения..
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||||||
08.09.2016, 13:34 |
10 |
|||||||
Решение
P.S. В Вашей версии действительно наличествует несовпадение высоты строк, причём, довольно существенное. Workaround прилагается :
1 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
08.09.2016, 17:14 [ТС] |
11 |
ого уважаемый pashulka, , да вы супер..
0 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
08.09.2016, 17:15 [ТС] |
12 |
вордовский документ
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
08.09.2016, 18:05 |
13 |
РешениеСмотрите аттач, только перед тестированием, не забудьте указать свою почту.
1 |
Soferon 4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
||||
16.09.2016, 11:33 [ТС] |
14 |
|||
Что добавить в ваш код чтобы документ сохранялся со шрифтом «Times New Roman»
0 |
pashulka 4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
||||
16.09.2016, 12:11 |
15 |
|||
Например :
1 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
16.09.2016, 12:39 [ТС] |
16 |
Спасибо работает.
0 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
27.09.2016, 13:02 [ТС] |
17 |
Ну очень мне понравилась эта фишка, применяю везде где только можно. не много видо изменяя код. столкнулся с такой проблемой, во вложении файл Плана . нужно скопировать уже две таблицы с разных листов, с первым все получается на ура. вот со вторым не катит. все перепробовал. видел много в инете копирование по закладкам, но вот только диапазоны по закладкам не сопирутся, вставляет адрес диапазона. pashulka, можете чем помочь?
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
27.09.2016, 14:58 |
18 |
Soferon, Об’единённые ячейки — это зло, тем паче в Word. Если исправите вторую таблицу, то получите необходимый результат, если нет, то после копирования второй таблицы, получите ошибку «Отсутствует доступ к отдельным строкам, поскольку таблица имеет ячейки, объединенные по вертикали.»
0 |
4 / 4 / 1 Регистрация: 22.06.2015 Сообщений: 98 |
|
27.09.2016, 15:43 [ТС] |
19 |
с этим я уже разобрался. мне то нужно перенести таблицы с разных листов в ворд по очереди. нашел тут одну тему попробую к ней прицепиться. потом отпишусь.
0 |
4131 / 2235 / 940 Регистрация: 01.12.2010 Сообщений: 4,624 |
|
27.09.2016, 20:27 |
20 |
Проблем, связанных с копированием с разных листов, особо не наблюдается (см.пример)
1 |