Как разместить текст в шаблоне Word с новой строки, если строка выше, то заполнена, то нет

Ирина

Модератор
Здравствуйте, уважаемые разработчики!
Нужно создать реестр с разъяснениями госорганов.
Итоговый реестр должен выглядеть так:
Исходный реестр.png
В первом столбце обязательно 4 строки:
- 1 строка (Ремарка) – заполняется, если поле "Ремарка" не пустое
- 2 строка (Регион) – заполняется, если поле "Регион" не пустое
- 3 и 4 строки – заполняются всегда (они не могут быть пустыми).

Второй столбец содержит только 1 строку и заполняется она в зависимости от значения поля переключатель.
Т.к. разъяснения выходят не в хронологии по датам, а в хаотичном порядке, для своевременного редактирования реестра с разъяснениями на сайте, добавлено поле переключатель "Сайт", по которому видно, размещено такое разъяснение на сайте или нет.
Все отлично работает.
Шаблон реестр.png
Но как видно на скрине "Шаблон реестра" содержит пустые строки, если у поля "Ремарка" и поля "Регион" нет информации (пустое поле).
При пустом поле "Ремарка" (строка 1) удалять пустую строку не обязательно, т.к. весь текст из столбца вставляется на сайт копированием, поэтому пустая первая строка изначально не входит в область копирования.
Задача со строкой 2, чтобы каждый раз не удалять вручную пустую строку.

Изучив все посты на форуме на данную тематику, так до конца и не поняла, возможно ли разместить текст с новой строки, если строка выше заполнена?
При пустой строке выше (строка 2), пустота убирается и всё заполняется правильно, а при заполненной строке 2 – текст из строки 3 размещен не с новой строки, а в той же строке.

Шаблон - Реестр № 1
В шаблоне прописываю [Регион.Регион][Del(Регион.Регион=?-2)], чтобы удалилось 2 символа справа, если поле "Регион" пустое.
Ничего не удаляется. Экспериментировала с количеством символов (1, 3) - итог аналогичный. Даже пробовала указывать количество символов без минуса, хотя точно знаю, что с минусом это удаление символов справа, а без минуса удаление символов слева. Результат один, как на скрине 2 (Шаблон реестр)

Шаблон - Реестр № 2
В шаблоне прописываю [Регион.Регион][Del(1)], чтобы удалился 1 символа слева, если поле "Регион" пустое.
1 символ (вычислено правильно), т.к. поле "Текст" хоть и с новой строки начинается, но без пробела между полем "Регион".
Там, где поле "Регион" пустое всё получилось идеально.
Если поле "Регион" заполнено, то поле "Текст" объединяется с полем "Регион", а нужно чтобы поле "Текст" было с новой строки при заполненном поле "Регион".
Реестр 2.png
Такое впечатление, решение близко, но пока не дописываю часть формулы. Возможно что-то ещё упускаю или не знаю…. :unsure:

P.S. В основной программе (которая есть у Вас) создан аналогичный шаблон и в Excel. Удобен тем, что через условное форматирование выделяются цветом все строки, которые не добавлены на сайт. Но там проблема, что текст в 1 столбце также един, как в Word (все 4 строки в одной ячейке), а т.к. это 1 ячейка, выделить цветом и "жирностью" определенные поля (слова) нет возможности.
Пробовала разделить текст на 4 столбца. Всё тогда прекрасно выделяется цветом и "жирностью", но при копировании такой текст получается не как единое целое, а как 4 отдельных строки, что абсолютно не подходит для реестра на сайте.
В Word, сформировав шаблон, через функцию "Заменить" можно за пару секунд выделить цветом ячейки, где текст не добавлен на сайт. Затем быстро обновить реестр на сайте, скопировав в нужное место новый текст с готовым форматированием (цветом и "жирностью").
Вот только не получается строку с полем "Текст" разместить с новой строки при заполненном поле "Регион"…
 

Вложения

  • Шаблоны.rbase
    39.9 KB · Просмотры: 5

Vladimir

