Ошибка переменной документа: не указано слово

Обновлено: 20.11.2024

Нет никаких обещаний, что эта глава будет такого же качества и глубины, как и другие главы этого руководства. Это потому, что она была написана одним автором, не работающим с Microsoft, и не подлежит рецензированию. Вы не найдете эту главу на сайте Microsoft. Комментарии приветствуются.

Вы можете хотя бы просмотреть закладки и части перекрестных ссылок сложных юридических документов, прежде чем приступить к этой главе. (Перекрестные ссылки — это один из типов полей.)

Чему вы научитесь

После завершения этого урока вы сможете:

< /tr> < tr>
Показать коды полей и скрыть их
Используйте функциональные и горячие клавиши для управления полями.
Поиск полей в документе с помощью Find.
Введите поле с клавиатуры и оно заработает.
Скопируйте поле из группы новостей, сообщения электронной почты или книги и заставить его работать.
Знайте и используйте разницу между переключателями MERGEFORMAT и CHARFORMAT.
Вставить поле даты.
Вставить рассчитанную дату полей.
Вставьте номер страницы.
Используйте разные поля нумерации страниц
Вставьте поле вычисления.
Вставить условное (IF) поле.
Вставить имя файла (FILENAME) с путем или без.
Примените переключатели полей, чтобы изменить способ отображения результатов поля на странице.
Вставьте информацию о документе (свойства) в тело документа или верхние и нижние колонтитулы.
Используйте поле StyleRef для копирования информации из основного текста в верхние и нижние колонтитулы.
Используйте поле StyleRef вместо поле перекрестной ссылки.
Знайте, что поле StyleRef не будет работать со скрытым текстом.
Используйте поле ASK, закладки и соответствующие перекрестные ссылки.
Знай, где re, чтобы найти информацию о поле «Дополнительно».
Использовать записи автотекста для вставки полей
Используйте поле MacroButton для простой подсказки пользователя.
Используйте поле MacroButton для запуска записанного вами макроса.
Используйте поле MacroButton для создания документа меню шаблонов.< /td>
Создавайте верхние и нижние колонтитулы в стиле словаря, описывающие содержимое страницы.
Преобразование кодов полей в обычный текст для обсуждения по электронной почте или на интернет-форумах
Использовать несколько Поля последовательности в документе для состязательных бумаг или последовательно пронумерованных заявок
Используйте vba (Visual Basic для приложений — макросы) для вставки вложенное поле
Вставить штрих-коды с помощью g поле

Другие главы, связанные с темами, затронутыми в этом уроке

< /tr> < tr>
Нумерация — поля последовательности
Сложные документы (оглавления, источники, рисунки, сноски, концевые сноски, закладки, перекрестные ссылки)
Разделы — Поля нумерации страниц

Дополнительные письменные (и веб-) ресурсы

"Поле в документе Word — это просто заполнитель, который содержит инструкции о том, что должно быть здесь, а не сам текст".
Джон МакГи
"Объяснение нумерации Word"

Обзор полей

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

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

Как вводить поля в Word

Разграничители полей нельзя вводить с помощью фигурных скобок на клавиатуре.Это специальные символы Word, которые нужно вставлять парой с помощью Ctrl+F9 или Insert => Field. или Вставить => Перекрестная ссылка. или какая-либо другая специальная команда вставки поля. Если вы используете Ctrl+F9, вы можете либо сначала нажать Ctrl+F9, а затем ввести свое поле, либо сначала ввести код поля, выбрать его и нажать Ctrl+F9. Когда вы закончите с полем, нажмите F9, чтобы обновить поле и отобразить результат.

Я называю эти разделители «скобками» на этой и других страницах. Microsoft называет их скобками, но для меня скобки имеют прямые углы и выглядят как [ ], поэтому я буду называть разделители фигурными скобками.

Некоторые компьютеры захватили функциональные клавиши в своем BIOS. На этих компьютерах должна быть клавиша Shift Fn на клавиатуре. Таким образом, вместо Ctrl+F9 вы должны нажать Fn+Ctrl+F9 (или отредактировать BIOS, чтобы функциональные клавиши действовали так, как описано в документации к программам).

Клавиши на Macintosh аналогичны но разные. (Cmd+F9 или Fn+Cmd+F9) См. раздел «Сочетания клавиш для управления полями» ниже.

Как переключить отображение кодов полей в Word

Иногда (редко) вы хотите видеть коды полей, а не текст, сгенерированный полем. Вы можете использовать сочетание клавиш Shift+F9 для отображения кодировки простого поля. Это не обязательно показывает все. В контекстном меню есть соответствующая команда для переключения отображения кода поля. Опять же, это относится только к выбранному полю и не обязательно показывает все поле.

