Как вставить в word вставить значения vba excel

0 / 0 / 0

Регистрация: 05.10.2012

Сообщений: 3

1

05.10.2012, 18:42. Показов 72832. Ответов 64


Студворк — интернет-сервис помощи студентам

Здравствуйте, ув. форумчане. Помогите начинающему. У меня есть экселевский файл с реквизитами клиентов. могу ли я сделать, чтобы по нажатию какой-нибудь кнопки(или по запуску макроса) создавался договор по определенному контрагенту из шаблона word?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

05.10.2012, 18:42

64

matresh

161 / 17 / 2

Регистрация: 14.07.2011

Сообщений: 74

05.10.2012, 19:44

2

Была такая же проблема. Но тут подсказали решение
Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Set wa=CreateObject("Word.Application") ' Создаем приложение Word
wa.Visible=True ' делаем Word видимым
 
Set wd=wa.documents.Add("C: (шаблон).docx")' берем шаблон
 
' в шаблоне заранее делаем закладки, и присваем им соответствующие значение из excel
For ii=1 to 5
   For jj=1 to 4
    marker="инд"& ii & jj 'наименование закладки
    wd.Bookmarks.Item(marker).Range.Text=wsh.Cells(1,jj+3).Value ' wsh-лист с которого берем значения
   Next jj
Next ii
 
wd.SaveAs Filename:= soh & "Опрос" & ".docx" ' сохраняем получившиеся файл; soh- директория сохранения
 
wd.Close True
wa.Quit
set wa=Nothing



1



Модератор

Эксперт функциональных языков программированияЭксперт Python

34707 / 19228 / 4039

Регистрация: 12.02.2012

Сообщений: 32,196

Записей в блоге: 13

05.10.2012, 19:53

3

Лучший ответ Сообщение было отмечено как решение

Решение

Вот, набросал схемку… Распакуй в какую-либо папку, открой xls-файл и щелкни по надписи «ПУСК!».

С закладками и полями, конечно, лучше будет.



9



176 / 15 / 2

Регистрация: 27.09.2012

Сообщений: 45

05.10.2012, 22:06

4

Кстати можно прекрасно работать без шаблонов и без связей файлов. Если интересно могу выложить файл где делал формирование документа с форматирование (с нуля) а также вставка таблиц из Excel… если поможет пишите в личку…



1



0 / 0 / 0

Регистрация: 05.10.2012

Сообщений: 3

08.10.2012, 15:53

 [ТС]

5

Цитата
Сообщение от Catstail
Посмотреть сообщение

Вот, набросал схемку… Распакуй в какую-либо папку, открой xls-файл и щелкни по надписи «ПУСК!».

С закладками и полями, конечно, лучше будет.

Catstail, огромное спасибо за наброски.Скажи, а можно чтобы при нажатии кнопки пуск создавались договора не на все существующие записи, а например только по выдененной строке



0



Модератор

Эксперт функциональных языков программированияЭксперт Python

34707 / 19228 / 4039

Регистрация: 12.02.2012

Сообщений: 32,196

Записей в блоге: 13

08.10.2012, 16:38

6

Конечно! Чуть позже приведу пример.



0



695 / 236 / 18

Регистрация: 17.01.2011

Сообщений: 583

Записей в блоге: 1

08.10.2012, 20:21

7

Лучший ответ Сообщение было отмечено как решение

Решение

Цитата
Сообщение от Funny06
Посмотреть сообщение

Catstail, огромное спасибо за наброски.Скажи, а можно чтобы при нажатии кнопки пуск создавались договора не на все существующие записи, а например только по выдененной строке

Позволил себе немного переделать код уважаемого Catstail. Щёлкните правой мышкой по строке с ФИО и «брюки превращаются в элегантные шорты»…

P.S. Тыкать на форуме не принято, и ко всем необходимо обращаться вежливо и на ВЫ..



2



Модератор

Эксперт функциональных языков программированияЭксперт Python

34707 / 19228 / 4039

Регистрация: 12.02.2012