Администратор
Команда форума
Добрый день, Ирина!
Средствами конструктора сделать задуманное нельзя.
Но эта задача решается через использование макроса в шаблоне MS Word.

Для начала, открыв шаблон на изменение (в Windows 11 в контекстном меню уже нет команды "Правка", поэтому открывать по правой кнопке надо с дополнительно нажатой клавишей SHIFT), надо заменить строки:
Код:
[Ремарка.Ремарка]
[Регион.Регион]
на
Код:
[String(Ремарка.Ремарка=?DELETE:Ремарка.Ремарка)]
[String(Регион.Регион=?DELETE:Регион.Регион)]
Идея в том, что если нужные поля пустые, то вместо них вставить слово DELETE, которое впоследствии будет удалено вместе с символом конца абзаца.

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

Переходите в ленте к вкладке "Вид", и выбираете "Макросы"-"Запись макроса...":
Окно создания макроса.png
В имени макроса надо указать "runa" (макрос, который автоматически выполняется после создания документа на основании шаблона), а значением в параметре "Макрос доступен для" выбрать документ, основанный на текущем шаблоне (в данном случае "Реестр исходный.dotx").
Нажимаем "Ok" и начинается запись.
Открываем окно поиска и замены по комбинации клавиш CTRL-H:
Поиск DELETE.png
В строке поиска "Найти" вводим "DELETE".
Теперь надо добавить специальный символ, который обозначает знак абзаца. Для этого открываем "Больше >>", а в нижней строке нажимаем "Специальный". В открывшемся списке выбираете "Знак абзаца":
Знак абзаца.png
После выбора к строке "DELETE" добавятся два символа: "DELETE^p".
Нажимаете "Заменить все".
Закрываем сообщение о замене 0 записей (если бы не символы конца абзаца, то в документе удалились бы строки "DELETE").
Всё - на этом запись макроса надо остановить: в меню "Макросы" выбираете "Остановить запись", и закрываем окно "Найти и заменить".
Теперь, чтобы проверить, что всё получилось, можно зайти в меню "Макросы"-"Макросы", и нажать "Изменить" на выбранном макросе "runa". В окне макросов должен быть текст вроде этого:
Код:
Sub runa()
'
' runa Макрос
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "DELETE^p"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Окно "Microsoft Visual Basic for Applications - Реестр исходный" можно закрыть.

Теперь шаблон надо сохранить, но не просто, а через "Сохранить как".
Выбираете "Обзор", копируете строку папки, где размещался старый вариант шаблона (это надо, потому что при сохранении нового типа - предложит папку для шаблонов по умолчанию), и выбираете тип файла "Шаблон Word с поддержкой макросов (*.dotm)".
Теперь в адресной строке вставляете скопированный ранее путь, завершив вставку Вводом (оказываетесь в своей папке шаблонов), и можно поменять имя (чтобы в конструкторе при выборе шаблона видеть отличие).
Теперь шаблон можно закрыть (или оставить для дальнейших правок), а в Руне открыть документ на основании нового шаблона:
Результат формирования нового шаблона.png
 

Ирина

Модератор
Маленькое уточнение, которое возможно поможет лучше разобраться с шаблонами Word другим пользователям.
Описанный Владимиром пример используется в шаблонах при формировании реестра всех записей в форме таблицы (столбцах). Функция Del из-за своей специфики в таблицах не работает.
Для удаления пустой строки (но как правильно говорят разработчики, пустого значения) в стандартном текстовом шаблоне Word используется функция Del.
Например, нужно удалить пустое пространство, если в шаблоне отсутствует наименование (заголовок) - [Наименование][Del(Наименование=?2)]
Во вложенном примере использую функцию [Upper(Наименование)][Del(Наименование=?2)]. Она аналогична первой функции, но чтобы в программе не создавать лишнее составное поле для приведения наименования к верхнему регистру, использую такую функцию только в шаблоне.

Шаблон.png
 

Вложения

  • Шаблоны текстовые.rbase
    17.3 KB · Просмотры: 4
Сверху Снизу