Заполнение шаблона word из доступа

Обновлено: 21.11.2024

У меня есть следующие коды, которые открывают шаблон Word и заполняют его данными
из текущей записи в Access.

Set oApp = CreateObject("Word.Application")
WordTemplate = "D:\Temp\Merge Letter.doc"

С oApp
.Visible = True
.Documents.Add (WordTemplate)

.ActiveDocument.Bookmarks("Учетная запись").Select
.Selection.Text = (CStr(Me.[Account]))
.ActiveDocument.Bookmarks("Acct_Phone").Select
.Selection.Text = (CStr(Me.[Acct_Phone]))
.Активировать
End With

Коды работают хорошо, но теперь возникает другая проблема. В моей форме доступа
некоторые поля пусты, потому что у меня нет определенной информации о клиенте, например.
номер телефона.

Когда я попытался использовать функцию If. тогда. else, я получил сообщение об ошибке
msg "Требуется объект"

.ActiveDocument.Bookmarks("Acct_Phone").Select
Если Me.[Acct_Phone] имеет значение Null Then
.Selection.Text = ""
Еще
.Selection. Text = (CStr(Me.[Acct_Phone]))
Конец, если

Пожалуйста, помогите. Спасибо

Реклама

Альберт Д. Каллал

, вы действительно хотите использовать закладки?

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

Хуже того, каждый раз, когда вам нужен новый шаблон, вам приходится писать новый код.
Можете ли вы представить себе, что каждый раз, когда вам нужна новая буква в слове, вам приходилось
возвращаться к поставщику... и заставлять его изменять код? (если бы мои клиенты обнаружили, что я занимаюсь
этим... они сочли бы это конфликтом интересов).

Если вы используете слова, встроенные в функцию слияния, конечным пользователям, обученным
использованию функции слияния в word, не потребуется повторное обучение. Кроме того, им
никогда не нужно "вводить" имена полей в документ в виде книжных
отметок — пользователи могут использовать "хороший" выпадающий список доступных слияний,
>поля и может вставлять их как стандартные поля слияния.


У меня есть простая система слияния слов, в которой по умолчанию сливается текущая запись формы
. Кроме того, система слияния работает для любой формы, которую вы создаете... и
НЕ требует от вас написания кода для каждого нового документа или формы, которую вы добавляете в свое
приложение. И, поскольку он использует встроенное слияние слов, если поле
пусто. нет проблем.

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

Если вам нужно преобразовать данные Access в форму Word, небольшой VBA может ускорить эту задачу. Сьюзан Харкинс демонстрирует процесс на примере.

Отчеты о доступе представляют собой гибкий и простой в использовании инструмент для обмена данными, но иногда это неправильный инструмент. Например, вы можете обнаружить, что не можете точно воспроизвести существующую бумажную форму в Access, тогда как в Word можете. Теперь вам может быть все равно, как выглядит отчет (бумажная форма), но, возможно, это волнует руководство. В этом случае может потребоваться перенести данные Access в формы Word. Хорошая новость заключается в том, что Word и Access хорошо взаимодействуют друг с другом.

Примечание. Эта информация также доступна для загрузки, включая текстовые файлы, содержащие код VBA из листинга A и листинга B.

Автоматизированное решение требует трех компонентов:

  • Метод идентификации данных Access, которые вы хотите передать
  • Немного кода VBA для автоматизации процесса.
  • Документ Word, представляющий форму, которую нужно заполнить.

Мы будем работать с существующими данными в базе данных "Борей" (образец базы данных, поставляемый с Access). В частности, в примере будут переданы данные из таблицы «Клиенты» через форму в документ Word, показанный на рис. A.

Рисунок A. Выделенные области — это текстовые поля.

Создание формы Word

Форму Word создать не так сложно, как может показаться. Образец формы состоит из пяти простых таблиц, содержащих поля формы. В этом контексте форма – это документ, содержащий заполняемые поля или поля формы, в которые вы вводите информацию. поле – это предопределенная ячейка для ввода и хранения информации.