Сообщений: 32,196

Записей в блоге: 13

10.10.2012, 22:21

8

Лучший ответ Сообщение было отмечено как решение

Решение

Вот доработанный код. Чтобы выбрать строки для генерации, нужно дважды щелкнуть мышью в пятой колонке нужной строки (см.) А потом — как и раньше — «Пуск»



5



695 / 236 / 18

Регистрация: 17.01.2011

Сообщений: 583

Записей в блоге: 1

11.10.2012, 08:39

9

Цитата
Сообщение от Catstail
Посмотреть сообщение

Чтобы выбрать строки для генерации, нужно дважды щелкнуть мышью в пятой колонке нужной строки

Понравился способ замены буквы n, на чёрный кружок. Я и не знал, что в Экселе есть такие чудоковатые алфавиты..



1



Модератор

Эксперт функциональных языков программированияЭксперт Python

34707 / 19228 / 4039

Регистрация: 12.02.2012

Сообщений: 32,196

Записей в блоге: 13

11.10.2012, 09:17

10

Лучший ответ Сообщение было отмечено как решение

Решение

А это не я придумал… У кого-то увидел.



2



0 / 0 / 0

Регистрация: 05.10.2012

Сообщений: 3

11.10.2012, 14:23

 [ТС]

11

Спасибо всем огромное, вы мне прямо жизнь спасли Особенная благодарность Catstail за предоставленные примеры.



0



1 / 1 / 0

Регистрация: 06.11.2012

Сообщений: 6

06.11.2012, 18:08

12

Подскажите пожалуйста, воспользовавшись Вашим примером, у меня возникла проблема.

Создаю Word-шаблон с определенным форматированием (шрифты, выравнивание, таблицы), а после обработки шаблона через макрос, все форматирование пропадает.

Как мне произвести вставку в шаблон, но при этом не утратить форматирование.

Спасибо!



0



5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

06.11.2012, 19:07

13

evavdeev,

  1. а каким кодом вы пользуетесь?
  2. выложите пример вашего шаблона;
  3. поясните, что нужно сделать.



0



evavdeev

1 / 1 / 0

Регистрация: 06.11.2012

Сообщений: 6

07.11.2012, 12:35

14

Брал за основу «Задачи-VBA-57a», вот что у меня получилось:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Sub main()
 
Dim wdApp As Object
Dim wdDoc As Object
 
    HomeDir$ = ThisWorkbook.Path
    
    Set wdApp = CreateObject("Word.Application")
    
    ii% = 3
    
    Do
    
      If Cells(ii%, 1).Value = "" Then Exit Do
      
      If Cells(ii%, 20).Value <> "" Then
      
         ID$ = Cells(ii%, 2).Value
         Adress$ = Cells(ii%, 5).Value
         SN$ = Cells(ii%, 12).Value
         DataC$ = Date
      
         FileCopy HomeDir$ + "template.doc", HomeDir$ + "" + ID$ + "_" + DataC$ + ".doc"
      
         Set wdDoc = wdApp.Documents.Open(HomeDir$ + "" + ID$ + "_" + DataC$ + ".doc")
      
         wdDoc.Range.Text = Replace$(wdDoc.Range.Text, "&id", ID$)
         wdDoc.Range.Text = Replace$(wdDoc.Range.Text, "&adress", Adress$)
         wdDoc.Range.Text = Replace$(wdDoc.Range.Text, "&sn", SN$)
 
         wdDoc.Save
         wdDoc.Close
      
         Cells(ii%, 20).Value = ""
      
      End If
      
      ii% = ii% + 1
      
    Loop
      
    wdApp.Quit
 
    MsgBox "Готово!"
 
End Sub

При этом все работает корректно, но в полученном файле doc пропадает выравнивание, жирный шрифт, таблица и т.д. (все приводится к обычному тексту)

Надо чтобы сохранилось стандартное форматирование шаблона (сохранились все стили и таблица)

Вложения

Тип файла: doc template.doc (28.5 Кб, 313 просмотров)



1



5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

