Для версии Microsoft Word 2000 в данной статье см.
209227.
Для версии Microsoft Word 97 в данной статье см.
181816.
Для версии Microsoft Word 7.0 в данной статье см.
106388.
Обзор
В данной статье описывается, как хранить и извлекать переменные документа при использовании Microsoft Word.
Дополнительные сведения
Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации и без явных или подразумеваемых гарантий. Это включает, но не ограничиваясь, подразумеваемые гарантии товарной пригодности или пригодности для определенной цели. В данной статье предполагается, что вы знакомы с демонстрируемым языком программирования и средствами, которые используются для создания и отладки. Сотрудники службы поддержки Майкрософт могут объяснить возможности конкретной процедуры, но не выполнять модификации примеров для обеспечения дополнительных функциональных возможностей или создания процедур для определенных требований.
Дополнительные сведения о том, как использовать примеры кода в этой статье щелкните следующий номер статьи базы знаний Майкрософт:
290140 OFFXP: запуск кода примера из статей базы знаний
Задавать и извлекать содержимое строковой переменной в документ или шаблон можно использовать Visual Basic для приложений Microsoft коллекции переменных .
Кроме того можно использовать поле DocVariable для извлечения значения переменной документа после его для отображения в документе Word.
Как задавать и извлекать значения переменной документа
Следующий пример макроса использует свойство переменные для хранения, а затем извлечь значение строковой переменной с именем «FullName» с текущим документом.
Sub GetSetDocVars()Dim fName As String
fName = "Jeff Smith"
' Set contents of variable "fName" in a document using a document
' variable called "FullName".
ActiveDocument.Variables.Add Name:="FullName", Value:=fName
' Retrieve the contents of the document variable.
MsgBox ActiveDocument.Variables("FullName").ValueEnd Sub
Примечание: Если в документе уже задано имя переменной появляется следующее сообщение об ошибке:
Ошибка во время выполнения «5903»: Имя переменной уже существует.
Необходимо удалить имя или просто сбросить значение аргумента.
Удаление переменной документа
Следующий пример макроса использует свойство Variables в первом наборе и получить значение переменной документа и затем удалить переменную из активного документа.
Sub GetSetDeleteDocVars()Dim fName As String
fName = "Jeff Smith"
' Set contents of variable "fName" in a document using a document
' variable called "FullName."
ActiveDocument.Variables.Add Name:="FullName", Value:=fName
' Retrieve the contents of the document variable.
MsgBox ActiveDocument.Variables("FullName").Value
' Delete the variable.
ActiveDocument.Variables("FullName").DeleteEnd Sub
Как извлечь значение переменной документа с помощью поля DocVariable
Следующий пример макроса использует свойство Variables для задания переменной документа. Следующий пример макроса являются действия, чтобы использовать поле DocVariable для извлечения значения в содержимое одного документа.
Sub GetSetDocVars()Dim fName As String
fName = "Jeff Smith"
' Set contents of variable "fName" in a document using a document
' variable called "FullName."
ActiveDocument.Variables.Add Name:="FullName", Value:=fNameEnd Sub
Чтобы использовать поле DocVariable, выполните следующие действия.
-
В меню Вставка щелкните поле.
Примечание. В Microsoft Office Word 2007 выберите в группе текст на вкладке ВставитьЭкспресс-блоки и выберите поле.
-
В списке категории выберите Документ автоматизации.
-
В списке поле выберите DocVariable.
-
В поле Новое имя в разделе свойств полявведите имя переменной документа.
Примечание: Если вы видите Дополнительные свойства поля , а не
Свойства полянажмите кнопку Скрыть коды. -
Нажмите кнопку ОК.
Если необходимо сохранить значение между сеансами работы макроса можно хранить значения, используя любой из следующих методов:
-
Свойство PrivateProfileString используется для хранения значений в файле настройки закрытого.
Дополнительные сведения о свойстве PrivateProfileString в редакторе Visual Basic нажмите кнопку Справки Microsoft Visual Basic в меню Справка выберите Свойство PrivateProfileString введите в поле помощника Office или мастера ответов, а затем Нажмите кнопку Поиск для просмотра раздела.
-
Используйте свойство переменные для хранения значений в документе.
Дополнительные сведения о свойстве переменные в редакторе Visual Basic меню Справка выберите команду Справка по Microsoft Visual Basic , введите Свойство Variables в поле помощника Office или мастера ответов и нажмите кнопку поиска Просмотрите раздел.
-
Использование Visual Basic для приложений операторы Ввода-вывода для записи в текстовый файл (например, написать инструкцию или инструкции Print ).
Дополнительные сведения о записи данных в файлы, в редакторе Visual Basic выберите команду Справка по Microsoft Visual Basic в меню Справка , введите запись данных в файлы в поле помощника Office или мастера ответов и нажмите кнопку поиска Просмотрите раздел.
-
Использование объекта AutoTextEntry для хранения значений в элемент автотекста.
Дополнительные сведения об объекте AutoTextEntry в редакторе Visual Basic меню Справка выберите команду Справка по Microsoft Visual Basic , объектом AutoTextEntry введите в поле помощника Office или мастера ответов и нажмите кнопку поиска для просмотра раздела.
Нужна дополнительная помощь?
-
January 24 2014, 22:06
- IT
- Cancel
Доброго вечера и нескучных выходных почтенным.
Возникла такая проблема: в тексте несколько раз встречается название организации. Как бы сделать так, чтобы заполнив поле один раз в шапке, далее просто указать эту переменную в шаблоне и автоматом получать туда текст из шапки?
Туплю и даже не могу сформулировать запрос в гугл, ибо никогда не работал с офисом в таком качестве
Заранее спасибо.
Я делал так (пользовался формами).
1. MSWord -> RClick на панелях инструментов Ворда -> «Формы» (чтобы отобразить панель инструментов «Формы»)
2. На панели инструментов «Формы» — LClick «Текстовое поле» -> В документе появится текстовое поле (серенькое, если затенение полей формы включено)
3. RClick на появившемся поле в документе -> Свойства
4. В окне «Параменты текстового поля» -> «Параменты поля/Закладка:» вводим, например, «MyTextField1» -> ОК
5. В текстовом поле документа (сереньком) вводим какой-нибудь текст, например, «QWERTY»
6. В ВБА (Alt+F11) -> пишем:
Код: Выделить всё
Sub tt()
MsgBox ThisDocument.FormFields.Item("MyTextField1").Range.Text
End Sub
7. F5 на макросе и видим на экране «QWERTY» ! Или «ЙЦУКЕН», как у меня, что в общем-то тоже радует глаз!
Я, кстати, ещё и защиту документа включал, чтобы «никто » не мог исправить ничего, кроме данных форм…
Пойдёт? Извиняюсь, что так подробно, вдруг всё-таки кто-ньть читать будет
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
ИТ-записки Чорнага кашака
Язык программирования самого высокого уровня содержит всего несколько команд для управления программистами
15 мар. 2010 г.
Использование полей и закладок при работе с MS Word из Delphi
В предыдущей заметке «Поиск и замена текста в документе MS Word из Delphi» я рассказывал, как дорабатывал старый модуль, который генерирует клиентам компании письма в формате MS Word с помощью поиска и замены текста. Сдав модуль заказчикам, я в свободное от работы время, переделал его. Вместо поиска и замены использовал поля с переменными (DocVariable).
В шаблон письма с помощью макроса добавил переменные
Sub AddFields()
ThisDocument.Variables.Add «FIO», «FIO»
ThisDocument.Variables.Add «ADDRESS», «ADDRESS»
.
End Sub
и расставил поля по тексту шаблона. В макросе у метода Add первый параметр – название переменной, а второй – ее значение. Я специально сделал их одинаковыми, чтобы пользователям было проще и нагляднее редактировать шаблоны.
Затем внес изменения в методы модуля работающие с MS Word. Если опустить все детали и различную логику, то упрощенно работа с MS Word выглядит так:
Var
wa: WordApplication;
ovDotName, ovFileName: OleVariant;
i: Integer;
q: TSDQuery;
.
begin
.
wa := CreateComObject(CLASS_WordApplication) as _Application;
ovDotName := ‘какой то шаблон.dot’;
wa.Documents.Add(ovDotName, EmptyParam, EmptyParam, EmptyParam);
For i := 0 to q.FieldCount-1 do
MSWordSetVariable(q.Fields[i].FieldName, q.Fields[i].AsString);
.
ovFileName := ‘письмо любимому клиенту.doc’;
wa.ActiveDocument.SaveAs(ovFileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
.
Вот такая логика у индусов, писавших этот кусок MS Word.
После присвоения значений всем переменным, осталось только дать команду полям обновиться новыми значениями переменных. Для этого в VBA у коллекции объектов полей (Fields) есть метод Update:
А для того, чтобы избежать дальнейшего обновления полей, избавимся от их связи с переменными:
У каждого структурного элемента документа (заметки, колонтитула, сноски и т.д.) своя коллекция объектов полей, поэтому, если документ, как у меня, состоит из разных структурных элементов, то методы Update и Unlink необходимо вызвать для каждого из этих элементов. Для этого перебираем все элементы коллекции StoryRanges.
procedure MSWordUpdateStoryRanges;
Var
StoryRanges: Word2000.StoryRanges;
StoryRange: Word2000.Range;
iStoryIndex: integer;
Begin
StoryRanges := wa.ActiveDocument.StoryRanges;
For iStoryIndex := wdMainTextStory to wdFirstPageFooterStory do
Try
StoryRange := StoryRanges.Item(iStoryIndex);
If StoryRange <> nil then
begin
StoryRange.Fields.Update;
StoryRange.Fields.Unlink;
While (StoryRange.NextStoryRange <> nil) do
begin
StoryRange := StoryRange.NextStoryRange;
StoryRange.Fields.Update;
StoryRange.Fields.Unlink;
end;
end;
Except
StoryRange := nil;
End;
End;
И вызываю ее перед сохранением документа.
Все бы ничего, но часть текста передаваемого из программы в MS Word необходимо было выводить жирным шрифтом. А это через переменные не сделать 🙁 В подобном случае «поиск и замену текста» можно заменить на «переход к закладке и вывод текста». Например, в шаблон вставляем закладку с именем ‘писать текст сюда’, а в программе пишем:
Вот и все 🙂
Раннее связывание и использование полей/закладок дало существенный рост скорости генерации писем. Если на 500-х различных документах этого было почти не заметно, то при генерации 15 000 документов, прирост скорости составил 30% (специально проверил несколько раз на одних и тех же исходных данных).
Оценка статьи:
Загрузка…
Adblock
detector
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
1 |
|
Как лучше вставить значение переменной в текст ворд?15.07.2015, 02:18. Показов 11703. Ответов 13
текстовое поле формы это переменная? то есть будет ли имя этого поля равняться переменной или же его нужно присвоить? Извините за кучу вопросов сразу если кому не трудно подскажите новичку (простейшую форму 3 дня уже пишу весь интернет загуглил в голове каша. неделю назад понятия не имел что такое VBA)
0 |
Sn1p3rOk 286 / 173 / 86 Регистрация: 19.04.2014 Сообщений: 1,095 |
||||||||
15.07.2015, 02:53 |
2 |
|||||||
Сообщение было отмечено VeX как решение Решение
Например Поле textbox1 это тоже самое что переменная textbox1? Нет. textbox1 это контрол TextBox, что бы получить его значение, то есть текст который вы ввели в textBox нужно его считать в переменную. Добавлено через 25 минут
Либо можно упростить и сделать так
Как видите в последнем варианте мы обошлись без переменной
1 |
5561 / 1367 / 150 Регистрация: 08.02.2009 Сообщений: 4,107 Записей в блоге: 30 |
|
15.07.2015, 03:24 |
3 |
Поле textbox1 это тоже самое что переменная textbox1? А можно и так сказать. Например, в моей первой форме даблклик по текстбоксу вызывает мессиджбокс с содержимым того текстбокса (не вдумывайтесь — попробуйте!). Эту форму (не зная что это вообще такое) делал 7 дней, так что… см. вложение. И любопытно было бы узнать — а что вас-то неделю назад подтолкнуло к этому?! Миниатюры
0 |
286 / 173 / 86 Регистрация: 19.04.2014 Сообщений: 1,095 |
|
15.07.2015, 03:39 |
4 |
А можно и так сказать. Нельзя, контрол это не переменная!
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
15.07.2015, 04:05 [ТС] |
5 |
И любопытно было бы узнать — а что вас-то неделю назад подтолкнуло к этому?! Надоело договора каждый раз заполнять. Случайно скачал файл с нета а там было диалоговое окно нажмите тут, выберите здесь. Мне очень захотелось иметь такое же Добавлено через 3 минуты
Selection.TypeText textBox1.Text А это где писать? прямо в тексте?
0 |
286 / 173 / 86 Регистрация: 19.04.2014 Сообщений: 1,095 |
|
15.07.2015, 04:29 |
6 |
А это где писать? прямо в тексте? В VBA в модуле.
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
15.07.2015, 04:33 [ТС] |
7 |
не совсем понял. мне нужно в определенных местах в тексте вставить значения из формы. догадываюсь что это делается при помощи полей функция DOCVARIABLE но я еще не пробовал
0 |
286 / 173 / 86 Регистрация: 19.04.2014 Сообщений: 1,095 |
|
15.07.2015, 04:35 |
8 |
Документ выложите сюда.
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
15.07.2015, 04:42 [ТС] |
9 |
Пока только заготовка
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
15.07.2015, 05:24 [ТС] |
10 |
С Format тоже разобрался (верхний файл формат не верно прописан)
0 |
286 / 173 / 86 Регистрация: 19.04.2014 Сообщений: 1,095 |
|
15.07.2015, 05:38 |
11 |
VeX, и что нужно сделать?
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
15.07.2015, 12:24 [ТС] |
12 |
и что нужно сделать? вообще требуется заполнить договор и данные занести в базу данных при создании нового номера договора. ну а на данном этапе я спрашивал каким способом лучше вставлять данные текстбокса в документ ворд в определенных местах (автоматически не чего не выделяя и никуда не нажимая — только кнопка ОК в форме)
0 |
18 / 19 / 5 Регистрация: 14.09.2015 Сообщений: 104 |
|
17.09.2015, 14:11 |
13 |
Удалось реализовать данную задачу.? Выложите файл…плиззз
0 |
0 / 0 / 0 Регистрация: 04.07.2015 Сообщений: 53 |
|
23.09.2015, 00:45 [ТС] |
14 |
кое-что создано, но не закончено, т.к. появились более первостепенные задачи
0 |