четверг, 13 августа 2015 г.

Автоматизация заполнения договоров

К примеру у Вас есть база клиентов в Экселе, нужно для всех клиентов составить договора. Шаблон договора в Ворде. Если подставлять нужные значения из Экселя в Ворд простым копированием — это утомительно, особенно если таких договоров пару сотен, да и ошибок при таком способе не избежать. 

Вот пример простого и универсального макроса.
Sub Generator()
Dim ObWord As Word.Application
Dim objDoc As Word.Document
Dim file As String
Set ob1 = ActiveWorkbook.ActiveSheet ' теперь переменная ob1 будет содержать ссылку на текущий лист активной книги
f_r = Selection.Row ' определяем номер выбранной строки
stb = Selection.Column ' определяем номер выбранного столбца
f_c = Selection.CurrentRegion.Columns(Selection.CurrentRegion.Columns.Count).Column ' определяем номер последнего столбца в данной таблице
path_f = ThisWorkbook.Path 'определяем текущую папку
file = Application.GetOpenFilename("Excel Files (*.docx;*.doc), *docx;*.doc") ' открывается диалоговое окно "Открытие документа"
If Dir(file) = Empty Then
    Exit Sub
Else
' запускаем Word, открываем выбранный документ
Set ObjWord = CreateObject("Word.Application")
    With ObjWord
        .Visible = True
        .Documents.Open Filename:=file
        Set objDoc = .ActiveDocument
    End With
With objDoc.Range
For j = 1 To f_c ' цикл по всем столбцам таблицы
    isk_zn = ob1.Cells(1, j) 'искомое значение - находится в первой строке нашей таблицы
    zamen_zn = ob1.Cells(f_r, j) 'значение для замены
    .Find.ClearFormatting
    .Find.Replacement.ClearFormatting
    'осуществляем замену
    With .Find
        .Text = isk_zn
        .Replacement.Text = zamen_zn
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = True
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    .Find.Execute Replace:=wdReplaceAll
Next j
' сохраняем документ в том же месте что и книга с макросом, имя документа - значение из выделенной ячейки
FName = ob1.Cells(f_r, stb)
objDoc.SaveAs Filename:=path_f & "\" & FName
    objDoc.Close
    ObjWord.Quit
End With
Set objDoc = Nothing
Set ObjWord = Nothing
ob1.Activate
End If
End Sub

Для его работы нужно подготовить шаблон вордовского документа, а в шапке таблицы Эксель названия полей взять в скобки, можно квадратные, можно фигурные, делается это для того, чтобы макрос не сделал «ненужную замену».
К примеру наша база данных выглядит так:

Тогда вордовский документ должен выглядеть так

Выбираем любую строку и запускаем макрос.
К примеру если на момент запуска макроса была выделена ячейка С3, т.е. «ЧП Новичок», то результат будет следующим

Для работы макроса нужно чтобы была установлена ссылка на библиотеку Microsoft Word 11.0 Object Library
  • +1
  • 28 августа 2011, 23:15
  • meg

Комментарии (4)

RSS свернуть / развернуть
+
0
Сила! Я так понимаю, что на одних макросах можно (если очень захотеть) нехилый документооборот наваять!
avatar
  • 29 августа 2011, 08:08
+
0
Очень «нехилый», можно чтобы макрос «пробегался» по всем нужным шаблонам и по всем выбранным клиентам, и тогда нажатием одной кнопочки будут сформированы целые пакеты документов. Можно чтобы и на печать сразу отправлялись.
avatar
  • 29 августа 2011, 08:36
+
0
Но, скромно думая, полноценный документооборот надо делать используя базу данных (не Excel), иначе огромные хранилища повторений (избыточность) и меньшая гибкость в изменениях.
avatar
  • 29 августа 2011, 08:49
+1
Да, этот макрос подходит для тех у кого небольшая база данных, которую вполне можно уместить в Экселе (ЧП, нотариусы и т.д.), предприятия с большим документооборотом базу данных в Экселе вести не будут.

0 коммент.:

Отправить комментарий