В форме на рис. A используются пять таблиц с двумя строками для имитации формы. Вам не нужны таблицы, но они помогают организовать данные и управлять ими. Чтобы вставить таблицу, выберите «Вставить» в меню «Таблица», а затем выберите «Таблица». В появившемся диалоговом окне «Вставить таблицу» введите соответствующее количество столбцов и строк (см. рис. B). Для создания этой формы вам понадобятся пять следующих таблиц:

< /tr> < td width="79" valign="top">4
Столбцы Строки
2 2
2 2
1 2
2
2 2

Рисунок B. Определите количество строк и столбцов в каждой таблице.

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

Пример документа Word содержит соответствующее поле для каждого столбца в таблице "Клиенты" Northwind. Вам не нужно размещать каждое поле; передавать только те данные, которые вам нужны. Однако вы должны связать поле Word с каждым базовым полем Access, которое вы хотите скопировать в форму Word. Чтобы добавить первое поле, выполните следующие действия в форме Word:

  1. Отобразите панель инструментов "Формы", выбрав "Панели инструментов" в меню "Вид" и выбрав "Формы".
  2. В документе щелкните ячейку таблицы под заголовком "Номер клиента".
  3. Нажмите кнопку "Текстовое поле формы" на панели инструментов "Формы".
  4. Дважды щелкните поле, чтобы открыть диалоговое окно "Параметры поля текстовой формы".
  5. Переименуйте поле в fldCustomerID и нажмите "ОК".

Повторите шаги со 2 по 5, чтобы добавить текстовое поле для каждого заголовка, используя следующий список, чтобы назвать каждое поле:

< tr> < /tr> < tr>
Заголовок поля Word Имя поля Соответствующее поле в таблице Access
Номер клиента fldCustomerID CustomerID
Клиент имя_компании CompanyName
Контакт fldContactName Контактное имя
Заголовок fldContactTitle ContactTitle
Улица Адрес fldAddress Адрес
Город fldCity Город
Регион fldRegion Регион
Почтовый индекс fldПочтовый индекс Почтовый индекс
Страна fldCountry Страна
Номер телефона fldPhone Телефон
Номер факса fldFax Факс

Заголовок поля не обязательно должен совпадать с названием поля. Однако обратите внимание, что имена полей Word совпадают с именами полей Access с дополнительным префиксом fld. Нет необходимости называть поля Word так же, как соответствующие им поля Access, но это самодокументируется и упрощает вашу работу.

После добавления всех полей нажмите кнопку «Защитить форму». Это отключит ряд функций, которые не позволят случайным пользователям изменить вашу форму. Затем сохраните форму как CustomerSlip.doc и закройте ее.

Идентификация данных доступа

Самый распространенный метод, который вы, вероятно, будете использовать для идентификации конкретной записи, — это форма доступа. В качестве простого примера используйте существующую форму «Клиенты» в «Борей». Если вы не хотите изменять фактический объект, используйте копию или используйте мастер автоформ для создания быстрой формы на основе таблицы «Клиенты». Если у вас есть форма, привязанная к таблице Customers, добавьте в форму командную кнопку и назовите ее cmdPrint, как показано на рисунке C.

Рисунок C. Кнопка команды «Печать квитанции клиента» выполняет код VBA, который передает данные Access в форму Word.

Оставаясь в представлении «Дизайн», нажмите кнопку «Код», чтобы запустить модуль формы. Добавьте в модуль код из листинга А.Событие печати кнопки CMDPrint выполняет всю работу копирования данных для текущего клиента в форме клиентов к документу Word (CombersoneLip.doc).

Листинг A

Частный SubdPrint_Click ()

'' 'Print Customer Slip для текущего клиента.

dim appword как word.Application

dom doc как word.document

'Избегайте ошибки 429, когда слово не открыто.

по ошибке резюме дальше

'Установите переменную объекта appword для выполнения экземпляра Word.

Установите Appword = GetObject (, «Word.Application»)

Если err.Number <> 0, то

'' Если слово не открыто, создайте новый экземпляр слова.

