1

Тема: Сохранение результатов слияния

Добрый день, уважаемые эксперты smile

у меня следующая задача. MS Office 2010

есть бд (таблица) в экселе, которая слиянием связана с 8мью вордовскими файлами
Договор, смета, накладная, акт - по 2 версии для юр и физ лиц (два отдельных листа в файле экселя соответственно).

при завершении слияния я получаю файл Письмо1 и т.д. а мне нужно чтобы получалось Договор 004-12, Смета 006-12 (из соотвествующих файлов) и т.д. - чтобы не тратить время на выбор названия для сохранения файла. Эти коды есть в бд. Это задача минимум.

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

Видимо нужен макрос умный
прочитал это http://wordexpert.ru/forum/viewtopic.php?id=450
но даже первую задачу решить не смог.

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

Если непонятно описал ситуацию - скажите что уточнить.

Заранее спасибо!

2

Re: Сохранение результатов слияния

в попытках решить задачу минимум:
по примеру приведённому в ссылке смог создать макросы сохранения с нужными именами. Проблема сейчас в том что не могу отправить на сохранение текущую запись слияния. могу отправить либо все (если в коде ничего не менять) либо последнюю, если заменить:   oMergedDoc.MailMerge.DataSource.ActiveRecord = wdLastRecord
For i = .DataSource.ActiveRecord To .DataSource.RecordCount

3

Re: Сохранение результатов слияния

giantil пишет:

Добрый день, уважаемые эксперты smile

у меня следующая задача. MS Office 2010

есть бд (таблица) в экселе, которая слиянием связана с 8мью вордовскими файлами
Договор, смета, накладная, акт - по 2 версии для юр и физ лиц (два отдельных листа в файле экселя соответственно).

при завершении слияния я получаю файл Письмо1 и т.д. а мне нужно чтобы получалось Договор 004-12, Смета 006-12 (из соотвествующих файлов) и т.д. - чтобы не тратить время на выбор названия для сохранения файла. Эти коды есть в бд. Это задача минимум.

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

Видимо нужен макрос умный
прочитал это http://wordexpert.ru/forum/viewtopic.php?id=450
но даже первую задачу решить не смог.

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

Если непонятно описал ситуацию - скажите что уточнить.

Заранее спасибо!


Правильно ли я понял, что вам нужно для указанных целей создать именно макрос? Или вам нужно только выполнить слияние?

Кроме того: это задача учебная или производственная? То есть нужно "сдать и забыть" или использовать это в своей работе?

Удобной и приятной работы в Word!
Перевести спасибо на Яндекс кошелёк - 41001162202962; на WebMoney - R581830807057.

4

Re: Сохранение результатов слияния

Задача производственная. Поэтому хочется сделать процесс создания документов максимально автоматизированным.

Со слиянием у меня нет проблем, оно уже работает так как мне надо. Макрос (я думаю тут других вариантов нет) нужен для автоматического сохранения результатов слияния.

Вчера копался в коде получилось, что задачу минимум решил.
Выглядит это сейчас так:

Sub SaveEachMergeToFile()
  Dim oMergedDoc As Document
  Const OUTGOING As String = "contract"
  If ActiveDocument.MailMerge.MainDocumentType <> wdNotAMergeDocument Then
    Set oMergedDoc = ActiveDocument
  Else
    MsgBox "Активный документ должен быть создан слиянием.", vbExclamation, "Сохранение документов после слияния"
    Exit Sub
  End If
  If Not oMergedDoc.Bookmarks.Exists(OUTGOING) Then
    MsgBox "В документе нет закладки с именем " & OUTGOING & ", которая используется в качестве имени файла." & vbNewLine & _
          "Создайте закладку с таким именем и запустите макрос ещё раз", vbExclamation, "Сохранение документов после слияния"
    Exit Sub
  End If
    
     
  With oMergedDoc.MailMerge
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      .Execute False
      With Documents(1)
        .SaveAs oMergedDoc.Path & "\" & oMergedDoc.Bookmarks(OUTGOING).Range.Text & ".doc"
        .Close False
      End With
  End With

  
  MsgBox "Документ слияния сохранён в папку """ & oMergedDoc.Path & """", vbInformation, "Сохранение документов после слияния"
End Sub

этот макрос сохраняет мне текущую запись слияния в файл с именем закладки "filename" в каталог где расположен шаблон. Закладка  "filename" определяет текст "ДОГОВОР{MERGEFIELD "contract"}"

Если говорить о задаче минимум то мне сейчас не нравится, что придётся во всех документах прописывать их будущее название, и если в договоре это есть в заголовке, то в остальных (СМЕТА, НАКЛАДНАЯ, АКТ) придётся это прописывать где то белым шрифтом мелкого кегля, чтобы не выводилось на печать. Но это уже чисто эстетическое замечание.

Если говорить о задаче максимум, то как я уже писал хотелось бы чтоб это был 1 шаблон (точнее два - для физ и юр лиц), который будет сохраняться в 4 документа с необходимыми мне именами. Ещё вчера вечером подумал было бы не плохо, чтоб создавалась папка с номером договора и туда все эти файлы сохранялись.

Т.е. на выходе чтобы получалось что вроде

C:\test\002-12\ДОГОВОР №002-12.doc
C:\test\002-12\СМЕТА №002-12.doc
C:\test\002-12\НАКЛАДНАЯ №002-12.doc
C:\test\002-12\АКТ №002-12.doc

где C:\test - каталог где расположен шаблон слияния (БД тоже там, но это не принципиально)


в настоящий момент пытаюсь адаптировать это
внешняя ссылка
для чтения прямо из полей (не из закладок) и создания папки
и это
внешняя ссылка
для сохранения из 1го документа-шаблона в 4.

5

Re: Сохранение результатов слияния

по 1й "внешней ссылке" адаптацию выполнил, ура)
теперь у мне не нужны закладки и создаётся папка с номером договора

Attribute VB_Name = "Module1"
Sub m_1()
Dim fs
Dim Fol_name As String
Dim File_name As String
Dim oMergedDoc As Document
Fol_name = "C:\test\" & ActiveDocument.MailMerge.DataSource.DataFields("contract")
File_name = "C:\test\" & ActiveDocument.MailMerge.DataSource.DataFields("contract") & "\Договор_" & _
        ActiveDocument.MailMerge.DataSource.DataFields("contract") & ".doc"
   If ActiveDocument.MailMerge.MainDocumentType <> wdNotAMergeDocument Then
    Set oMergedDoc = ActiveDocument
  Else
    MsgBox "Активный документ должен быть создан слиянием.", vbExclamation, "Сохранение документов после слияния"
    Exit Sub
  End If

'Проверка на наличие уже такой папки
    Set fs = CreateObject("Scripting.FileSystemObject")
    If fs.folderexists(Fol_name) = False Then
        'Создание папки
            fs.createfolder (Fol_name)
    End If
'Проверка на наличие в нашей папке уже такого файла
    If fs.fileexists(File_name) Then
        MsgBox "Файл с таким именем уже есть в этой папке. Файл не будет сохранён, т.к. он заменит собой уже существующий файл", vbCritical
        Exit Sub
    End If
    
'Сохранение файла
    
    With oMergedDoc.MailMerge
      .Destination = wdSendToNewDocument
      .SuppressBlankLines = True
      .Execute False
      With Documents(1)
        .SaveAs FileName:=File_name
        .Close False
      End With
    End With
    
End Sub

само слово "Договор_" правда пришлось в коде прописать

Кстати... подскажите ещё, как копировать кириллицу из VBA напрямую... а то копипаст убивает кодировку и приходится экспортировать макрос и потом открывать его блокнотом.