1

Тема: Поиск и замена текста в значениях полей

Создал оглавление с номерами страниц и заполнителем "...". Необходимо в этом содержании удалить номера страниц, но заполнитель табуляции оставить. Страницы проставляются вручную перед сдачей работы в архив. Делается это в пояснительной записке к диплому по рекомендации преподавателя.
Проблема такая, что в окне поиска по строке "^t^#" символ табуляции и следующий за ним номер страницы находится (поиск без подстановочных знаков), но при выполнении этих же действий в окне замены ничего не находится. Соответственно нет возможности автоматически заменить последовательность "^t^#" на "^t".
Бился с задачей на VBA, но в силу своего ничтожного опыта ничего не получилось, только истратил кучу времени.
Пока остановился на прикрывании номеров страниц надписью с заливкой белым без контурной рамки, однако из спортивного интереса хочется победить данную проблему.

Надеюсь на вашу помощь. Заранее спасибо.

2

Re: Поиск и замена текста в значениях полей

Поиск и замена вам могут не помочь. Так как при обновлении оглавления все встанет на свои места.
Предлагаю другой, но точно сработающий вариант.
Выделите оглавление полностью и нажмите Ctrl+Shift+F9. Ваше оглавление превратится просто в текст, номера страниц - в том числе. Останется только у текста оглавнения задать требуемый формат шрифта и поставить нужные вам цифры - можно даже не в ручную, а здесь, чтобы не нужно было на распечатке ручкой вручную эти листы проставлять.
Но вот зачем нужно проставлять номера вручную - непонятно.. Получается, что у вас в каждом разделе диплома должна идти своя нумерация страниц а у вас получается общая?? Немного не понятно.

Отредактировано andrkar (06.06.2010 07:23:08)

3

Re: Поиск и замена текста в значениях полей

Идея в ручной расстановке номеров страниц заключается в том, что если в процессе просмотра пояснительной записки преподавателем он захочет изменить порядок разделов/подразделов или что-то выбросить/добавить, то нумерация полностью поплывет и придется перепечатывать всю пояснительную записку. Изначально мне такая идея тоже казалась дурной, но столкнувшись на деле с проблемой понял ее преимущество.
По поводу обновления оглавления оно и понятно, что номера страниц появятся снова, поэтому я и хочу сделать скрипт. Вот только странности с поиском/заменой не дают этого сделать. Пробовал в ворде 2к3 и 2к7 — поведение одинаковое.

4

Re: Поиск и замена текста в значениях полей

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

Отредактировано andrkar (06.06.2010 16:34:43)

5

Re: Поиск и замена текста в значениях полей

А ларчик просто открывался. Поле TOC, которое реализует содержание, создаёт набор полей HyperLink и PageRef, разделённых табуляцией. Всё, что нужно сделать, это выделить содержание и перебрать поля внутри него, делая скрытым текст полей PageRef. Это и делает предлагаемый макрос. После обновления содержания форматирование конечно слетает, и макрос нужно запустить снова.

Sub HidePageNumbersInTOC()
  Dim ofld As Field
  For Each ofld In Selection.Fields
    If ofld.Type = wdFieldPageRef Then
      ofld.Result.Font.Hidden = True
    End If
  Next
End Sub

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

ofld.Result.InsertBefore String(3, Chrw(160))
Лучше день потерять — потом за пять минут долететь!

6

Re: Поиск и замена текста в значениях полей

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

viter.alex, спасибо!
Все и впрямь проще некуда. По поводу продолжения заполнителя, то можно табуляцию в стилях настроить. Но за подсказку со вставкой нескольких пробелов спасибо, пригодится.

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

Отредактировано Solderer (06.06.2010 21:40:00)

7

Re: Поиск и замена текста в значениях полей

Solderer пишет:

отчего все таки поиск в поле работает, а поиск с заменой нет, при одинаковом поисковом запросе

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

Лучше день потерять — потом за пять минут долететь!

8

Re: Поиск и замена текста в значениях полей

Александр - решение действительно - очень элегантное!!!!

9

Re: Поиск и замена текста в значениях полей

Странные дела. Макрос проработал очень мало времени, после чего текст полей wdFieldPageRef перестал скрываться. Может где в настройках ворда чего наковырял и не заметил, а может какой-то глюк, но переустановка офиса не помогла. При этом, после выполнения макроса значение параметра Hidden становится равным минус единице, независимо от того что присваивать этому параметру: True или число. Изначально же, до применения макроса, значение равно нулю. Кстати, тип параметра отчего-то long, а не boolean как, поидее, должно быть. Выход то я нашел быстро и вообще удаляю эти поля. Кстати, это действие визуально быстрее чем скрытие текста поля.
Вот конечный макрос, может кому-то тоже пригодится.

Sub HidePageNumbersInTOC()
ActiveDocument.Sections(Selection.Information(wdActiveEndSectionNumber)).Range.Select     ' выделить все содержимое текущего раздела
  Dim ofld As Field
  For Each ofld In Selection.Fields     ' цикл по обработке всех полей в выделенном фрагменте
    If ofld.Type = wdFieldPageRef Then
      ofld.Delete                                  ' удалить поле wdFieldPageRef
    End If
  Next
Application.Selection.EndOf        ' снять выделение
End Sub

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

Отредактировано Solderer (12.06.2010 18:40:42)

10

Re: Поиск и замена текста в значениях полей

Что ж, видно нет совершенства. Добавлю от себя, что выражение

ActiveDocument.Sections(Selection.Information(wdActiveEndSectionNumber)).Range.Select

можно заменить на более простое:

Selection.Sections.Last.Range.Select

ну и снятие выделения производится иначе:

Selection.Collapse wdCollapseEnd 'Свернуть в конец выделения

Хотя внешне это может быть не заметно.

Лучше день потерять — потом за пять минут долететь!