Чтобы увидеть все, вам нужно изменить параметр для отображения кодов полей, а не результатов полей. Это можно установить в параметрах или настройках Word, но проще всего использовать сочетание клавиш Alt + F9. Это переключает все поля в сеансе Word для отображения или скрытия кодов полей.

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

Опять же, для сложных полей вам лучше использовать Alt+F9, а не Shift+F9. Это легко продемонстрировать с помощью сложного поля формы слияния из одного из моих юридических шаблонов.

Поле, отображаемое при нажатии Shift+F9

Поле, открываемое при нажатии Alt+F9

Как видите, Shift+F9 может не показать вам все. Если у вас есть коды полей, отображаемые в документе с помощью сочетания клавиш Alt+F9, они будут напечатаны, а не результаты кодов полей. Это отлично подходит для отладки, но не то, что вам обычно нужно. Вы также можете распечатать их в качестве параметра печати, даже если они не отображаются.

Поля XE (элемент указателя), TC (элемент таблицы содержания) и TA (элемент таблицы авторитетности) являются исключениями. . Эти поля отображаются, когда отображается скрытый текст, и на них не так или иначе влияет переключение отображения кода поля. Сложные документы - Руководство пользователя Microsoft Word среднего уровня - Содержание - Таблица источников - Перекрестные ссылки

На некоторых компьютерах функциональные клавиши захвачены в BIOS. На этих компьютерах должна быть клавиша Shift Fn на клавиатуре. Таким образом, вместо Alt+F9 вы должны нажать Fn+Alt+F9 (или отредактировать BIOS, чтобы функциональные клавиши действовали так, как описано в документации к программам).

Клавиши на Macintosh аналогичны но разные. (Opt+F9 или Fn+Opt+F9) См. раздел «Сочетания клавиш для управления полями» ниже.

Как скопировать поле из группы новостей или сообщения электронной почты в Word:

Если вы используете отображение типизированного поля из группы новостей или сообщения электронной почты, сначала убедитесь, что поле не разбито разрывами строк или абзацев. (Строки, автоматически переносимые Word, подходят, но включите «Показать все», чтобы убедиться, что в конце строки нет специальных символов.) Выделите текст внутри совпадающей пары фигурных скобок и нажмите Ctrl+F9. Word вставит свои разделители полей вокруг текста. Удалите фигурные скобки.

Например, с полем:

= REF "Число1" > * REF "Число2" > >

сначала выберите

ССЫЛКА «Число1»

и нажмите Ctrl+F9, затем выберите

ССЫЛКА «Число2»

и нажмите Ctrl+F9, затем удалите все введенные фигурные скобки и выберите все от знака = до конца второго поля и снова нажмите Ctrl+F9.

Затем нажмите F9, чтобы обновить поле и отобразить результат.

< p>Если вы нажмете Alt+F9 (просмотреть коды полей), вы увидите что-то очень похожее на то, с чего вы начали, за исключением того, что разделители полей выглядят как жирные фигурные скобки, а поле, вероятно, будет затенено. Нажмите Alt+F9 еще раз, чтобы вернуться к просмотру результатов поля.

Вы также можете использовать макрос, найденный на сайте Грэма Мэйора, для преобразования полей в обычный текст или из него.

Подробнее в полях перейдите по ссылкам на странице веб-ресурсов Word. Таблицу сочетаний клавиш для работы с полями см. ниже.

Использование поля вставки. диалоговое окно для вставки полей

Разница между MERGEFORMAT и CHARFORMAT

При написании полей я редко использую какой-либо переключатель, но когда я его использую, это почти всегда переключатель CHARFORMAT. Оба сохраняют форматирование при обновлении поля.

\* MERGEFORMAT

Word по умолчанию вставляет переключатель MERGEFORMAT при вставке большинства полей. Этот переключатель сохраняет любое ручное форматирование, которое вы применяете к полю или части поля. Это редко то, что вы хотите! Если к части поля, это относится к позиции, а не к слову.

Если у вас есть результат поля, который: «пожалуйста, ответьте немедленно», и вы выделяете курсивом «немедленно». Если позже он изменится на «Пожалуйста, ответьте после заседания совета директоров», «после» будет выделено курсивом, поскольку это третье слово в поле. Если результат изменится на «Пожалуйста, позвоните мне после того, как у вас будет возможность изучить это», слово «me» будет выделено курсивом. Этот переключатель не имеет ничего общего с форматированием исходного материала. Так же как и переключатель CHARFORMAT.

\* CHARFORMAT

Переключатель CHARFORMAT позволяет управлять форматированием всего результата поля. Он устанавливает формат таким же, как первый (не пробел) символ самого кода поля. Чтобы использовать его, вы должны отобразить код поля. Какое бы прямое форматирование вы ни применяли к этому первому символу, оно будет использовано для результата поля. Обычно я форматирую все имя поля, а не только первый символ, но это не обязательно.