07.11.2012, 12:56

15

evavdeev, какая версия программы Word у вас (2003, 2007 или другая)?



0



1 / 1 / 0

Регистрация: 06.11.2012

Сообщений: 6

07.11.2012, 14:14

16

установлен Microsoft Office 2010 Pro



0



Скрипт

5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

07.11.2012, 14:46

17

Лучший ответ Сообщение было отмечено как решение

Решение

evavdeev, код ниже нужно вам переделать, т.к. в этом коде показан только принцип.
У меня код написан для использования только в программе Word.

Использование закладок в программе Word:

Кликните здесь для просмотра всего текста

Если планируется создавать документы без участия человека, то можно использовать закладки.
Закладка в программе Word — это поименованный диапазон в документе.

  1. Чтобы было видно закладки (Word 2010):
    Файл — Параметры — Дополнительно — Показывать содержимое документа — поставьте флажок «Показывать закладки» — OK.
  2. Вставка закладки:
    1. Поставьте курсор в документе Word, куда должен вставляться текст из книги Excel;
    2. Вкладка «Вставка» — группа «Ссылки» — Закладка — дайте имя «Закладка_1» — Добавить;
    3. Возле курсора появится серая полоска, которая означает, что здесь находится закладка.

Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub Procedure_1()
    
    'Здесь нужно указать путь, где находится шаблон.
    Const sTemplatePath As String = "C:UsersUserDesktoptemplate.doc"
 
    'Здесь нужно указать путь, где должен быть новый документ.
    Const sNewDocumentPath As String = "C:UsersUserDesktopFileName.doc"
    
    'Здесь нужно указать имя закладки, которая находится в шаблоне Word.
    'В эту закладку будет вставляться текст из книги Excel.
    Const sBookmark_1 As String = "Закладка_1"
    
    Dim oDocument As Word.Document
    
    'Создаём документ на основе шаблона.
    FileCopy Source:=sTemplatePath, Destination:=sNewDocumentPath
    
    'Открываем новый документ, чтобы занести в него данные из Excel.
    Set oDocument = Documents.Open(FileName:=sNewDocumentPath, Visible:=False)
    
    'Вставка в закладку текста.
    oDocument.Bookmarks(sBookmark_1).Range.Text = "text"
    
    'Удаление закладки, чтобы закладки не приводили пользователей в замешательство.
    oDocument.Bookmarks(1).Delete
    
    'Закрываем новый документ с сохранением.
    oDocument.Close SaveChanges:=-1
 
End Sub



3



evavdeev

1 / 1 / 0

Регистрация: 06.11.2012

Сообщений: 6

07.11.2012, 20:08

18

Большое спасибо за помощь!

Вот что у меня получилось:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Sub ExportTemplate()
 
    Dim oWord As Word.Application
    Dim oDoc As Word.Document
    Set oWord = CreateObject("Word.Application")
    
    LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count
    Data$ = Date
    sTemplateDir$ = ThisWorkbook.Path
    sTemplatePath$ = sTemplateDir$ + "" + "template.doc"
    NumTem = 0
    
    For CurRow = 2 To LastRow
    
    If Cells(CurRow, 4) = "" Then
        GoTo Continue
    Else
    
        IDN$ = Cells(CurRow, 1).Value
        Address$ = Cells(CurRow, 2).Value
        SN$ = Cells(CurRow, 3).Value
        
        sNewDocumentPath$ = sTemplateDir$ + "" + IDN$ + "_" + Data$ + ".doc"
    
        Const sBookmark_address As String = "address"
        Const sBookmark_idn As String = "idn"
        Const sBookmark_sn As String = "sn"
    
    FileCopy Source:=sTemplatePath$, Destination:=sNewDocumentPath$
      
     Set oDoc = oWord.Documents.Open(Filename:=sNewDocumentPath$, Visible:=False)
    
    oDoc.Bookmarks(sBookmark_address).Range.Text = Address$
    oDoc.Bookmarks(sBookmark_idn).Range.Text = IDN$
    oDoc.Bookmarks(sBookmark_sn).Range.Text = SN$
    
    oDoc.Bookmarks(1).Delete
    oDoc.Bookmarks(2).Delete
    oDoc.Bookmarks(3).Delete 'Ошибка Run-time error '5941': Запрашиваемый номер семейства не существует
    oDoc.Close SaveChanges:=-1
    NumTem = NumTem + 1
    Cells(CurRow, 4) = ""
    
    End If
      