Установите Appword = New Word.Application

Установите doc = appword.documents.Open («C: \ Wordforms \ Combersylip.doc», правда)

Установите doc = ничего

Установите appword = ничего

msgbox Err.Number & ":" & err.description

Как это работает

Во-первых, код создает экземпляр слова. Если Word уже открыто, он использует текущий привод. Текущий код использует выражение ERR.Number <> 0, потому что Microsoft печально известно изменение номеров ошибок из версии для версии. Возможно, вы захотите быть более конкретным путем изменения от 0 до 429 (или соответствующую ошибку для вашей версии, если разные). Далее, метод открытия идентифицирует форму слова (документ). В этом случае это клиентыLip.doc в папке Wordforms на диске C: \. Необязательное настоящее значение открывает файл как только для чтения. Обновите путь для размещения вашей системы. Фактически, вы можете рассмотреть возможность перемещения имена файла и пути к константам в разделе Общие декларации. Таким образом, вы можете легче обновить код, если вы измените имя файла или переместите его.

С блоком копирует данные из каждого поля доступа до соответствующего поля слова. После копирования всех данных, видимых и активированных методов отображения методов, а затем выберите заполненный в форме слова, как показано на рисунке d.

Рисунок d: Форма будет выглядеть так, как все данные копируются и заполнены.

Обработка ошибок минимальна. Обязательно проверьте ваше производственное решение и приспособитесь со всеми возможными ошибками. Наиболее распространенные ошибки, которые вы столкнулись, представляют собой отсутствующий файл Word, неправильный путь или несоответствующие имена поля.

заполнение нескольких форм слов В настоящее время пример работает только с одной записью, текущей записью формы. Иногда вы захотите передать несколько записей. К счастью, не сложно улучшить существующий код для обработки нескольких записей и форм, как показано в листинге b.

Листинг B

Частный SubdPrint_Click ()

'' 'Print Customer Slip для текущего клиента.

dim appword как word.Application

dom doc как word.document

dim RST, как adodb.recordset

'Избегайте ошибки 429, когда слово не открыто.

по ошибке резюме дальше

'Установите переменную объекта appword для выполнения экземпляра Word.

Установите Appword = GetObject (, «Word.Application»)

Если err.Number <> 0, то

'' Если слово не открыто, создайте новый экземпляр слова.

Установите Appword = New Word.Application

'Заполните объект записи.

Установите RST = новый adodb.recordset

RST.Open me.recordsource, currentProject.Connection

'цикл через записи для заполнения полей формы слова.

сделать, пока не RST.EOF

Установите doc = appword.documents.Open («C: \ Wordforms \ Combersylip.doc», правда)

Установите doc = ничего

Установите appword = ничего

msgbox Err.Number & ":" & err.description

вместо того, чтобы извлекать данные из фактической формы (с использованием идентификатора ME), эта процедура использует объект записи для передачи данных из нескольких записей. Обязательно обновите операторы .fieldform, ссылаясь на запись (RST!) Вместо формы доступа (ME!), Поскольку предыдущая процедура сделала.

Наш пример использует свойство записи формы для извлечения данных из основного источника данных формы доступа (таблица клиентов). Следовательно, форма не синхронизируется для процедуры, поэтому текущая запись формы никогда не меняется. Мы просто используем кнопку записи и печати формы, чтобы сохранить пример простой. При применении этой методики в вашу базу данных вы можете использовать любой действительный источник записи.

Обратите внимание, что код имеет два комментариев к концу блока с блоком. Это действия, которые вы можете захотеть взять для каждой формы слова. Первые печатает заполненную форму; Второе сохраняет форму в текущий каталог, используя основное значение основного ключа текущей записи в качестве имени формы. Вы можете использовать либо или оба. Если вы не сохраните текущую запись, WORD сбрасывает его при обработке цикла DO, в то время как следующая запись.

Недостаток - это производительность. Если вы работаете с тысячами записей, этот процесс займет несколько минут для завершения.

ярлык к слову Формы