REF myBookmark \* CharFormat >

MyBookmark = "Hello There!"

Полевой результат: Hello There!

MVP Graham Mayor недавно написал макрос, который я использую . Он отключает вставку MergeFormat по умолчанию, и если вы установите флажок для сохранения форматирования, он спросит вас, хотите ли вы вместо этого использовать переключатель CharFormat. Я очень рекомендую это. Вы можете скачать его с его страницы.

Категории полей (согласно Microsoft)

Дата и время
Автоматизация документов
Информация о документе
Уравнения и формулы [sic]
Указатель и таблицы
Ссылки и ссылки
Нумерация
Информация о пользователе

Поле ДАТА и его разновидности.

Простым способом (но, возможно, неверным способом для того, что вы хотите) поставить дату в документе является Insert => Date или Alt+Shift+D.

< p>Если вы не отметите «Обновлять автоматически», это будет равнозначно вводу даты самостоятельно. Если вы установите флажок «Обновлять автоматически», он будет обновляться при печати (если у вас есть настройка в параметрах принтера как «Обновить поля», которая используется по умолчанию). Вы можете принудительно обновить вручную, поместив точку вставки в дату и нажав клавишу [ F9].

Если вы хотите поместить дату в шаблон, который обновляется до текущей даты при создании документа на основе шаблона или хотите изменить формат или выполнить другие действия с полем даты, вместо этого вы хотите использовать Вставка => Поле => Дата и время. Используя параметры здесь, вы можете либо выбрать формат, либо ввести свои собственные символы (называемые изображением) для формата. Варианты типа даты включают:

DATE > — Дата, на которую вы смотрите документ. Всегда сегодня (хотя это может не отображаться на экране как сегодня, пока вы не обновите поле).
CREATEDATE> — дата создания документ был создан (или сохранен с помощью команды «Сохранить как»).
PRINTDATE > — Дата последней печати документа.
SAVEDATE > — Дата последнего сохранения документа.

Выше приведены коды полей, которые будут вставлены для вас с помощью Insert => Field => Date and Time без использования каких-либо опций. Переключатель «\*MERGEFORMAT» автоматически вставляется, если вы отметите «сохранять формат поля» и означает, что поле должно быть отформатировано так же, как и поле. Как правило, вы не хотите установить этот флажок или добавить этот переключатель. Если вам нужен один из этих переключателей форматирования, вам, вероятно, понадобится «\*CHARFORMAT». Этот переключатель форматирует результат поля, однако форматируется первый непустой символ в поле. Как и во всех полях, вы должны позволить Word вставить фигурные скобки-разделители полей, вы не можете просто напечатать их. См. вводный материал на этой странице.

Если вы выберете варианты, они могут включать следующие «картинки»:

Я создал шаблон с несколькими пользовательскими формами и многочисленными документируемыми
полями в документе, соответствующими текстовым полям в пользовательских формах. Когда я
создаю новый документ на основе этого шаблона, появляется сообщение "Ошибка! Документ не указан
переменная." сообщение появляется сразу после создания документа
(до ввода каких-либо данных в пользовательские формы). Как предотвратить появление этого
сообщения об ошибке в каждом поле Docvariable в документе
до завершения пользовательских форм?

Реклама

Откройте шаблон и запустите макрос, содержащий следующий код, а затем
сохраните и закройте шаблон

Размерьте i As Long
С помощью ActiveDocument
For i = 1 To .Variables.Count
.Variables(i).Value = " "
Следующий i
Конец с

--
Надеюсь, это поможет.

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

Диккенс1228

К сожалению, ваше предложение не сработало.

Когда я навожу курсор на "i" в макросе, он говорит "i = 4", что,
я думаю, означает, что он не считает мои поля DOCVARIABLE (я думаю, что он только
подсчитывает поля USERNAME, USERADDRESS, USERINITIALS и CREATEDATE,
поскольку они являются единственными другими полями в документе помимо полей
DOCVARIABLE). Кроме того, когда я помещаю курсор на
".Variables.Count" в макросе, он говорит: ".Variables.Count = ".

Я использую Word 2007 и сохраняю шаблон как шаблон Word 97-2003.
Странно то, что я создал сокращенную «тестовую» версию шаблона,
используя ту же методологию, и сообщение «Ошибка! Не указана переменная документа»
НЕ появляется при создании новый документ на основе тестового
шаблона, и я не вижу никакой разницы в том, как эти два документа
закодированы.

Я действительно новичок в этом, поэтому я уверен, что делаю что-то очень глупое. Однако
шаблон прекрасно работает, если текстовые поля не оставлены
пустыми.

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