Continue:
    
    Next CurRow
 
    MsgBox prompt:="Всего обработано: " & NumTem & " строк, _
    Title:="Созданные шаблоны"
 
End Sub

Все работает, но есть одна проблема.
В процессе выполнения скрипта, появлятся ошибка при удалении 3-ей Закладки. Ошибка описана с листенге.
Пока я с ней не смог справиться.



0



5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

07.11.2012, 20:12

19

evavdeev, удаляйте закладки не по порядковым номерам, а по именам.
Например, в сообщении #18 в коде в строке 33 идёт обращение к закладке по имени, а в строке 31 — по порядковому номеру.

Примечание: ошибка из-за того, что после удаления двух закладок, у третьей закладки порядковый номер уже изменится и станет 1.



1



evavdeev

1 / 1 / 0

Регистрация: 06.11.2012

Сообщений: 6

07.11.2012, 20:26

20

Если я правильно понял, то надо так:

Visual Basic
1
2
3
oDoc.Bookmarks(idn).Delete
    oDoc.Bookmarks(sn).Delete
    oDoc.Bookmarks(Address)

Но опять ошибка

Добавлено через 4 минуты
немного ошибся:

Visual Basic
1
2
3
oDoc.Bookmarks(idn).Delete
    oDoc.Bookmarks(sn).Delete
    oDoc.Bookmarks(Address).Delete

Ошибка таже



0



Вставка таблицы 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


Хитрости »

24 Февраль 2012              91442 просмотров


Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Excel диапазон "A1:A10"
    Range("A1:A10").Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    'закрываем документ Word с сохранением
    objWrdDoc.Close True    ' False - без сохранения
    'закрываем приложение Word - обязательно!
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)

В файле-примере, приложенном к данной статье, в комментариях к коду есть несколько добавлений. Например, как вставить текст из ячеек в определенные закладки Word-а и как добавить новый документ, а не открывать уже имеющийся. Так же так есть код проверки — открыто ли приложение Word в данный момент. Порой это тоже может пригодиться, чтобы работать с запущенным приложением Word, а не создавать новое:

Sub Check_OpenWord()
    Dim objWrdApp As Object
    On Error Resume Next
    'пытаемся подключится к объекту Word
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
        'делаем приложение видимым. По умолчанию открывается в скрытом режиме
        objWrdApp.Visible = True
    Else
        'приложение открыто - выдаем сообщение
        MsgBox "Приложение Word уже открыто", vbInformation, "Check_OpenWord"
    End If
End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp()
    Application.ActivateMicrosoftApp xlMicrosoftWord
End Sub

но данный метод может пригодиться только в том случае, если Вам необходимо действительно лишь активировать другое приложение, но дальше обращаться к этому приложению Вы уже не сможете.

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools -References:

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord()
    Dim objWrdApp As Word.Application
    Set objWrdApp = New Word.Application
    objWrdApp.Visible = True
End Sub

Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения.

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Метод установки ссылки на библиотеку приложения через ToolsReferences называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения в коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(ViewImmediate Window или сочетание клавиш Ctrl+G), записать вопросительный знак и вставить эту константу и нажать Enter:
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.

Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    Range.Copy
    'вставляем скопированное в ячейку А1 активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:

