Пусть есть ворд-документ со следующей строкой:
"Уважаемая Лора Ипполитовна! Просим Вас предоставить следующие данные: Ученое звание, должность, шифр специальности, ученая степень". Пусть также есть excel--документ с таблицей имен, ученых званий, должностей, шифров, ученых степеней. Пусть заполнено 5 строк. Необходимо: по нажатию кнопки (или любому иному событию) сгенерировать 5 документов на основе вышеописанного ворд-документа. В каждый из 5 документов на места, выделенные мной здесь для визуализации жирным шрифтом (которые в ворд-документе должны быть оформлены в виде полей или, возможно, закладок) , должны быть вставлены данные из соответствующих столбцов еxcel-таблицы.
Привязка полей Word документа и данных Excel
Сообщений 1 страница 11 из 11
Поделиться12010-11-30 00:00:32
Поделиться22010-11-30 00:37:53
Решение. Общий смысл такой: есть шаблон Word (dot-файл), в нём имеются поля, которые необходимо заполнить. Есть Excel файл с кнопкой внутри, по нажатию на которую появляется диалог выбора файла, где нужно выбрать шаблон, затем создаётся Word-документ на основе выбранного шаблона и поля созданного документа заполняются данными из строки Excel.
Ниже приведен код нажатия кнопки на Excel листе.
Sub GenerateButton_Click()
Dim OpnFileDlg As FileDialog ' Диалог открытия файла. Для выбора шаблона
Dim wdApp As Object ' Приложение Word
Dim wdDoc As Object ' Документ Word
' Показываем диалог выбора файла для того, чтобы выбрать шаблон
Set OpnFileDlg = Application.FileDialog(msoFileDialogOpen)
With OpnFileDlg
.ButtonName = "Выбрать"
.AllowMultiSelect = False
.Filters.Add "Файлы Microsoft Word ", "*.dot;*.dotx", 1
.Title = "Выбор шаблона Word-документа для экспорта"
.InitialView = msoFileDialogViewDetails
.Show
End With
' Создаём приложение Word
Set wdApp = CreateObject("Word.application")
' Приложение Word видимо
wdApp.Visible = True
' Здесь логика выборки данных из Excel написана для таблицы с двумя колонками (A, B)
' Первая колонка - ФИО, вторая - ученая степень. Таблица имеет шапку, поэтому начинаем
' выборку со второй строки (counter + 1). Код выборки написан "в лоб" и довольно неграмотный:
' например, задано четкое число строк в цикле (10).
' Правильную выборку надо писать с конкретного примера.
For counter = 1 To 10
' Если не пустая ячейка с именем, то создаем документ на основе выбранного шаблона
' и заполняем поля документа
If IsEmpty(Cells(counter + 1, 1).Value) = False Then
Set wdDoc = wdApp.Documents.Add(OpnFileDlg.SelectedItems(1))
wdDoc.FormFields(1).Result = Cells(counter + 1, 1)
wdDoc.FormFields(2).Result = Cells(counter + 1, 2)
End If
Next counter
End SubСами файлы для демонстрации примера можно скачать тут:
http://depositfiles.com/files/m7o76540q
Поделиться32010-11-30 12:59:53
Максим,
отлично работает. Под конкретную выборку переделаю сам.
Пока остаются такие вопросы:
1. Подскажите по пунктам меню, как Вы делали закладки полей в ворде. У меня Вставка-Закладка не срабатывают. Возможно, упускаю некую галочку?
2. Необходимо, чтобы файлы не открывались, как в случае Вашего кода, а складывались в ту же папку, где и шаблон. Имена файлов должны соответствовать
именам преподавателей, н-р, ЛораИпполитовна.doc
Поделиться42010-11-30 21:12:53
1. Подскажите по пунктам меню, как Вы делали закладки полей в ворде. У меня Вставка-Закладка не срабатывают. Возможно, упускаю некую галочку?
Я использовал поля как элементы управления. В Word 2010 (и наверное справедливо для 2007-го) добавляются они след. образом:
Вкладка «Разработчик» -> Группа «Элементы управления» -> Выпадающий список «Инструменты из предыдущих версий» -> Кнопка «Поле (элемент управления формы)»
Вкладка "Разработчик" по-умолчанию скрыта. Включается она в Параметрах Word (Файл - Параметры). В 2007-м доступ к Параметрам Word осуществляется через Application Menu (Круглая большая кнопка сверху слева).
Поделиться52010-11-30 21:59:31
Понял, Максим.
На всякий случай и для других задач: я никогда не использовал поля, наблюдал их лишь в чужих файлах - под полями там подразумевается зарезервированное место под дату, время и т.п.
Но теперь понял, что Вы имели в виду.
Поделиться62010-12-01 00:38:32
2. Необходимо, чтобы файлы не открывались, как в случае Вашего кода, а складывались в ту же папку, где и шаблон. Имена файлов должны соответствовать
именам преподавателей, н-р, ЛораИпполитовна.doc
Добавилось еще одно диалоговое окно для выбора места сохранения сгенерированных документов.
Sub GenerateButton_Click()
Dim OpnFileDlg As FileDialog ' Диалог открытия файла. Для выбора шаблона
Dim SaveFileDlg As FileDialog
Dim wdApp As Object ' Приложение Word
Dim wdDoc As Object ' Документ Word
Dim TemplatePath, SavePath As String 'Путь к шаблону и путь сохранения документов
' Показываем диалог выбора файла для того, чтобы выбрать шаблон
Set OpnFileDlg = Application.FileDialog(msoFileDialogOpen)
With OpnFileDlg
.ButtonName = "Выбрать"
.AllowMultiSelect = False
.Filters.Add "Файлы Microsoft Word ", "*.dot;*.dotx", 1
.Title = "Выбор шаблона Word-документа для экспорта"
.InitialView = msoFileDialogViewDetails
.Show
End With
' Выбранный шаблон
TemplatePath = OpnFileDlg.SelectedItems(1)
' Создаём приложение Word
Set wdApp = CreateObject("Word.application")
' Выбираем место сохранения сгенерированных документов
Set SaveFileDlg = Application.FileDialog(msoFileDialogFolderPicker)
SaveFileDlg.Show
SavePath = SaveFileDlg.SelectedItems(1)
' Здесь логика выборки данных из Excel написана для таблицы с двумя колонками (A, B)
' Первая колонка - ФИО, вторая - ученая степень. Таблица имеет шапку, поэтому начинаем
' выборку со второй строки (counter + 1). Код выборки написан "в лоб" и довольно неграмотный:
' например, задано четкое число строк в цикле (10).
' Правильную выборку надо писать с конкретного примера.
For counter = 1 To 10
' Если не пустая ячейка с именем, то создаем документ на основе выбранного шаблона
' и заполняем поля документа
If IsEmpty(Cells(counter + 1, 1).Value) = False Then
Set wdDoc = wdApp.Documents.Add(TemplatePath)
wdDoc.FormFields(1).Result = Cells(counter + 1, 1)
wdDoc.FormFields(2).Result = Cells(counter + 1, 2)
wdDoc.SaveAs2 (SaveFileDlg.SelectedItems(1) + "\" + Cells(counter + 1, 1) + ".doc")
wdDoc.Close
End If
Next counter
' Закрываем Word
wdApp.Quit (False)
End Subhttp://depositfiles.com/files/vugpd90aj
Отредактировано Ничипорчук Максим (2010-12-01 00:44:01)
Поделиться72010-12-01 14:05:11
Максим,
выдает ошибку в строке
wdDoc.SaveAs2 (SaveFileDlg.SelectedItems(1) + "\" + Cells(counter + 1, 1) + ".doc")
Пишет object doesn/t support this value or method
Тестировал в 2003 и 2007. В 2003 в окне выбора папки не отображает выбранную папку в строке сохранения. В 2007 - отображает, но выдает указанную ошибку.
Может быть, не предлагать выбор пользователю, а складировать автоматически в ту же папку, где и шаблон?
Поделиться82010-12-01 18:27:26
Переделал, чтобы сохранялось автоматически в папку с шаблоном. И теперь должно работать в 2003-м. Попробуйте, пожалуйста.
Sub GenerateButton_Click()
Dim OpnFileDlg As FileDialog ' Диалог открытия файла. Для выбора шаблона
Dim SaveFileDlg As FileDialog
Dim wdApp As Object ' Приложение Word
Dim wdDoc As Object ' Документ Word
Dim TemplatePath, SavePath As String 'Путь к шаблону и путь сохранения документов
' Показываем диалог выбора файла для того, чтобы выбрать шаблон
Set OpnFileDlg = Application.FileDialog(msoFileDialogOpen)
With OpnFileDlg
.ButtonName = "Выбрать"
.AllowMultiSelect = False
.Filters.Add "Файлы Microsoft Word ", "*.dot;*.dotx", 1
.Title = "Выбор шаблона Word-документа для экспорта"
.InitialView = msoFileDialogViewDetails
.Show
End With
SavePath = OpnFileDlg.InitialFileName
' Выбранный шаблон
TemplatePath = OpnFileDlg.SelectedItems(1)
' Создаём приложение Word
Set wdApp = CreateObject("Word.application")
' Здесь логика выборки данных из Excel написана для таблицы с двумя колонками (A, B)
' Первая колонка - ФИО, вторая - ученая степень. Таблица имеет шапку, поэтому начинаем
' выборку со второй строки (counter + 1). Код выборки написан "в лоб" и довольно неграмотный:
' например, задано четкое число строк в цикле (10).
' Правильную выборку надо писать с конкретного примера.
For counter = 1 To 10
' Если не пустая ячейка с именем, то создаем документ на основе выбранного шаблона
' и заполняем поля документа
If IsEmpty(Cells(counter + 1, 1).Value) = False Then
Set wdDoc = wdApp.Documents.Add(TemplatePath)
wdDoc.FormFields(1).Result = Cells(counter + 1, 1)
wdDoc.FormFields(2).Result = Cells(counter + 1, 2)
wdDoc.SaveAs (SavePath + "\" + Cells(counter + 1, 1) + ".doc")
wdDoc.Close
End If
Next counter
' Закрываем Word
wdApp.Quit (False)
End SubПоделиться92010-12-01 22:24:19
Максим, все работает в 2003 и в 2007, отлично!
Была странность в 2007 сначала выдала ошибку и сгенерировала только 3 файла, запнувшись на докторе философии. Это было горько - всем, даже макросу, мешает философия.
А так - задача решена, Максим,
большое спасибо.
Поделиться102010-12-02 00:06:08
Да уж, философия вещь непростая во всех своих проявлениях. Но я думаю макрос задумался над своим поведением и впредь подобных ошибок повторять не будет 
Переходим к след. задаче.
Отредактировано Ничипорчук Максим (2010-12-02 00:08:00)
Поделиться112015-04-28 12:48:05
Добрый день,
У меня сделана привязка к таблице в Word из Excel. Как сохранить шрифт привязок? при сохранении шрифт изменяется(и увеличивается). Мне нужно поставить определенный и приизменений самих данных при сохранении.выходи из документа и при новом открытии, ранее сохраненных шрифт остался. Как это сделать, помогите, пожалуйста?