Я хочу написать код, который опрашивает некоторые поля данных слияния
и принимает решения о содержании выходного документа. Например, я хочу выполнить оператор
switch|case для содержимого поля «Модель», где содержимое поля =
«1» помещает «Модель A» в документ, а «2» помещает «Модель Blue». " в док. Я не могу
напрямую отправить (в поля слияния) информацию, которую мне нужно добавить в
окончательный документ. Вот почему код switch|case.

Еще немного информации (тогда я обещаю задать свой вопрос ;)
Макрос слияния mfg использует "ActiveDocument.MailMerge.Destination =
wdSendToNewDocument" для отправки выходного документа слияния в новый файл. .

Итак, мои вопросы.
1) Хочу ли я скопировать все данные поля слияния в DocVariables, прежде чем писать
код для интерпретации содержимого DocVariables, или мне нужно написать код
непосредственно интерпретировать поля данных слияния?

2) В чем разница между полями данных слияния и переменными документа? Оба файла
сохраняются одинаково, просто доступ к ним осуществляется по-разному? Извините, если это
вопрос новичка.

3) Как скопировать данные поля слияния в DocVariables (при условии, что это то, что
я хочу сделать)? Не могли бы вы указать мне правильное направление.

4) Как сделать любой из этих наборов переменных (объединенных полей данных или
переменных документов) доступным в новом документе, созданном с помощью кода
"ActiveDocument.MailMerge.Destination = wdSendToNewDocument"? Это
то, что пугает меня больше всего. После завершения слияния, как мне
указать, что "wdSendToNewDocument" будет тем, который получает мои DocVariables?

5) Наконец, есть ли хороший веб-сайт VBA MailMerge, который вы могли бы порекомендовать,
который дал бы мне некоторую информацию для чтения?

Большое спасибо за помощь.

Синди Мейстер -WordMVP-

> 1) Нужно ли мне копировать все данные поля слияния в DocVariables, прежде чем я напишу
> код для интерпретации содержимого DocVariables, или мне нужно написать код
> для интерпретации слияния? поля данных напрямую?
>

Сколько записей вы объединяете, и будет ли этот параметр одинаковым для каждой
записи? На самом деле, если у вас нет Word 2002, все, что вы хотите сделать в этом
направлении, потерпит неудачу, если вам нужно объединить более одной записи.

> 2) В чем разница между Merge Data Fields и DocVariables? Сохраняются ли
> они оба одинаково, просто доступ к ним осуществляется по-разному? Извините, если это
> вопрос новичка.
>

У меня такое чувство, что вы не совсем понимаете, что такое слияние почты и
для чего оно предназначено. Поля слияния берут информацию из
связанного источника данных, который (обычно) содержит несколько записей.Почтовое
слияние затем *выполняется* на принтер или в новый файл, создавая копию
основного документа слияния с информацией о полях каждой записи, вставляемой туда, где было
поле слияния.< /p>

Документ VARIABLE может хранить только одну часть информации, и вы должны
поместить ее туда (без автоматической ссылки на источник данных).

> 3) Как мне скопировать данные поля слияния в DocVariables (при условии, что это то, что
> я хочу сделать)? Если бы вы могли просто указать мне в правильном направлении.
>

Я не думаю, что это то, что вы хотите сделать. Но вы можете получить его через свойство
MailMerge.DataSource.DataFields(index).Value в сочетании со свойством
ActiveRecord.

> 4) Как сделать любой из этих наборов переменных (поля данных слияния или
> DocVariables) доступным в новом документе, созданном кодом
> "ActiveDocument.MailMerge.Destination = wdSendToNewDocument" ? Это
> меня больше всего пугает. После завершения слияния, как мне
> указать "wdSendToNewDocument" как тот, который получает мои DocVariables?
>

Ну, результирующий документ должен содержать точно такие же переменные doc в
основном документе слияния на момент слияния. Но поля слияния
исчезнут.

> 5) Наконец, есть ли хороший веб-сайт VBA MailMerge, который вы могли бы порекомендовать,
> который дал бы мне некоторую информацию для чтения?
>

Как я уже говорил, я не совсем уверен, что слияние почты — это то, что вам нужно. В
последней из этих трех статей обсуждается передача данных в Word без использования
слияния почты, и она может дать вам несколько дополнительных идей.

Этот ответ опубликован в группе новостей; пожалуйста, размещайте любые последующие вопросы или
ответы в группе новостей, а не по электронной почте :-)

Роберт Грей

Большое спасибо за то, что нашли время и силы, чтобы ответить. Я понимаю
и ценю то, к чему вы пытаетесь меня привести. Но я действительно знаю, что
я пытаюсь сделать. Пожалуйста, позвольте мне дать вам более подробную информацию, чтобы пояснить, что я
пытаюсь выполнить.