Sub OpenWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    'создаем новое приложение Word
    Set objWrdApp = CreateObject("Word.Application")
    'Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме
    'objWrdApp.Visible = True
    'открываем документ Word - документ "Doc1.doc" должен существовать
    Set objWrdDoc = objWrdApp.Documents.Open("C:Doc1.doc")
    'Копируем из Word все данные, обращаясь к объекту Range документа
    'при этом перед Range явно указываем откуда его брать - из документа Word -objWrdDoc("C:Doc1.doc")
    objWrdDoc.Range.Copy
    'вставляем скопированное из Word в активную ячейку активного листа Excel
    ActiveSheet.Paste
    'закрываем документ Word без сохранения
    objWrdDoc.Close False
    'закрываем приложение Word
    objWrdApp.Quit
    'очищаем переменные Word - обязательно!
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
End Sub

Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.


В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel

Скачать пример:

  Tips_Macro_OpenWord.xls (49,5 KiB, 6 264 скачиваний)


А в архиве ниже — практически готовое решение заполнения всевозможных бланков Word из Excel. Как это работает. У нас есть таблица Excel с данными для заполнения бланков заявлений на пособия:
Исходная таблица
Обращаю внимание, что в первой строке расположены метки. Они нужны для того, чтобы код мог понять значения какого столбца в какое место шаблона Word должны попасть. А в самом шаблоне Word мы должны проставить эти самые метки:
Шаблон Word с метками
Фигурные скобки сделаны для того, чтобы код 100% искал и заменял только метку в шаблоне, исключая при этом замену случайного текста вне скобок(ведь слово «Должность» может встречаться и само по себе).
А здесь я схематично привел то, как будут происходить замены:
Схема замен
Сначала программа создаст новую папку, в которую и будет сохранять создаваемые файлы(имя папки состоит из даты и времени запуска кода). Далее программа циклом пройдется по каждой строке таблицы, создаст на основании шаблона Word(«Шаблон.doc») новый файл для этой строки, заполнит этот шаблона данными на основании меток, и сохранит созданный файл под новым именем. Сам файл шаблона при этом не изменяется — все метки в нем сохраняются как были настроены до запуска кода. Конкретно в приложенном коде значение для имени нового файла берется из первого столбца «ФИО с инициалами». Но это можно изменить в коде при необходимости. Делается это в этой строке:

'считываем фамилию с инициалами
sWDDocName = .Cells(lr, 1).Value

Что еще важно: файл шаблона Word должен находиться в той же папке, что и файл с кодом. Название файла в приложенном к статье файле должно быть «Шаблон.doc». Но его так же можно изменить, не забыв изменив его в коде в этой строке:

'имя шаблона Word с основным текстом и метками
Const sWDTmpl As String = "Шаблон.doc"

В общем-то, если хоть чуть-чуть разбираетесь, то поменять можно многое. А для тех, кто не разбирается достаточно будет просто создавать метки в файле Word и обозначать ими столбца в таблице Excel. Количество столбцов и строк в таблице код определяет автоматически и при изменении размеров таблицы ничего изменять не надо. Главное, чтобы метки находились в первой строке, вторая строка — заголовок(необязательно), а с третьей строки начинаются данные, которые и используются для наполнения шаблонов.
Скачать пример:

  Автосоздание бланков Word из таблицы Excel.zip (37,6 KiB, 1 471 скачиваний)

Примеры работы с тем же Outlook можно посмотреть в моих статьях:
Как отправить письмо из Excel?
Сохранить вложения из Outlook в указанную папку


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

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

Макрос № 1 Рабочий
Подготовка файлов.
В Excel файле:
— в любой ячейке пишем формулу или любое значение — задаем этой ячейке имя (Формулы — Присвоить имя) Имя задаем как: » BM_имяЛиста_001″.  BM-латиницей
— в любой ячейке пишем формулу или любое значение — задаем этой ячейке имя (Формулы — Присвоить имя) Имя задаем как: » BM_имяЛиста_002″ . и т.д

В Word
— Создаем закладку путем нажатия кнопок:  CTRL+SHIFT+F5  или Вставка — Закладка,  задаем имя как в Excel  «BM_имяЛиста_001» BM-латиницей
— Чтобы закладку использовать много раз в разных местах документа Word илспользуйте действие:

  1. Копируем имя закладки
  2. Нажимаем CTRL+F9 — результат: { такие скобки на сером фоне }
  3. Пишем внутри этих скобок  {  REF  BM_имяЛиста_001  }
  4. Для обновления данных нажмите: F9