Заполнение формы слова с данными доступа могут быть полезны, когда ваши данные будут доступны, и вы должны использовать функции форматирования Word для создания справа.К счастью, процесс прост, независимо от того, публикуете ли вы одну запись или тысячи.

Существует множество способов распечатать данные Access, не заходя в VBA. Обычный метод — просто создать отчет из окна базы данных Access. Вы также можете использовать мастер слияния Microsoft Word для печати бланков писем, конвертов, этикеток и каталогов из любой таблицы или запроса Access. В этом нет никакого VBA. Просто научитесь использовать функцию слияния писем Word, и все готово.

Третий подход заключается в создании общего шаблона Word, содержащего закладки (заполнители) для данных, которые будут заполнены позже. Затем используйте VBA в Access, чтобы заменить закладки данными из таблицы Access. Это особенно удобно, когда вы хотите иметь возможность нажать кнопку в форме в Access, чтобы напечатать одно письмо формы Microsoft Word.

Создание шаблона Word

Первым шагом к объединению данных из Access в документ Word является создание шаблона документа Word (файл DOT). Начните с любого пустого документа Word и введите форму письма (или что хотите), как обычно в Word. Вы можете использовать любые функции Word — шрифты, изображения, таблицы, объекты WordArt и т. д.

Везде, где вы хотите, чтобы VBA вставлял данные из таблицы Access, создайте закладку Word. Закладка (в Word) — это просто заполнитель. Закладки обычно скрыты, поэтому, прежде чем добавлять какие-либо закладки в документ, выберите «Инструменты» «Параметры» в строке меню Word. В открывшемся диалоговом окне «Параметры Word» перейдите на вкладку «Вид», выберите «Закладки» и нажмите «ОК».

Вы можете вставлять закладки по своему усмотрению. Вот как я обычно это делаю:

<р>1. Переместите курсор туда, куда вы хотите, чтобы VBA вставила данные из Access.

<р>2. Введите короткое простое название закладки.

Имя не может содержать пробелы и знаки препинания и должно начинаться с буквы.

<р>3. Выберите (дважды щелкните) имя, которое вы только что набрали, а затем нажмите Ctrl+C, чтобы скопировать его.

<р>4. Выберите «Вставить закладку» в строке меню Word.

<р>5. Нажмите Ctrl+V, чтобы вставить введенное имя в качестве имени закладки.

<р>6. Нажмите кнопку "Добавить".

Вам нужно будет выполнить эти действия для каждого элемента данных, которые вы хотите вставить позже с помощью VBA. В примере, показанном на рис. 14.7, я добавляю в документ три закладки. Обратите внимание, что квадратные скобки вокруг имени каждой закладки видны, поскольку включен параметр «Показать закладки». Я не вводил квадратные скобки.

Имена закладок в образце шаблона документа получают данные из Access и VBA следующим образом:

1 TodaysDate: VBA заменит эту закладку текущей датой.

1 AddressLines: VBA заменит эту строку таким количеством строк, которое необходимо для отображения адреса получателя.

1 Приветствие: VBA заменит его именем клиента или просто Sirs, если имя в распечатываемой записи имеет значение Null (пусто).

Когда вы закончите вводить документ и все ваши закладки будут на месте, выполните следующие действия, чтобы сохранить документ как шаблон Word:

<р>1. Выберите FileOSСохранить как в строке меню Word.

<р>2. В разделе «Тип файла» в нижней части диалогового окна «Сохранить как» выберите «Шаблон документа (*.dot)».

<р>3. Используйте раскрывающийся список «Сохранить в», чтобы перейти к папке, в которой вы хотите сохранить шаблон документа.

Лучше всего поместить его в ту же папку, что и файл MDB базы данных, но вы можете использовать любую папку по своему усмотрению — при условии, что вы знаете полный путь к документу. Например, если вы поместите шаблон Word в папку «Общие документы», путь к этому документу будет C:\Documents and Settings\All Users\Documents.

<р>4. Назовите документ (но не меняйте расширение .dot) и нажмите кнопку "Сохранить".

