Новости:

Форум на данный момент в стадии обновления. Если у Вас возникли проблемы со входом в свою учетную запись - просьба писать на email: info@excel-vba.ru

Главное меню

Автозаполнение договора Word из Excel

Автор UmbertoNuevo, 20.08.2019, 18:26:41

« назад - далее »

UmbertoNuevo

Добрый день,

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

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

Сразу отмечу, слияние не работает никак - у меня Office 2016 на Mac OS, запустить слияние по описаниям для Винды у меня не получилось.

Хотелось бы все это сделать через надстройку, которую я уже создал. Необходим код для модуля. Уверен, что этот код уже существует и он не такой большой для моих нужд. Прошу помощи уважаемого сообщества! Заранее благодарен.

С уважением,
Николай

Дмитрий Щербаков(The_Prist)

Цитата: UmbertoNuevo от 20.08.2019, 18:26:41у меня Office 2016 на Mac OS
Это проблема - придется ждать тех, у кого офис так же на MAC. Большинство макросов для Windows не будут работать на MAC без переработок.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

UmbertoNuevo

Не знал, что там все по-другому. Язык-то, вроде, должен быть одним и тем же.
Ну хорошо, а если представить, что для Винды? Я ведь могу использовать Виртуальную Машину с Виндой.
Так может кто-то помочь?

Дмитрий Щербаков(The_Prist)

Учитывая тот факт, что файлы Вы приложили без единого кода - вряд ли это можно назвать помощью. По сути Вы просите сделать Вам все коды с нуля, а это уже совершенно не помощь, а "сделайте мне".
В этой статье Как из Excel обратиться к другому приложению я выкладывал файл с примером кода обращения к Word и заполнения шаблона на основании данных файла Excel. Основной упор на использование закладок в Word и дальнейшего к ним обращения:
objWrdDoc.Bookmarks("Закладка1").Range.Text = Range("A1")
пробуйте подстроить под свои файлы.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

UmbertoNuevo

Дмитрий, спасибо за ответ. Да, действительно с нуля. Как человек, умеющий программировать на Obj-C, я понимаю, что необходимый мне код не занимает сотни строк, и человек, знающий как его писать, смог бы написать его за короткий срок. Мне, к примеру, на stackoverflow не сложно потратить 10-15 минут и написать пару-тройку методов, если я знаю как это сделать. Во-первых, мне приятно помочь, во-вторых это иногда бывает неплохим челенджем. Я искренне надеялся, что здесь мне смогут помощь. Синтаксис здесь для меня чужой, учить язык с нуля я, к сожалению, не могу.

Строка вашего кода означает, что нужно перебрать вручную все метки Ворда и присвоить им соответствующие поля в Экселе? Или возможен цикл, который сравнит метки Ворда и присвоит им значения из Экселя?

С уважением, Николай

Борислав

#5
Дмитрий, приветствую!
Огромная благодарность за вашу статью и макрос.

Помогите с небольшим нюансом. У вас в коде есть такой момент:

   'Копируем из Excel диапазон "A1:A10"
   Range("A1:A10").Copy
   'Вставляем в Word - в начало документа
   objWrdDoc.Range(0).Paste
   'Если надо вставить в объект закладки ворда
'    objWrdDoc.Bookmarks("Закладка1").Range.Text = Range("A1")


Я пытаюсь адаптировать под себя и мне нужно чтобы метка в шаблоне {лист1} менялась на таблицу с листа {лист1}

'Здесь я копирую содержимое листа
ThisWorkbook.Worksheets("{лист1}").UsedRange.Copy
'А как заменить в шаблоне {лист1} на то что скопировали??

????????  Подскажите пожалуйста!

Благодарю!

Дмитрий Щербаков(The_Prist)

Борислав, (или Евгений, или Николай?  :o) :) Если брать за основу макрос по замене по меткам, то после
ThisWorkbook.Worksheets("{лист1}").UsedRange.Copy
надо в том блоке кода, который отвечает за произведение замены в Word - записать вместо конкретного значения вставку из буфера обмена:
.Find.Replacement.Text = "^c"
^c - это как раз указатель для Word на то, что надо вместо найденного значения поместить значение из буфера обмена.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Борислав

На самом деле Николай. Благодарю за помощь!

Вот что у меня получилось, все работает :

Sub Import_Word()
   
Dim objWrdApp As Object, objWrdDoc As Object, wdRange As Object
Dim IsAppClose As Boolean
               
Application.ScreenUpdating = True
   
'пытаемся подключится к Word
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
'если приложение закрыто - создаем новый экземпляр
        Set objWrdApp = CreateObject("Word.Application")
'сделать видимым
        objWrdApp.Visible = True
        IsAppClose = True 'Не знаю что это
    End If
   
    On Error GoTo 0
    If objWrdApp Is Nothing Then
        MsgBox "Не удалось подключиться к Word"
        Application.ScreenUpdating = True
        Exit Sub
    End If

'Открываем документ Word - документ "C:\Users\Olef\Desktop\макрос\Шаблон.doc"
'находится в папке с рабочей книгой
Set objWrdDoc = objWrdApp.Documents.Open("C:\Users\Olef\Desktop\макрос\Шаблон.doc")

'сохраняем файл шаблона с как "Расчет+дата.doc"
objWrdDoc.SaveAs ThisWorkbook.Path & "\Расчет " & Format(Now, "dd-mm-yy hh-mm") & ".doc"
   
'Перебираем именованые ячейки книги и сравниваем с метками в шаблоне, производим замену,
'если есть совпадения.
'Например. Значение ячейки с именем "Яч1" заменит метку в шаблоне {Яч1} по всему документу
Dim nName As Name
    For Each nName In ThisWorkbook.Names
    Set wdRange = objWrdDoc.Range
    wdRange.Find.ClearFormatting
    wdRange.Find.Replacement.ClearFormatting
      With wdRange.Find
          .text = "{" & nName.Name & "}"
          .Replacement.text = Range(nName).text
          .Forward = True
          .Wrap = 1 'wdFindContinue
          .Format = False
          .MatchCase = False
          .MatchWholeWord = False
          .MatchWildcards = False
          .MatchSoundsLike = False
          .MatchAllWordForms = False
          .Execute Replace:=2 'wdReplaceAll
      End With
    Next nName
                       
'Аналогичный перебор с листами книги. Таблица из листа {Лист1} должна заменить метку в шаблоне {Лист1} например
Dim List As Worksheet
    For Each List In ThisWorkbook.Worksheets
'Чтобы в переборе участвовали только листы с фигурными скобками
        If InStr(List.Name, "{") > 0 Then
'Поиск и замена
        ThisWorkbook.Worksheets(List.Name).UsedRange.Copy
            With wdRange.Find
                .text = List.Name
                .Replacement.text = "^c"
                .Forward = True
                .Wrap = 1 'wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
                .Execute Replace:=2 'wdReplaceAll
            End With
        End If
    Next List
'закрываем документ Word с сохранением
objWrdDoc.Close True
'закрываем приложение Word - обязательно!
objWrdApp.Quit
'очищаем переменные Word - обязательно!
Set objWrdDoc = Nothing: Set objWrdApp = Nothing
   
End Sub

Яндекс.Метрика Рейтинг@Mail.ru