Пусть есть ворд-документ со следующей строкой:
"Уважаемая Лора Ипполитовна! Просим Вас предоставить следующие данные: Ученое звание, должность, шифр специальности, ученая степень". Пусть также есть 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 Sub
http://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. Как сохранить шрифт привязок? при сохранении шрифт изменяется(и увеличивается). Мне нужно поставить определенный и приизменений самих данных при сохранении.выходи из документа и при новом открытии, ранее сохраненных шрифт остался. Как это сделать, помогите, пожалуйста?