Я называю свой шаблон документа WordFormLetter.dot, но вы можете назвать свой по своему усмотрению.

<р>5. Закройте Microsoft Word.

Итак, документ Word позаботится об этом. Остальные действия выполняются в Access и VBA.

Шаблон документа Word с закладками для последующего принятия данных Access.

Только) - Microsoft Word

Вставка представления редактирования файла

Обычный + Arial I t Arial Narrow

(format lools Table Window Help Введите вопрос для справки tsfflnraii^Elir - © _

- 12 - B I D m m m ■ t= - =E :E it □ - S - A - .

Вставка представления редактирования файла

Обычный + Arial I t Arial Narrow

(format lools Table Window Help Введите вопрос для справки tsfflnraii^Elir - © _

- 12 - B I D m m m ■ t= - =E :E it □ - S - A - .

1234-Arbitrary Highway Randomville, CA 98765

Основная часть каждой позиции в таблице, показанной внутри таблицы "Клиенты".

Письмо начинается здесь и может содержать любой текст, шрифты и изображения, которые вы хотите, скобки выше — это закладка, определенная в этом документе с именем ckets. Access заменит каждую закладку данными из записи в ее

At 1,4" Ln 5 Col 11 PEC TRK EXT OVR Английский (U,5 Q3C

At 1,4" Ln 5 Col 11 PEC TRK EXT OVR Английский (U,5 Q3C

Создание формы доступа

В последующем коде VBA вы увидите, что они обозначаются квадратными скобками — [Имя], [Фамилия], [Компания] и т. д. Элемент управления адресом электронной почты внизу не имеет отношения к обсуждаемой теме. Раскрывающийся список в верхней части элемента управления предоставляет пользователю возможность выбора клиента. Кнопка «Объединить в букву Word» называется MergeBttn.

Создайте форму для одновременного отображения имени и адреса одного клиента.

Создайте форму для одновременного отображения имени и адреса одного клиента.

Чтобы использовать форму, человек выбирает имя в поле со списком «Выбрать клиента», а затем нажимает кнопку «Объединить в букву Word». Эта кнопка выполняет код VBA для открытия шаблона документа, заменяет каждую закладку данными из текущей записи в форме, печатает документ, а затем закрывает Word.

Написание кода слияния

Для этого примера я помещаю код в форму, показанную на рис. 14-8, присоединяя его к событию On Click элемента управления MergeBttn. Код VBA полностью показан в листинге 14-2.

Листинг 14-2. Код слияния

Частная подпрограмма MergeBttn_Click()

'Объявить переменные для хранения строк (текста). Dim AddyLineVar, SalutationVar As String

'Начните создание AddyLineVar, работая с пустыми полями "Фамилия" и "Компания" (разрешено в этой таблице). If IsNull([LastName]) Then AddyLineVar = [Company] 'Просто установите для SalutationVar общее значение "Господа". SalutationVar = "Господа" Else

AddyLineVar = [Имя] + " " + [Фамилия]

'Если компания не пуста, добавьте ее после названия.

Если не IsNull([Компания]), то

AddyLineVar = AddyLineVar + vbCrLf + [Компания] End If

'Приветствием будет имя клиента. SalutationVar = [Имя] End If

'Добавить разрыв строки и адрес

AddyLineVar = AddyLineVar + vbCrLf + [Addressl]

'Если Address2 не равен нулю, добавить разрыв строки и Address2 If Not IsNull([Address2]) Then

AddyLineVar = AddyLineVar + vbCrLf + [Address2] End If

'Нажмите на разрыв строки, затем на город, штат. Почтовый индекс. AddyLineVar = AddyLineVar + vbCrLf + [City] + ", " AddyLineVar = AddyLineVar + [State] + " " + [ZIP]

'Объявить экземпляр Microsoft Word. Dim Wrd As New Word.Application

Установить Wrd = CreateObject("Word.Application")

'Укажите путь и имя к документу Word. Dim MergeDoc как строку

MergeDoc = Application.CurrentProject.Path MergeDoc = MergeDoc + "\WordFormLetter.dot"

'Откройте шаблон документа, сделайте его видимым. Wrd.Documents.Add MergeDoc Wrd.Visible = True

'Заменить каждую закладку текущими данными. С помощью Wrd.ActiveDocument.Bookmarks

.Item("TodaysDate").Range.Text = Date .Item("AddressLines").Range.Text = AddyLineVar .Item("Salutation").Range.Text = SalutationVar End With

'Письмо готово к печати, распечатайте его. 'Wrd.ActiveDocument.PrintOut

'Все готово. Закрыть (сохранять документ не нужно) Wrd.ActiveDocument.Close wdDoNotSaveChanges Wrd.Quit

Конец подписки

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

Частная подпрограмма MergeBttn_Click()

Следующие две строки объявляют две строковые переменные с именами AddyLineVar и SalutationVar. Каждая из этих переменных станет текстовой строкой, которая будет заменена в шаблоне документа вместо закладок AddressLines и Salutation:

'Объявить переменные для хранения строк (текста). Dim AddyLineVar, SalutationVar As String

В таблице Customers, которую я использую для этого примера, поля Addressl, City, State и ZIP code обязательны, но пользователь может оставить поля FirstName, Company и Address2 пустыми (Null). Следующий код создает переменную AddyLineVar по мере необходимости для любой информации, доступной в текущей записи. Первое большое Если. Блок End If, показанный далее, начинается со слов: «Если поле LastName для этой записи пусто, сделайте первую строку AddyLineVar названием компании и сделайте SalutationVar общим заголовком, Sirs:.

'Начните создание AddyLineVar, работая с пустыми полями "Фамилия" и "Компания" (разрешено в этой таблице). If IsNull([LastName]) Then AddyLineVar = [Company] 'Просто установите для SalutationVar общее значение "Господа". ПриветствиеVar = "Господа"

Если поле LastName для этой записи не пустое, следующий код добавляет имя и фамилию клиента в AddyLineVar. Обратите внимание, что vbCrLf — это константа Access VBA для возврата каретки/перевода строки. Каждый vbCrLf в AddyLineVar переводится в конец строки в документе Word.Также обратите внимание, что SalutationVar получает значение из поля FirstName в следующем коде:

AddyLineVar = [Имя] + " " + [Фамилия]

'Если компания не пуста, добавьте ее после названия. Если Not IsNull([Компания]), то

AddyLineVar = AddyLineVar + vbCrLf + [Компания] End If

'Приветствием будет имя клиента. SalutationVar = [Имя] End If

Поскольку поле Addressl является обязательным, вы можете предположить, что оно не пустое. Следующий код добавляет vbCrLf и содержимое поля Addressl в AddyLineVar:

'Добавить CRLF и адрес

AddyLineVar = AddyLineVar + vbCrLf + [Addressl]

Следующее Если. Блок End If добавляет разрыв строки и содержимое поля Address2 в AddyLineVar, но только если поле Address2 не пусто:

'Если Address2 не равен нулю, добавить CRLF и Address2 If Not IsNull([Address2]) Then

AddyLineVar = AddyLineVar + vbCrLf + [Address2] End If

Поскольку поля City, State и ZIP обязательны в таблице Customers, следующие строки кода просто добавляют еще один vbCrLf к AddyLineVar, за которым следует City, запятая и пробел (, ), State, два пробела пробелы, а затем ZIP:

'Нажмите на разрыв строки, затем на город, штат. Почтовый индекс. AddyLineVar = AddyLineVar + vbCrLf + [City] + ", " AddyLineVar = AddyLineVar + [State] + " " + [ZIP]

На этом этапе кода переменные AddyLineVar и SalutationVar содержат данные, которые нужно вставить в форму письма. Теперь вы можете приступить к написанию кода для открытия Word и замены его закладок некоторыми фактическими данными. Во-первых, используйте стандартный синтаксис, описанный ранее в этой главе, для объявления и открытия экземпляра Microsoft Word:

Редактор VBA не примет следующие утверждения, если вы еще не выбрали библиотеку объектов Microsoft Word в диалоговом окне "Ссылки".

'Объявить экземпляр Microsoft Word.

Затемнить слово как новое приложение Word.Application

Установить Wrd = CreateObject("Word.Application")

С этого момента в коде объектная переменная с именем Wrd относится к открытому экземпляру Microsoft Word (и всему его объекту Application, который предоставляет весь Microsoft Word для VBA).

Следующий шаг — открыть шаблон документа, содержащий закладки и текст. Синтаксис открытия документа Word из Access VBA

является objVar .Documents.Add path. objVar должна совпадать с объектной переменной, используемой в операторах Dim и Set (Wrd в этом примере).

Путь должен быть полным путем к документу Word. В моем примере я помещаю документ Word в ту же папку, что и файл базы данных MDB (что облегчает его поиск). В Access вы можете использовать Application. CurrentProject.Path, чтобы получить путь к текущей открытой базе данных. Я называю свой документ Word WordFormLetter.dot. Следующие операторы создают строковую переменную с именем MergeDoc, которая содержит полный путь и имя файла этого шаблона документа Word:

'Укажите путь и имя к документу Word. Dim MergeDoc как строку

MergeDoc = Application.CurrentProject.Path MergeDoc = MergeDoc + "\WordFormLetter.dot"

Если бы WordFormLetter.dot находился в другой папке, я не смог бы использовать Application.CurrentProject.Path для получения пути к нему. Мне пришлось бы указывать путь буквально в коде. Например, в Windows XP, если имя вашей учетной записи пользователя — Bobo, а форма письма — MyFormLetter. точка и хранится в папке "Мои документы", следующий оператор будет работать нормально, если вы введете его в окно кода в виде одной длинной строки.

Wrd.Documents.Add "C:\Documents and Settings\Bobo\My Documents\MyFormLetter.dot"

Когда Word и документ открыты, VBA может ссылаться на документ как objVar .ActiveDocument (где, опять же, objVar соответствует имени объектной переменной, которой в данном примере является Wrd). Объект ActiveDocument, в свою очередь, содержит коллекцию Bookmarks, содержащую список всех закладок в документе.

Следующий оператор начинается с. Блок End With, определяющий коллекцию Bookmarks текущего документа (Wrd.ActiveDocument.Bookmarks) как элемент, к которому будут применены все последующие свойства (вплоть до End With):

'Заменить каждую закладку текущими данными. С помощью Wrd.ActiveDocument.Bookmarks

В пределах с. В блоке End With вы можете ссылаться на любую закладку по имени, используя синтаксис .ItemibookmarkName), где bookmarkName — это имя закладки, определенное в документе Word. Каждая закладка имеет свойство .Range, которое относится ко всему, что содержится в закладке. Свойство .Range, в свою очередь, имеет свойство .Text, которое относится именно к тексту внутри закладки. Таким образом, утверждение

.Item("Addressl_ines").Range.Text = AddyLineVar говорит: "Измените любой текст, который в данный момент находится в закладке с именем AddressLines, на тот, который в данный момент находится в переменной с именем AddyLineVar".

В следующем коде я изменяю закладку TodaysDate на текущую дату, закладку AddressLines на содержимое переменной AddyLineVar и закладку Salutation на то, что находится в названной переменной

Я использую Office 2007, но он не работает. Я вижу, что WINWORD.exe открыт в моем диспетчере задач, но фактический документ Word не запускается.

Кто-нибудь знает, как изменить приведенный выше код, чтобы он работал с Office 2007.

Чтобы код работал, как показано, вы должны поместить его в событие нажатия кнопки в форме клиента Access. Вы это сделали?

Кроме того, убедитесь, что путь к файлу документа Word указан в коде правильно.

Если ответ выше не подходит, поместите в код разрывы кода и выясните, выполняется ли ваш код до точки останова.

Чтобы код работал, как показано, вы должны поместить его в событие нажатия кнопки в форме клиента доступа. Вы это сделали?

Кроме того, убедитесь, что путь к файлу документа Word указан в коде правильно.

Если приведенное выше не является ответом, поместите разрывы кода в код и выясните, выполняется ли ваш код до точки останова.

Код находится под кнопкой, и все в порядке. Файл находится в нужном месте, и весь код выполняется, но этот код был написан для использования в Office 2003 и, похоже, не полностью работает с Office 2007.

Как я уже говорил выше, при выполнении кода процесс WINWORD.exe запускается в диспетчере задач, но сам документ не отображается на переднем плане.

Мне просто интересно, знает ли кто-нибудь, как решить проблему, чтобы код работал с Office 2007.

Спасибо, чувак, сработало. Но теперь он фактически не заполняет значения из доступа.

Спасибо, чувак, сработало. Но теперь он фактически не заполняет значения из доступа.

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

попробуйте переместить строки 26 и 27 (ниже) между строками 13 и 14.

appWord.visible = True
doc.activate

Не понимаю, что вы имеете в виду. Вы заполняли документ до внесения вышеупомянутого изменения? или это никогда не работало??

попробуйте переместить строки 26 и 27 (ниже) между строками 13 и 14.

appWord.visible = True
doc.activate

Ну, документ никогда не появлялся на экране (но теперь появляется после того, как я вставил appWord.visible = True), поэтому я не уверен, заполнял ли он когда-либо данные из Access (но я не уверен, не думаю, что это так).

Документ Word открывается, но поля, которые я хочу заполнить данными из Access, не заполняются. Я попробую ваше предложение, когда вернусь домой с работы.

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

Может быть, вы могли бы попробовать самостоятельно быстро пройти обучение и посмотреть, сработает ли оно на вас?

Хорошо, я попытался переместить строки, как вы рекомендовали, но ничего не вышло. Документ Word открывается, но ни одно из полей, которые у меня есть в документе Word, не заполняются.

Может быть, вы могли бы попробовать сами быстро пройти обучение и посмотреть, сработает ли оно у вас?

Если вы читали последующие посты к руководству, было несколько человек, которые не смогли заставить его работать. Вот ответ Сьюзен Харкинс, создателя руководства

<р>1. Не забудьте сослаться на библиотеку объектов Microsoft Office. Используя VB Editor, выберите «Ссылки» в меню «Инструменты», отметьте библиотеку, закройте диалоговое окно, вернитесь к документу и повторите попытку

<р>2. Прошу прощения за путаницу. Используйте свойство «bookmark», чтобы назвать поля формы. Я думаю, что если вы сделаете это изменение, оно будет работать хорошо для вас. Дайте мне знать.

Свойство закладки — это имя поля формы в Office 2003, но я не вижу этого же свойства в Office 2007.

Когда я добавляю поля формы в свой документ Word, я могу установить их заголовок, но я не уверен, что это их имя, которое я бы использовал в .FormFields("dueDateTem").Result = DateDueToClient.Value.

Я знаю, что к руководству есть комментарий: "Здравствуйте, версия Office 2007 уже доступна? Если да, то где я могу ее найти?"

Поэтому я не думаю, что проблема с Office 2007 возникла только у меня.

Свойство закладки — это имя поля формы в Office 2003, но я не вижу этого свойства в Office 2007.

Когда я добавляю поля формы в свой документ Word, я могу установить их заголовок, но я не уверен, что это их имя, которое я бы использовал в файлах .FormFields("dueDateTem").Результат = DateDueToClient.Value.

Я знаю, что к руководству есть комментарий: "Здравствуйте, версия Office 2007 уже доступна? Если да, то где я могу ее найти?"

Поэтому я не думаю, что проблема с Office 2007 возникла только у меня.

У меня нет Word 2007, но проблема, похоже, в отсутствии документации для Word 2007 в данный период времени. Я смотрел, но не мог найти никакой достоверной информации. Давайте посмотрим, сможем ли мы заставить работать одно поле формы.

Читайте также: