Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2011, 21:06   #1
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию Выпадающий список в Word 2007

Добрый вечер! Скажите, пожалуйста, нужно провернуть такую вот вещь:
выпадающий список, в нем например выбор Петя, Вася

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

Реально?
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 07.02.2011, 00:17   #2
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1) Поместите ваш элемент управления содержимым в закладку (bookmark). B.e. с именем ИМЯ.
2) В тексте вместо "Петя" указывайте поле с именем этой закладки { ИМЯ }
Фигурные скобки здесь элементы поля - вставляются по Ctrl-F9
3) Для обновления всех ссылок в документе после изменения выбора нажмите
CTRL-A (выбор всего текста)
F9 (обновление полей)

Обработка событий этого контрола в полном объёме подразумевает использование VSTO

Но для простого автоматического обновления полей при выходе из контрола можно поступить так:
Добавьте в модуль класса ThisDocument код
Код:
Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
    ActiveDocument.Fields.Update
End Sub
При выходе из любого контрола управления контентом будут обновляться поля активного документа.
(При желании нетрудно добавить дополнительные проверки на то какой контрол вызвал событие)
Я проверил этот код в Word 2010. К сожалению, Word 2007 у меня нет.

Альтернатива: использовать старые поля {FORMDROPDOWN} из Word 2003.
В последнем случае можно указать макрос выполняющий все замены после выбора
элемента. Но документ должен быть защищён.

Иногда бывает проще организовать выбор элемента из списка, запуская свой макрос с помощью поля MACROBUTTON.
(Предполагается что этот макрос отобразит пользовательскую форму со списком для выбора и осуществит дальнейшую обработку)
Так же смотрите:
http://gregmaxey.mvps.org/FormField_...rm_ListBox.htm
http://gregmaxey.mvps.org/ContentCon...ols_Add_In.htm
http://gregmaxey.mvps.org/Modify_CC_...older_Text.htm
Вложения
Тип файла: zip dl.zip (24.4 Кб, 87 просмотров)

Последний раз редактировалось Aent; 07.02.2011 в 01:54.
Aent вне форума Ответить с цитированием
Старый 08.02.2011, 19:49   #3
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Супер! Большое Вам спасибо! Но потребовалось усложнить задачу:
Список - Николай/Вова
Выбираем Николай и он заменят

Николай Иванов сеет хлеб
Николай Иванов пашет

Выбираем Вова и он заменят
Вова унылый полотенчик сеет хлеб
Вова унылый полотенчик пашет

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

Ну или даже вот так:
Выбираем из списка 1 а он вставляет
Николай молодец.
Выбираем 2, тогда заменят Николай молодец на
Николай лох.

Ну Вы поняли. Реально так сделать? Поможете? Пожалуйста. Посмотрите на аватар
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 09.02.2011, 00:14   #4
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Вариант без программирования на VBA:
Вместо поля { ZZZ} в тексте используйте поле IF
{ IF "{ZZZ}" = "Иван" "Иван сеет" "Николай пашет"}
Здесь ZZZ - имя закладки для элемента управления содержимым.
Для выбора более чем из 2-х вариантов используйте вложенные поля IF.
{ IF "{ZZZ}" = "Иван" "Иван сеет" {IF "{ZZZ}" = "Николай" "Николай пашет" "Сергей жнёт"}
Помните, что кавычки в тексте (в том числе и фигурные) в полях надо экранировать с помощью символа "\" : "ООО \"Рога и копыта\""
Aent вне форума Ответить с цитированием
Старый 09.02.2011, 11:35   #5
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Огромное спасибо!
Не совсем понял пару моментов:
1. \ не работает. Вот я например сделал так:
{ IF "{ZZZ}" = "Иван" "Иван \"тупа\"сеет" }
и он мне так и выдал: Иван \"тупа\"сеет, т.е слово тупа в кавычки не выделил. Или я чего-то не понимаю?

2. { IF "{ZZZ}" = "Иван" "Иван сеет" {IF "{ZZZ}" = "Николай" "Николай пашет" "Сергей жнёт"} } - здесь наверное не хватает скобки, да?

И еще момент: у меня идет нумерация абзацев, выглядит это вот так:

Мне надо, что при выборе "1" получилось вот так:

Т.е переносил с сохранением нумерации. Может есть какой-то символ, который переносит текст на новый абзац? Просто если самому это делать выходит вот что:

т.е нумерация для 1 и 2 абзацев пропадает почему-то. Это все из-за {}. Этот момент мне не так прям важен, я могу просто продублировать условие по абзацам, но мало ли есть уже готовое решение?!
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 09.02.2011 в 15:14.
Polotenchik вне форума Ответить с цитированием
Старый 09.02.2011, 13:04   #6
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Еще хотел узнать^
1. можно ли использовать оператор или or:
{ IF "{ZZZ}" = "Иван" or "Николай" "Иван сеет" } Т.е если выбрано Иван или Николай тогда ...

2. Таким же методом можно как-то сделать checkbox?

3. Нашел серьезную проблему: даже вот в Вашем примере если нижу что-нибудь написать то почему-то не работает комбинация Cytl+Z. Из-за чего? Может из-за кода?
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 09.02.2011 в 17:47.
Polotenchik вне форума Ответить с цитированием
Старый 09.02.2011, 23:48   #7
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

1)
Цитата:
\ не работает
Работает. Не понимаете. Кавычка то экранируется. Попробуйте убрать \ перед кавычкой и сравните результат ...
А что сам символ экранировки исчезнет - никто и не обещал Так cоздатели запрограммировали 20 лет назад MS Word...
Я рекомендую делать символ \ размером 1 и цветом подложки.