Я работаю с коммерчески доступной
системой управления делами юридической конторы. Он позволяет мне выбрать запись обращения или клиента и
отправить данные из этой записи в шаблон слияния почты Word. При определенных
обстоятельствах это может быть более одной записи данных, но обычно (и
особенно в моем случае) это одна запись. Это означает, что проблема с
активной записью данных при слиянии почты с несколькими записями не является проблемой.

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

Позвольте мне привести два примера, которые иллюстрируют, почему я хочу расширить это
кодом VBA, а не полагаться на встроенные возможности слияния:

Поле "Суд" записи дела содержит только 25 символов. Хорошим
примером названия суда, которое должно быть указано в документе, является "СОЕДИНЕННЫЕ ШТАТЫ
ВОСЬМОЙ ОКРУГ АПЕЛЛЯЦИОННОГО СУДА ВОСТОЧНОГО ОТДЕЛЕНИЯ" (намного больше 25
символов). Поле "Суд" позволяет выбирать суды из поля со списком, поэтому я
сокращаю названия. В данном случае «8-й округ обращается с апелляцией на восток». Я
использовал вложенные условные операторы в своем шаблоне слияния, чтобы поместить длинное
описание суда в документ при переносе
соответствующей аббревиатуры. Это работает, но встроенные вложенные условные операторы в Word становятся
все более сложными и трудными в обслуживании по мере того, как вы получаете 20–25 названий судов в
документе. Я бы предпочел иметь доступ к данным поля слияния в макросе
VBA, чтобы я мог написать читаемый отформатированный код для выполнения такого типа
подстановки.

Я предпочел бы написать такой фрагмент кода:

Switch Case Court ' Court — это либо значение поля данных слияния, либо
DocVariable, которую я скопировал из значения данных поля данных слияния в
Case "8th Circuit Appeals Eastern"
Court < br />Дело "Верховный суд США"
Суд = "ВЕРХОВНЫЙ СУД СОЕДИНЕННЫХ ШТАТОВ"
Дело и т.д.

Если "Court" является DocVariable, я могу поместить в свой
документ поле DocVariable, которое ссылается на "Court", и когда я обновлю историю, появится мое длинное
описание названия суда. Я по-прежнему могу использовать простые почтовые
поля слияния для полей данных слияния, которые не требуют преобразования (например,
номер социального страхования, дата происшествия и т. д.).

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

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ActiveDocument.MailMerge.OpenDataSource Name:=DataName$, _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate: ="", _
WritePasswordDocument:="", WritePasswordTemplate:="", Возврат:=False, _
Формат:=wdOpenFormatAuto

При ошибке Перейти к 0

' Выполнить фактическое слияние
ActiveDocument.MailMerge.Destination = wdSendToNewDocument ' ========[
создает новый документ ]========
ActiveDocument.MailMerge.Execute

' Сохранить новый документ как OutputName
ActiveDocument.SaveAs FileName:=outputName$, FileFormat:=wdFormatDocument '
====[ сохраняет документ ]======< /p>

' Переключиться на файл формы и закрыть его (без сохранения)
Documents(FormName$).Activate
ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges '=====[ закрывает
объединить шаблон ]======

' Активировать выходной файл слияния
При ошибке Возобновить следующий
Документы(outputName$).Активировать '=======[ переключается на новый
документ ]=== ===

При ошибке Перейти к 0

WordBasic.MsgBox "Объединение завершено.", "Объединение завершено", 64

Самое главное, будут ли значения полей файла данных слияния по-прежнему доступны
во вновь созданном активном документе, когда мой код макроса начнет выполняться?
Значение будет иметь строка кода, которую вы предоставили
"MailMerge .DataSource.DataFields(index).Value" по-прежнему позволяет мне видеть и работать
с данными слияния, даже если документ шаблона слияния закрыт? Итак,
наследует ли выходной документ структуру данных слияния и значения из
документа шаблона слияния?

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

Наследует ли выходной документ какие-либо DocVariables и их значения из документа
шаблона слияния?

Можно ли программно работать непосредственно со значениями данных слияния в
"MailMerge.DataSource.DataFields(index).Value" или мне нужно сначала скопировать их в
DocVariables?

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

Спасибо за сайты. Я тоже посмотрю на них.

Еще раз спасибо за помощь!

"Синди Мейстер -WordMVP-" написала в сообщении
news:VA.00004cf8.0124c39e@bob.

Информация, иллюстрации и код, содержащиеся в моих "Советах по Microsoft Word", предоставляются бесплатно и без каких-либо рисков или обязательств.

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

Если вы хотите сделать пожертвование, используйте соответствующую кнопку пожертвования для доступа к PayPal. Спасибо!

На этой странице "Советы по Microsoft Word и справка по Microsoft Word" представлено основное введение в обработку ошибок и приведены некоторые примеры методов обработки ошибок. Более подробное обсуждение этого материала можно найти в файле справки VBA в разделах «Об отчете об ошибке» и «Выводе отчета».