Чтобы увидеть все закладки созданные путем нажатия CTRL-F9, нажмите ALT+F9  

Далее Макрос № 1 вставляем в Excel  и привязываем его к кнопке

Код
Sub CreateWordBM()Dim DocFile As String
DocFile = ThisWorkbook.Path & "" & ThisWorkbook.Sheets("Старт").Range("A1").Text & ".docx"  'Лист "Старт"  Имя файла указан в строке A1
Const MyDebug As Boolean = True ' Флаг отладки  True
Dim i As Integer
Dim ch As String
Dim IsNewApp As Boolean
 
' Попытаться использовать ранее открытое приложение WinWord (это быстрее)
On Error Resume Next
Set objWord = GetObject(, "Word.Application")
If Err Then
    ' Открытое приложение WinWord не найдено - создать новое
    Set objWord = CreateObject("Word.Application")
    IsNewApp = True
End If
objWord.Visible = True
objWord.Activate
On Error GoTo exit_
     
 ' Открыть документ DocFile
objWord.Visible = True
Set mDOK = objWord.Documents.Open(DocFile)  ' открываем документ
    For i = 1 To ActiveWorkbook.Names.Count
        If ActiveWorkbook.Names(i).Name Like "BM_*" Then
            Call UpdateBookmarks(ActiveWorkbook.Names(i).Name, Range(ActiveWorkbook.Names(i).Name).Value)
        End If
    Next i
exit_:
     
 ' Обязательно освободить память, занимаемую объектной переменной
Set objWord = Nothing
     
 ' При ошибке - сообщить
'If Err Then MsgBox Err.Description, vbCritical, "Ошибка"
ErrMsg = ""
If Err Then ErrMsg = "В ходе выполнения произошла ошибка: " & Err.Description
MsgBox "Закладки обновлены. " & ErrMsg
     
End Sub
 
Private Sub UpdateBookmarks(NameOfBookmark As String, ContentOfBookmark As String)
On Error Resume Next
Dim oRng As Object
Dim oBm As Object
    Set oBm = mDOK.Bookmarks ' в переменную закладки документа
    Set oRng = oBm(NameOfBookmark).Range ' в переменную имена закладок документа
    oRng.Text = ContentOfBookmark ' содержание закладок
    oBm.Add NameOfBookmark, oRng
    NameOf
End Sub

Макрос № 2 Рабочий
Подготовка тут немного хитрее.
Файл Excel и Word должны располагаться в одной папке
В файл Excel пихаем макрос.

В Word создаем закладку старого типа:

— и задаем имя закладки на латинице «BM_имяЛиста_001»  и т.д

Код
Sub CreateWord()'
' Создание 
'
    Set appWord = CreateObject(Class:="Word.Application")
    appWord.Visible = True
    strFileName = ThisWorkbook.Path & "Otchet.docm"   'Имя файла
    Set doc = appWord.Documents.Open(Filename:=strFileName)
 
 
 
    doc.FormFields("BM_имяЛиста_001").Result = Worksheets("имяЛиста").Cells(4, 2).value                'Значение из Cells(строка, столбец)  
    doc.FormFields("BM_имяЛиста_002").Result = Worksheets("имяЛиста").Cells(4, 3).value                
    doc.FormFields("BM_имяЛиста_003").Result = Worksheets("имяЛиста").Cells(4, 7).value      
  
End Sub

Вопрос собственно такой, как Макрос 2 сделать такой же, как Макрос 1
В Макросе № 1  есть цикл, а во 2 его нет.
Но оба варианта работают.

Понравилась статья? Поделить с друзьями:
  • Как вставить в word автоматическое оглавление документа
  • Как вставить в word form text
  • Как вставить в word doc
  • Как вставить в powerpoint документ excel
  • Как вставить в excel цифры без формул