2)
Цитата:
наверное не хватает скобки
Да, это описка.

3)
Цитата:
можно ли использовать оператор или or
По поводу OR
Вообще, полезно иногда читать HELP:
Цитата:
{ IF Выражение Оператор Выражение2 Текст1 Текст2 }

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

Инструкции
Выражение1, Выражение2
Значения, которые требуется сравнить. Выражение может быть именем закладки (Закладка. Отметка или место в тексте, которому присвоено определенное имя, что позволяет быстро переходить к нему в дальнейшем.), строкой текста, числом, вложенным полем, возвращающим значение, или математической формулой. Если выражение содержит пробелы, оно должно быть заключено в кавычки.

Оператор
Оператор сравнения. Пробелы перед оператором и после него являются обязательными.

Оператор Описание
= Равно
<> Не равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно

Текст1, Текст2
Текст, который вставляется в случае истинности (Текст1) или ложности (Текст2) логического выражения. Если Текст2 не указан, а логическое выражение ложно, не будет вставлено никакого текста. Каждая строка, содержащая несколько слов, должна быть заключена в кавычки.

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

Нумерация также организуется полями.
Добавтьте код для поля SEQ во вставляемый текст.

Настоятельно рекомендую внимательно ознакомься со статьёй
http://msdn.microsoft.com/en-us/libr...ice.10%29.aspx
для первичного понимания вопроса.

Править подставляемый текст в документе нужно после трансформации поля
в плайн текст по Ctrl+Shift+F9

4) С чекбоксом ситуация сложнее.
Но можно, например, в коде обработчика Document_ContentControlOnExit
проверять значения свойств
СontentControl.Tag и ContentControl.Checked.
И устанавливать переменную документа (variable) с именем, совпадающим с тегом элемента управления контентом.
Значение этой переменной можно проверять в поле IF, используя поле DOCVARIABLE.
А можно и сразу вносить изменение в текст документа непосредственно из кода VBA...

Обратите внимание что код обработчика события выполняется после того как вы покинули элемент управления контентом а не в момент изменения значения.

Мне лично, для иммитации чекбокса показалось удобнее использовать поле MACROBUTTON.
Использование элементов управления контентом из WORD 2007-2010 делает документ не мобильным.
При использовании этой технологии в Word 2003 ничего работать не будет. Даже с конвертером.
Поэтому, ещё раз рекомендую почитать про поля и в частности про поле MACROBUTTON.
Например, здесь: http://www.gmayor.com/Macrobutton.htm

Последний раз редактировалось Aent; 10.02.2011 в 01:51.
Aent вне форума Ответить с цитированием
Старый 10.02.2011, 01:37   #8
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Ещё можно использовать ActiveX CheckBox :
Например, {CONTROL Forms.CheckBox.1 /s}
Обработчик
Код:
Private Sub CheckBox1_Click()
....
End Sub
также должен быть размещён в модуле класса ThisDocument
К сожалению, доступ к свойствам ActiveX элементов управления затруднён в
версиях MS Word выше 2003.
Aent вне форума Ответить с цитированием
Старый 10.02.2011, 11:20   #9
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Спасибо большое! Буду разбираться!
Цитата:
3. Нашел серьезную проблему: даже вот в Вашем примере если нижу что-нибудь написать то почему-то не работает комбинация Cytl+Z. Из-за чего? Может из-за кода?
Цитата:
Править подставляемый текст в документе нужно после трансформации поля
в плайн текст по Ctrl+Shift+F9
Вы не совсем поняли или я что-то не понимаю. Вот смотрите, я с помощью выпадающего списка выбрал элемент и в нужном месте заменился текст. Потом я работаю дальше уже с обычным тестом (не с тем, что выдал выпадающий список, а просто сам пишу, т.е мне не надо править подставляемый текст), но стоит нажать Ctrl+Z (ход назад), как курсор перемещается к выпадающему списку и все глючит вплоть до зависания!
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 10.02.2011, 13:08   #10
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

В MS Word 2010 описанного глюка с Ctrl-Z не наблюдаю. 2007 у меня нет.
Aent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выпадающий список tsergey Помощь студентам 2 24.01.2010 15:34
Многоуровневый список и стили в Word 2007 CaptainNemo Microsoft Office Word 12 08.06.2009 23:45
Выпадающий список Акашаев Нурлан Общие вопросы Delphi 3 27.06.2008 16:58
выпадающий список SunKnight БД в Delphi 1 24.03.2008 22:44
выпадающий список Toxa Microsoft Office Excel 2 23.04.2007 09:40