Зачем использовать обработку ошибок? Справка VBA говорит об этом так:

"Если вы не используете и Заявление об ошибке, любая
ошибка во время выполнения является фатальной, то есть
отображается сообщение об ошибке и выполнение останавливается."

Что такое ошибка времени выполнения? Ошибка времени выполнения — это ошибка, возникающая при выполнении кода. Ошибка времени выполнения возникает, когда оператор кода пытается выполнить недопустимую операцию. Есть много недопустимых операций. Список вещей, которые могут вызвать ошибку во время выполнения, см. в разделе «Отслеживаемые ошибки» в справке VBA.

Используя следующие примеры макросов, вы можете создавать некоторые довольно очевидные ошибки во время выполнения, а затем использовать операторы On Error и Resume, чтобы проиллюстрировать некоторые методы обработки ошибок. Чтобы использовать эти примеры, начните с нового пустого документа и скопируйте примеры макросов в проект документа VBA. Или скачайте демонстрационный файл по ссылке в конце этой страницы.

См. раздел Установка макросов для получения инструкций по настройке и использованию макросов, представленных на этой странице справки Microsoft Word и советов по Microsoft Word.

После того как вы скопировали макросы в проект документа VBA, пройдитесь по строкам кода, используя клавишу F8 или команду "Step Into" панели инструментов отладки vB Editor, и наблюдайте за результатами.

В примере 1 (Sub BasicA) оператор обработчика ошибок отсутствует. Процедура создает переменную с именем «Test2», а затем запускает For . Следующий цикл для удаления переменных с именами «Test1, Test2 и Test3».

Пошагово выполните процедуру. Вы увидите, что когда процедура пытается удалить переменную «Test1» (объект, который не существует), эта попытка является «недопустимой операцией» и генерируется ошибка времени выполнения. Полученное изображение показано ниже:

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

В примере 2 (Sub BasicB) оператор "Возобновить дальше при ошибке":

  • Включает обработчик ошибок в процедуре
  • Позволяет продолжить выполнение со "следующего" оператора, следующего сразу за оператором, вызвавшим ошибку.
  • Сообщения об ошибках во время выполнения и последующие фатальные остановки приостанавливаются, пока включен обработчик ошибок.

Выполните эту процедуру, чтобы убедиться, что ожидаемые ошибки (попытки удалить Varialbles1 и Variable3) обрабатываются простым продолжением процедуры до ее завершения.

В предыдущем примере инструкция On Error Resume Next работала, как и предполагалось, без осложнений. Однако, как вы видели, On Error Resume Next включает обработчик ошибок и приостанавливает обмен сообщениями об ошибках во время выполнения и последующие фатальные остановки. Поэтому не рекомендуется использовать функцию «Возобновить дальше при ошибке» отдельно, если в процедуре могут возникнуть дополнительные ошибки.

Третий пример (Sub BasicC) поможет вам понять, почему необходимо соблюдать осторожность при использовании оператора On Error Resume Next.

  • Снова оператор On Error Resume Next включает обработчик ошибок процедур, когда процедура пытается удалить несуществующую переменную Test1. Обмен сообщениями во время выполнения и фатальная остановка приостановлены.
  • Далее удаляется переменная Test2. Вам наверняка будет интересно получить это причудливое сообщение о миллионе долларов.
  • Однако попытка отобразить это сообщение завершится неудачно, так как для сообщения требуется результат от удаленной переменной Test2.
  • К сожалению, поскольку обработчик ошибок процедур ранее был включен, обмен сообщениями во время выполнения и фатальные остановки приостановлены.
  • Неудачная попытка доставить сообщение проходит бесшумно!

Добавив простой оператор в свою процедуру, вы можете очистить объект err и, таким образом, сбросить обработчик ошибок, который так опрометчиво был оставлен без изменений.

При выполнении примера 4 (Sub BasicD) вы столкнетесь с ошибкой времени выполнения и неустранимой остановкой, когда процедура попытается отобразить сообщение о вашей неожиданной удаче. Добавленный оператор On Error GoTo 0 очищал объект err и сбрасывал обработчик ошибок, поэтому были восстановлены сообщения об ошибках во время выполнения по умолчанию и фатальная остановка.

Вы должны взять за правило использовать в своих процедурах команду On Error GoTo 0, как только завершится ожидаемая стадия ошибки, следующая за оператором On Error Resume Next. Это гарантирует, что другие несвязанные ошибки не будут пропущены или неправильно обработаны.

Конечно, вы не хотите видеть это резкое новое сообщение об ошибке, отображаемое в Sub BasicD(). Вы просто хотите, чтобы это правильно обработали за кулисами, и вы хотите получить важное сообщение.

Пройдите пример 5 (Sub BasicE). Здесь оператор On Error GoTo err_BasicE:

  • Включает обработчик ошибок и направляет выполнение на строку err_BasicE:
  • Ошибка оценивается, и если ошибка 5825 или "Объект был удален", как и ожидалось, доставляется важное сообщение.
  • Выполнение возвращается к следующей строке, следующей за строкой, вызвавшей ошибку.

Примечание. Метка строки "err_BasicE:" произвольна. Если можно назвать как угодно, чтобы сделать чтение вашего кода удобным.Важно то, что метка должна быть уникальной для проекта и заканчиваться двоеточием (:). Вы должны поместить оператор Exit Sub над меткой строки, чтобы процедура обработки ошибок была пропущена, когда ошибка не возникает.

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

  • Ошибка генерируется при установлении знаменателя в простом вычислении равным нулю. Деление на ноль нелогично.
  • При возникновении ошибки включается обработчик ошибок и оценивается ошибка.
  • Процедура обработки ошибок предоставляет поле ввода, в котором пользователь может ввести ненулевой знаменатель.
  • С новым знаменателем, оператор "Возобновить" возвращает выполнение к шагу процедуры, вызвавшему ошибку.
  • Если пользователь ввел в поле ввода ненулевое значение, процедура выполняется до завершения.

Для людей слово "ошибка" означает "плохой" и "ошибка"; у компьютера таких предубеждений нет: ошибка - это просто условие, такое же, как "нет ошибки".

–Обычный участник группы новостей Word "Иезавель"

Err — это объект со свойствами и методами. Использование объекта err часто полезно для упрощения или ускорения вашего кода.

Рассмотрите задачу определения, существует ли определенный стиль в документе. См. примеры 7 и 8 (ErrorFree) и (UsingErrorHandling).

В Sub ErrorFree() маловероятно появление ошибки в выражении "Для каждого". Переменная "oStyle" была правильно объявлена, ".Styles" является допустимым свойством объекта документа, а ".Name" является допустимым свойством объекта стиля. Процедура будет выполняться до конца, перебирая в цикле каждый стиль, пока не встретит именованный стиль или пока не пройдет в цикле все стили в коллекции.

  • Процедура устанавливает для переменной oStyle значение Nothing.
  • Инструкция On Error Resume Next приостанавливает обмен сообщениями во время выполнения.
  • Процедура пытается установить для объектной переменной oStyle стиль с именем Goobledygook. Это вызовет ошибку, если стиль с таким названием не существует.
  • Инструкция On Error GoTo 0 сбрасывает обработку ошибок и восстанавливает обмен сообщениями во время выполнения.
  • Если произойдет ошибка, вы не узнаете об этом, но oStyle по-прежнему будет пустым.
  • Процедура оценивает состояние oStyle, возвращает результат и выполняется до завершения.

Используя обработку ошибок таким образом, вы можете устранить циклы и быстро определить, существует ли именованный объект в коллекции, независимо от того, является ли он первым или последним в миллиарде!!

Помните: «Err» — это объект с методами и свойствами.

Все операторы "On Error" и "Resume" очищают объект Err. Убедитесь в этом сами, выполняя код в примере 9 (Sub BasicG).

Обработчик ошибок не обязательно должен находиться в процедуре, вызвавшей ошибку. Это продемонстрировано с помощью трех процедур, содержащихся в примере 10. Пройдитесь по коду, начинающемуся с Sub A(), и обратите внимание, что возникновение ошибки в Sub C() обрабатывается обработчиком ошибок в Sub A()

Вы можете использовать объект err для создания собственных ошибок со всеми свойствами объекта. Пройдите пример 11, начиная с Sub Main(). Здесь процедура просит пользователя открыть файл Word. Обратите внимание, как обработчик ошибок выдает пользовательские ошибки, связанные с несогласованными действиями пользователя.

Хотите ли вы оплатить консультационную работу или сделать пожертвование для поддержки этого сайта?

PayPal — это безопасный и простой способ оплаты в Интернете.

Используйте кнопку "Пожертвовать" в соответствующей валюте, чтобы сделать платеж или пожертвование.

VBAX Mentor Присоединился к нам в марте 2005 г. Сообщений 470 Местоположение

Решено: Ошибка: не задана переменная объекта или переменная блока

Я получаю сообщение об ошибке, но не могу понять, в чем ее причина. Кто-нибудь может помочь?

У меня есть следующие глобальные переменные, настроенные в модуле под названием «Переменные»:

[vba]Option Explicit
' Объявить переменные для использования более чем в одной процедуре
Public strClientName As String
Public strBCName As String
Public strOldFilename1 As String
Public strOldFilename1 As String
>Public strOldFilename2 As String
Public strNewFilename_Short1 As String
Public strNewFilename_Short2 As String
Public strNewFilename_Short3 As String
Public strLocation As String
Public strVersion As String
Public objWord As Word.Application
Общедоступный objDoc As Word.Document[/vba]

