Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
29.03.2024, 15:12:14

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 233 Сообщений в 5 454 Тем от 6 753 Пользователей
Последний пользователь: malanik777
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Word и VBA
| | |-+  Автозаполнение договора Word из Excel
Страниц: [1]   Вниз
Печать
Автор Тема: Автозаполнение договора Word из Excel  (Прочитано 7865 раз)
0 Пользователей и 1 Гость смотрят эту тему.
UmbertoNuevo
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля E-mail
« : 20.08.2019, 18:26:41 »

Добрый день,

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

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

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

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

С уважением,
Николай
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #1 : 20.08.2019, 18:40:41 »

у меня Office 2016 на Mac OS
Это проблема - придется ждать тех, у кого офис так же на MAC. Большинство макросов для Windows не будут работать на MAC без переработок.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
UmbertoNuevo
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля E-mail
« Ответ #2 : 20.08.2019, 21:11:33 »

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

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #3 : 20.08.2019, 21:21:29 »

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

пробуйте подстроить под свои файлы.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
UmbertoNuevo
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля E-mail
« Ответ #4 : 21.08.2019, 14:01:01 »

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

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

С уважением, Николай
Записан
Борислав
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #5 : 05.03.2024, 09:35:18 »

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

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

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


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

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

НепонимающийНепонимающий??  Подскажите пожалуйста!

Благодарю!
« Последнее редактирование: 05.03.2024, 09:36:50 от Борислав » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #6 : 05.03.2024, 11:15:05 »

Борислав, (или Евгений, или Николай?  Шокирован) Улыбка Если брать за основу макрос по замене по меткам, то после
Код: (vb)
ThisWorkbook.Worksheets("{лист1}").UsedRange.Copy

надо в том блоке кода, который отвечает за произведение замены в Word - записать вместо конкретного значения вставку из буфера обмена:
Код: (vb)
.Find.Replacement.Text = "^c"

^c - это как раз указатель для Word на то, что надо вместо найденного значения поместить значение из буфера обмена.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Борислав
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 2


Просмотр профиля E-mail
« Ответ #7 : 05.03.2024, 11:49:36 »

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

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

Код: (vb)
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
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru