Ооо то что надо спасибо The_Prist, теперь я понял как применить идею RAN, ему тоже спасибо за помощь.
И так позволю себе подвести промежуточные итоги по улучшению данного макроса. Пример подкрепляю к данному сообщению, код макроса с различными вариантами его работы выкладываю ниже.
Цитата
Logistic написал: а что нужно изменить в коде ,что бы можно было формировать один договор ,выделили в таблице ячейку "Прізвище" Дзюба и получили договор по конкретной Фамилии.
Logistic я к сожалению не так хорошо разбираюсь в написании макросов чтобы, так просто и легко написать Вам изменение для формирования договора по выделенной ячейки, могу сказать одно что это точно можно реализовать, т.к. я видел похожие решения на др. форумах, но как реализовать конкретно для этого макроса я не подскажу. Попробуйте обратится к Богу Excel The_Prist, он думаю сможет подсказать идеи. Но я могу предложить рабоче-крестьянский вариант выполнения Вашей Logistic задачи без внесения изменений в данный макрос. Как вариант можно использовать формулу ВПР и дополнительный столбец с отметкой какую строку нужно сформировать как договор, это если надо сформировать только один договор из списка (пример во вложении). Если же Вам необходимо сформировать несколько договоров то можно использовать ВПР + массив. Если не разберетесь пишите
Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 19
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
'НоваяПапка = NewFolderName & Application.PathSeparator
Dim row As Range, pi As New ProgressIndicator
r = Cells(Rows.Count, "K").End(xlUp).row: rc = r - 2
If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word
WA.Visible = True ' отобразить Word
For Each row In ActiveSheet.Rows("3:" & r)
With row
ФИО = Trim$(.Cells(11)) & " " & Trim$(.Cells(12)) & " " & Trim$(.Cells(13) & Get_Now)
Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов
pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
For i = 11 To КоличествоОбрабатываемыхСтолбцов
FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
' так почему-то заменяет не всё (не затрагивает таблицу)
'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
pi.line3 = "Заменяется поле " & FindText
With WD.Range.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False: .MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2
End With
DoEvents
Next i
pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
WD.SaveAs Filename: 'сохранить созданый документ
'или
'WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ' сохранение в pdf
'или
'WD.PrintOut:'печать без сохранения
'WD.Close False: DoEvents 'закрыть созданый документ Word
p = p + a
End With
Next row
pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
'WA.Quit True: 'закрыть приложение Word
pi.Hide
msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
MsgBox msg, vbInformation, "Готово"
End Sub
'Function NewFolderName() As String
' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
' MkDir NewFolderName
'End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function
Да создаются, я прикрепил вложение можете проверить.
По вопросу автоматического открытия / не закрытия сохраненного документа пока решения не нашел The_Prist. Ваш вариант с удалением из кода "WD.Close False:" кажется логичным и правильным, но почему то не работает. У меня есть одна догадка, суть работы макроса заключается в открытии файла шаблона DOT замене необходимых полей и сохранением файлов в формате DOС. При этом насколько я понимаю в процессе работы макроса сами созданные файлы DOС не открываются. Поэтому может быть эту проблему можно решить через открытие созданных документов DOС, но как правильно это сделать для меня пока не ясно(((
Цитата
RAN написал: Он открывается, только в скрытом режиме. Отобразите word на экране Код ? 1WA.Visible = True
RAN я не совсем понимаю куда можно применить данный метод "WA.Visible = True "
Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
'НоваяПапка = NewFolderName & Application.PathSeparator
Dim row As Range, pi As New ProgressIndicator
r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word
For Each row In ActiveSheet.Rows("3:" & r)
With row
ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5) & Get_Now)
Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов
pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
For i = 1 To КоличествоОбрабатываемыхСтолбцов
FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
' так почему-то заменяет не всё (не затрагивает таблицу)
'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
pi.line3 = "Заменяется поле " & FindText
With WD.Range.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False: .MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2
End With
DoEvents
Next i
pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
WD.SaveAs Filename: DoEvents ' сохранить и открыть/незакрывать
'WD.SaveAs Filename: WD.Close False: DoEvents ' сохранить и закрыть
'WD.PrintOut: WD.Close False: DoEvents ' печать без сохранения
p = p + a
End With
Next row
pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
WA.Quit True: pi.Hide
msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
MsgBox msg, vbInformation, "Готово"
End Sub
'Function NewFolderName() As String
' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
' MkDir NewFolderName
'End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function
Добрый вечер! Большое спасибо за помощь The_Prist. Вопрос с сохранением в формате .pdf решен, все работает. рабочий код см. ниже. Было достаточно внести два изменения: ... Const РасширениеСоздаваемыхФайлов = ".pdf" ... WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ' сохранение в pdf WD.Close False: DoEvents ' закрытие файла ...
Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/1401-1.dotx"
Const ИмяФайлаДоговора = "ПЕЧАТНЫЕ ФОРМЫ/1401-1"
Const КоличествоОбрабатываемыхСтолбцов = 134
Const РасширениеСоздаваемыхФайлов = ".pdf"
Sub СформироватьДоговоры()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
Dim row As Range, pi As New ProgressIndicator
r = Cells(Rows.Count, "DA").End(xlUp).row: rc = r - 2
If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word
For Each row In ActiveSheet.Rows("3:" & r)
With row
НазваниеФайла = " " & Trim$(.Cells(105)) & " " & Get_Now
Filename = ПутьДоговора & НазваниеФайла & РасширениеСоздаваемыхФайлов
pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", НазваниеФайла
Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", НазваниеФайла
For i = 1 To КоличествоОбрабатываемыхСтолбцов
FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
' так почему-то заменяет не всё (не затрагивает таблицу)
'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
pi.line3 = "Заменяется поле " & FindText
With WD.Range.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False: .MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2
End With
DoEvents
Next i
pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", НазваниеФайла, " "
WD.ExportAsFixedFormat OutputFileName:=Filename, ExportFormat:=17 ' сохранение в pdf
'WD.SaveAs Filename: WD.Close False: DoEvents
'WD.PrintOut: WD.Close False: DoEvents 'печать без сохранения
WD.Close False: DoEvents
p = p + a
End With
Next row
pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
WA.Quit True: pi.Hide
msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & ПутьДоговора
MsgBox msg, vbInformation, "Готово"
End Sub
'Function NewFolderName() As String
' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
' MkDir NewFolderName
'End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function
The_Prist спасибо за Ваш ответ. К сожалению просто удаление "WD.Close False: " не помогает сохраненные файлы не открываются автоматически. я уже попробовал разные варианты 1) WD.SaveAs Filename: WD.Open True: DoEvents 'сохранить и открыть 2) WD.Open Filename: DoEvents 'открыть без сохранения Но увы ничего не работает(((
C сохранением в PDF тоже не выходит, по Вашему совету сделал запись макроса "сохранение файла DOC в PDF". Попытался по подобию сделать, но ничего не получилось((( 1) WD.ExportAsFixedFormat OutputFilename: ExportFormat: wdExportFormat , PDFOpenAfterExport:=True 2) WD.ExportAsFixedFormat Filename: WD.Close False: DoEvents Пока мой метод проб и ошибок не приносит результата...
Доброго всем времени суток! После 4 часов проб и ошибок у меня получилось найти решение проблем с сохранением файла в нужное место. Все работает делюсь кодом макроса, может быть пригодится Вам.
Но возникли две новые трудности: 1) Как сделать так чтобы файл Word после сохранения открывался автоматически тут у меня есть понимание что нужно внести коррективы в строку WD.SaveAs Filename: WD.Close False: DoEvents , но чтобы я не делал файл не открываются автоматически:
2) Как сохранить файл в формате PDF а не DOC тут тоже есть догадка что нужно использовать метод ExportAsFixedFormat, но я не понимаю как его правильно применить.
Заранее спасибо за помощь:)
Код
Const ИмяФайлаШаблона = "ШАБЛОНЫ/шаблон2.dot"
Const ИмяФайлаДоговора = "ДОГОВОРА/Договоры"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"Sub СформироватьДоговоры()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьДоговора = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора)
'НоваяПапка = NewFolderName & Application.PathSeparator
Dim row As Range, pi As New ProgressIndicator
r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
pi.StartNewAction , s1, "Запуск приложения Microsoft Word" ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word For Each row In ActiveSheet.Rows("3:" & r)
With row
ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5) & Get_Now)
Filename = ПутьДоговора & ФИО & РасширениеСоздаваемыхФайлов pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
Set WD = WA.Documents.Add(ПутьШаблона): DoEvents pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
For i = 1 To КоличествоОбрабатываемыхСтолбцов
FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) ' так почему-то заменяет не всё (не затрагивает таблицу)
'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True pi.line3 = "Заменяется поле " & FindText
With WD.Range.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False: .MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2
End With
DoEvents
Next i
pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
WD.SaveAs Filename: WD.Close False: DoEvents
'WD.PrintOut: WD.Close False: DoEvents печать без сохранения
p = p + a
End With
Next row pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
WA.Quit True: pi.Hide
msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
MsgBox msg, vbInformation, "Готово"
End Sub
'Function NewFolderName() As String
' NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаДоговора & Get_Now)
' MkDir NewFolderName
'End FunctionFunction Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function
Есть макрос Excel который создает документ Word по шаблону. Необходимо внести изменения в код макроса таким образом чтобы: 1) Шаблоны хранились в папке "ШАБЛОНЫ (нужно чтобы хранились здесь)" 2) Готовые Договора сохранялись в папку "ДОГОВОРА (нужно чтобы сохранялись сюда)" При этому если перемещается вся папка "CreateWordDocuments", в которой хранится файл с макросом "договор" и папки "ШАБЛОНЫ (нужно чтобы хранились здесь)" , "ДОГОВОРА (нужно чтобы сохранялись сюда)", маршрут должен подстраиваться под расположение файл с макросом "договор"
Пример прилагаю.
Заранее спасибо за помощь:)
Код
Const ИмяФайлаШаблона = "шаблон.dot"
Const КоличествоОбрабатываемыхСтолбцов = 11
Const РасширениеСоздаваемыхФайлов = ".doc"
Sub СформироватьДоговоры2()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
НоваяПапка = NewFolderName & Application.PathSeparator
Dim row As Range, pi As New ProgressIndicator
r = Cells(Rows.Count, "C").End(xlUp).row: rc = r - 2
If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub
pi.Show "Формирование договоров": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc
pi.StartNewAction , s1, "Запуск приложения Microsoft Word"
' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word
Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word
For Each row In ActiveSheet.Rows("3:" & r)
With row
ФИО = Trim$(.Cells(3)) & " " & Trim$(.Cells(4)) & " " & Trim$(.Cells(5))
Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайлов
pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", ФИО
Set WD = WA.Documents.Add(ПутьШаблона): DoEvents
pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", ФИО
For i = 1 To КоличествоОбрабатываемыхСтолбцов
FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
' так почему-то заменяет не всё (не затрагивает таблицу)
'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True
pi.line3 = "Заменяется поле " & FindText
With WD.Range.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = 1
.Format = False: .MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=2
End With
DoEvents
Next i
pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", ФИО, " "
WD.SaveAs Filename: WD.Close False: DoEvents
p = p + a
End With
Next row
pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " "
WA.Quit False: pi.Hide
msg = "Сформировано " & rc & " договоров. Все они находятся в папке" & vbNewLine & НоваяПапка
MsgBox msg, vbInformation, "Готово"
End Sub
Function NewFolderName() As String
NewFolderName = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "Договоры, сформированные " & Get_Now)
MkDir NewFolderName
End Function
Function Get_Date() As String: Get_Date = Replace(Replace(DateValue(Now), "/", "-"), ".", "-"): End Function
Function Get_Time() As String: Get_Time = Replace(TimeValue(Now), ":", "-"): End Function
Function Get_Now() As String: Get_Now = Get_Date & " в " & Get_Time: End Function