Я запускаю пользовательскую форму (frmQMCSO), которая имеет следующий код в кнопке OK:

[vba]Private Sub cmdOK_Click()
При ошибке GoTo errhandle
' Скрыть форму, пока она не будет выполнена
frmQMCSO.Hide
' Отключить обновление экрана
Приложение .ScreenUpdating = False
Если opt3x.Value = True, то strVersion = "3x4x"
Если opt4x.Value = True, то strVersion = "4x"
strClientName = txtCompanyName.Value
strBCName = txtBCName.Value
strLocation = txtLocation.Value
' Обновление одного документа за раз
' Для каждого документа в документах
Для каждого objDoc в Application.Documents
objDoc .Активировать

' Убедитесь, что документ разблокирован,
If ActiveDocument.ProtectionType = wdAllowOnlyFormFields Then
ActiveDocument.Unprotect
End If
' Удалить отмеченные закладкой инструкции,
If ActiveDocument.Bookmarks. Exists("Instructions") = True Then
ActiveDocument.Bookmarks("Instructions").Select
Selection.Delete
End If
' Заменить переменные текстом пользователя
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
С Selection.Find
.Text = "Центр преимуществ [Premier Company]"
.Replacement.Text = strBCName < br />.Forward = True
.Wrap = wdFindContinue
Завершить
Selection.Find.Execute Replace:=wdReplaceAll
С Selection.Find
.Text = " [Premier Company]"
.Replacement.Text = strClientName
.Forward = True
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
' Удалить QM и версию из имени скрытого текстового файла
Selection.Find.Cl
Выделение.Найти.Замена.ОчиститьФорматирование
С выделением.Найти
.Text = "QM "
.Font.Hidden = True
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindContinue
.Format = True
Завершить
Selection.Find.Execute Replace:=wdReplaceAll
With Selection .Find
.Text = "(3x4x)"
.Font.Hidden = True
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
Закончить с
Selection.Find.Execute Replace:=wdReplaceAll
С Selection.Find
.Text = "(4x)"
.Font.Hidden = True
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = True
End With < br />Selection.Find.Execute Replace:=wdReplaceAll

' Присвоить значения переменным
strOldFilename1 = ActiveDocument.Name
If strVersion = "3x4x" Then
' Взять старое имя файла минус 11 последних символов (что будет ' (3x4x).dot ')
strNewFilename_Short1 = Left(strOldFilename1, Len(strOldFilename1) - 11)
' Взять исправленное имя файла минус первые 3 символа (что будет 'QM')
strNewFilename_Short2 = Right(strNewFilename_Short1, Len (strNewFilename_Short1) - 3)
ElseIf strVersion = "4x" Then
' Взять старое имя файла минус последние 9 символов (что будет ' (4x).dot')
strNewFilename_Short1 = Left(strOldFilename1 , Len(strOldFilename1) - 9)
' Взять исправленное имя файла минус первые 3 символа (которые будут 'QM')
strNewFilename_Short2 = Right(strNewFilename_Short1, Len(strNewFilename_Short1) - 3)
End Если
' Добавьте обратную косую черту к местоположению, чтобы получить новый файл в правильной папке
strLocation = strLocation & "\"
' Сохранить под исправленным именем файла
ActiveDocument.SaveAs FileName:=str Location & strNewFilename_Short2 _
, FileFormat:=wdFormatTemplate, LockComments:=False, Password:="", _
AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
:=False, SaveAsAOCELetter:=False

' Присвоить значения переменным
strOldFilename2 = ActiveDocument.Name
' Взять старое имя файла минус последние 4 символа (это будет '.dot')
strNewFilename_Short3 = Left(strOldFilename2, Len( strOldFilename2) - 4)
' Сбросить имя файла в свойствах
с помощью ActiveDocument
.BuiltInDocumentProperties(wdPropertyTitle) = strNewFilename_Short3
End With
' Убрать все выделение в документе
>Затемнить StoryRange как диапазон
Для каждого StoryRange в ActiveDocument.StoryRanges
StoryRange.HighlightColorIndex = wdNoHighlight
Следующий StoryRange

' Заблокировать документ, чтобы пользователь мог перемещаться по полям с вкладками
ActiveDocument.Protect Type:=wdAllowOnlyFormFields
' Сохранить и закрыть новый файл
ActiveDocument.Close savechanges:=wdSaveChanges
' Обновить следующий активный документ
Следующий объектный документ
' Выгрузить формы по завершении
Выгрузить frmQMCSO
End Sub
[/vba]

Когда я запускаю пользовательскую форму, я получаю сообщение об ошибке "Переменная объекта или переменная блока не установлена". Что я делаю не так??

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