Контакты

Использование подстановочных знаков

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

Поиск с подстановочными знаками осуществляется в диалоговом окне Find and Replace (Найти и заменить). Мы познакомим Вас с основными правилами использования этого инструмента, чтобы Вы научились находить в документах Microsoft Word практически все, что угодно.

Откройте файл Word и нажмите сочетание клавиш Ctrl+H , чтобы открыть диалоговое окно Find and Replace (Найти и заменить). Кликните по More (Больше), чтобы развернуть диалоговое окно и получить доступ к дополнительным параметрам.

Примечание: Если вместо кнопки More (Больше) Вы видите кнопку Less (Меньше), нажимать ничего не нужно. Диалоговое окно уже развёрнуто.

Поставьте галочку напротив опции Use wildcards (Подстановочные знаки). Обратите внимание, что под полем Find what (Найти) появилась соответствующая надпись.

Примечание: Когда параметр Use wildcards (Подстановочные знаки) включен, Word ищет только точное совпадение с заданным текстом. Параметры Match case (Учитывать регистр) и Find whole words only (Только слово целиком) недоступны и затенены серым, чтобы продемонстрировать, что они включены автоматически и их нельзя отключить, пока выбран параметр Use wildcards (Подстановочные знаки).

Для примера найдём все повторения текста, начинающегося на “t” и заканчивающегося на “e” с любым количеством символов между этими буквами. Для этого введите “t” в поле Find what (Найти) и нажмите кнопку Special (Специальный) внизу диалогового окна. В появившемся меню выберите 0 or More Characters (Любое число знаков) или звёздочку (*).

Примечание: Если Вы знаете, какой именно специальный символ нужно использовать, можете ввести его непосредственно в поле Find what (Найти). Кнопка Special (Специальный) даёт подсказку на тот случай, если Вы не помните, какие спецсимволы доступны и каково их назначение.

Поисковый запрос поступит в обработку. Когда найдётся первое совпадение, нажимайте кнопку Find Next (Найти далее), чтобы найти следующие фрагменты текста, соответствующие запросу.

Чтобы отыскать текст, содержащий один любой символ, используйте знак вопроса (?). Например, если ввести запрос “d?g” в поле Find what (Найти), будут найдены все слова, состоящие из трёх букв, начинающиеся на “d” и заканчивающиеся на “g”, например, “dig”, “dug”, “dog”.

Ещё можно определить конкретные буквы для поиска, указав их в квадратных скобках “”. Например, если ввести запрос “bt” в поле Find what (Найти), будут найдены слова “bat”, “bet”, “bit”, “bot” и “but”.

Если параметр Use wildcards (Подстановочные знаки) включен, а Вам нужно найти один из символов, который используется как подстановочный, поставьте слэш (/) перед этим символом и запустите поиск. Например, чтобы найти вопросительный знак при включенном параметре Use wildcards (Подстановочные знаки) нужно ввести запрос “/?” в поле Find what (Найти).

Кроме того, подстановочные символы можно использовать для замены текста. Например, подстановочный символ “/n” (здесь n – это номер слова, которым заменяем) можно использовать для поиска выражения и дальнейшей его замены другим выражением. К примеру, мы ввели “(Kaufman) (Lori)” в поле Find what (Найти), а в поле Replace with (Заменить на) – “/2 /1” (не забудьте поставить пробел между цифрой 2 и вторым символом “/”). В итоге Word находит “Kaufman Lori” и заменяет на “Lori Kaufman”.

Microsoft Word предоставляет необыкновенно мощный инструмент для поиска и замены. Умение грамотно им пользоваться существенно упрощает редактирование и правку документов. В этом разделе подробно освещается использование специальных знаков в операциях поиска и замены; приведен ряд примеров.

Рассмотрим простой случай поиска и замены. Требуется заменить во всем документе фамилию Иванов на Петров . Это легко производится с помощью стандартной процедуры поиска и замены. Однако, поскольку фамилия Иванова в документе может быть в разных падежах и числах , то придется выполнить последовательно много замен.

Использование специальных знаков позволяет выполнить поставленную задачу сразу за один прием .

Другой пример. В документе очень много десятичных дробей. Часть дробей набрана через точку, часть - через запятую. Требуется произвести такую замену, чтобы сделать написание всех дробей единообразным.

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

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

Документ без названия

В тексте нет никаких текстовых выделений. Общее число словарных статей - например, около 30000.

Требуется:

    1. Найти все переводимые английские термины и выделить их полужирным начертанием. При этом все другие английские слова оставить в неприкосновенности.

    2. Дефис между английским термином и его переводом заменить на тире . При этом все другие дефисы оставить в неприкосновенности.

    3. Абзацы с английским термином отодвинуть от предыдущего на 2 пункта и обеспечить выступ этих абзацев на 0.25 см.

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

Можно ли это сделать менее, чем за 1 минуту?

Да можно. Для этого надо выполнить одну операцию поиска и замены с использованием специальных знаков.

Решение этих задач приводится в конце раздела.

В Microsoft Word существуют два типа специальных знаков - специальные символы и подстановочные знаки . Те и другие удобно вводить в строки поиска и замены, используя кнопку «Специальный» в диалоге поиска и замены.

Специальными символами называют символы, которых нет на клавиатуре и/или которые невозможно непосредственно вписать в строку поиска или замены. Например, принудительный обрыв строки, мягкий перенос, неразрывный пробел и т. п.

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

Приведем полный список символов и знаков и примеры их использования.

Документ без названия

Документ без названия

Спец. символы

Что обозначают

Символ табуляции (→)

Комментарий


Если опция Use wildcards включена, то будут находиться и принудительный разрыв страницы, и разрыв раздела.

Неразрываемый пробел (°)

Неразрываемый дефис (-)

Мягкий перенос (¬)

Документ без названия

Спец. знаки

Что обозначают

Пример строки поиска

Что будет находить

Один любой символ

бак , бок , бук , б5к , б¶к и т. п.

Любое число любых символов

бык , бардак , белый.¶
Полковник
и т. п.

Один из указанных символов

бак , бок , бук

Один символ из диапазона.
Диапазон должен быть указан в порядке возрастания кодов символов.

Любая строчная русская буква

Любая прописная русская буква

Любая цифра

Один любой символ не указанный после восклицательного знака

бак , бок и т. п., но не бык

Один любой символ не входящий в диапазон указанный после восклицательного знака

Бок , Док и т. п., но не бок , док

Любой символ кроме цифр

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

1000 , но не 100 , 10000

102020 , но не 1020 , 10202020

n и более штук предыдущего символа или выражения

1000 , 10000 , 100000 и т. д., но не 100

От n до m штук предыдущего символа или выражения

1000 , 10000 , но не 100 , 100000

один или более штук предыдущего символа или выражения

10 , 100 , 1000 , 10000 и т. д.

Начало слова

бок сер, но не колобок

Конец слова

колобок , но не бок сер

Документ без названия

Спец. символы

Что обозначают

Символ конца абзаца (¶)

Символ табуляции (→)

Любой ANSI или ASCII символ с кодом nnn

Содержимое буфера обмена

Содержимое строки поиска (или то, что найдено)

Разрыв колонки (···Column Break···)

Принудительный разрыв строки ()

Принудительный разрыв страницы (--Page Break--)

Длинное тире (-). Символ с кодом 0151.

Короткое тире (–). Символ с кодом 0150.

Неразрываемый пробел (°)

Неразрываемый дефис (-)

Мягкий перенос (¬)

Документ без названия

Знаки

Что обозначают

Выражение номер n из строки поиска

Точка с запятой в операторах {n;} и {n;m} - это не просто точка с запятой, а, так называемый List separator (Разделитель элементов списка). В США - это запятая, в России - точка с запятой. Чтобы точно узнать, какой символ играет роль разделителя элементов списка в вашей конфигурации, загляните в Панель управления\Язык и стандарты\Числа\Разделитель элементов списка.

Для поиска в документе знаков, которые в строке поиска используются как специальные, необходимо набирать перед ними обратный слэш (\). Например, если включена опция «Подстановочные знаки», то, чтобы искать восклицательный знак, надо в строке поиска набрать обратный слэш и за ним восклицательный знак (\!).

Опция «Подстановочные знаки» должна быть включена в диалоге поиска и замены. Это условие должно соблюдаться для всех приведенных ниже примеров.

Документ без названия

Строка поиска

Что будет находить

[!^0013]^0013[!^0013]

Одиночный конец абзаца в окружении двух любых других символов.(Подробный разбор см. ниже).

Два и более конца абзацев

Два и более символов пробела

Любой знак препинания (. , : ; ! ?)

Две любые цифры разделенные пробелом

^0032

Цифра и буква (английская или русская), разделенные пробелом. (Подробный разбор см. ниже).

Дефис и цифра

<@-@>

Два целых числа, разделенные дефисом

Цифра в круглых скобках

Целое число (точнее, непрерывная последовательность цифр)

<@,@>

Десятичная дробь, набранная через запятую

Английское слово

<[А-яЁё]@>

Русское слово

<[А-ЯЁ][а-яё]@>

Русское слово, набранное строчными буквами, но с прописной. (Подробный разбор см. ниже).

[!^0013]^0013[!^0013]

Документ без названия

1-й символ строки поиска

2-ой символ

3-й символ

Конец абзаца

Любой символ, но не конец абзаца

Конец абзаца (символ с кодом 0013).

В квадратных скобках указан символ с кодом 0013 (конец абзаца).
Знак «!» указывает на то, что в этой позиции может находится любой символ, кроме конца абзаца.

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

^0032

Документ без названия

1-й символ строки поиска

2-ой символ

3-й символ

Любая цифра

Любая буква (английская или русская)

В квадратных скобках указан диапазон знаков от 0 до 9, т. е. цифры.

Пробел (символ с кодом 0032).

Допустимый символ определен тремя диапазонами и двумя конкретными символами.
A - Z - английские прописные буквы;
а- z - английские строчные буквы;
А-я - русские прописные и строчные буквы;
Ёё - прописная и строчная ё (чтобы охватить весь русский алфавит).

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

<[А-ЯЁ][а-яё]@>

Документ без названия

1-я позиция строки поиска

2-я позиция

Любая русская прописная буква

Любые русские строчные буквы

В квадратных скобках указан диапазон знаков от А до Я и Ё (т. е. любая русская прописная буква).
Знак «<» указывает на то, что прописная буква должна быть в начале слова.

Диапазон в квадратных скобках определяет все русские строчные буквы.
Знак «@» говорит о том, что число русских строчных букв может быть равным или больше нуля.
Знак «>» указывает на конец слова.

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

Для работы с выражениями включите опцию «Подстановочные знаки».

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

В строке замены выражения представляются в виде: \n, где n - номер выражения в строке поиска.

Будем редактировать предложение: Настя ест яблоки.

Документ без названия

Документ без названия

Строка поиска

Строка замены

Результат поиска и замены

([!^0013]^0013)([!^0013])

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

Удаление пустых строк

Замена двух или более пробелов на табуляцию

^0032([.,:;\!\?])

Удаление пробела перед знаком препинания (. , : ; ! ?)

()^0032()

Замена пробела между цифрами на неразбиваемый пробел

()^0032()

Замена пробела между цифрой и буквой (английской или русской) на неразбиваемый пробел

Замена дефиса перед цифрой на минус

Замена круглых скобок вокруг цифры на квадратные

1. Замена в документе фамилии Иванов на фамилию Петров сразу во всех падежах:

Документ без названия

Конечно, такая замена возможна только с фамилиями, у которых одинаковые падежные окончания .

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

Вот два варианта этой замены:

Документ без названия

3. Обработка текста словаря компьютерных терминов.

Вот как это решается за минуту:

Сначала весь текст форматируется так: Формат->Абзац->Отступ слева 0.25 см. Для строки замены с помощью кнопки «Формат» необходимо предварительно установить: «Шрифт » начертание Полужирный, «Абзац » Отступ слева 0 см, «Абзац » Интервал перед 2 пт.

Затем производится установка в строках поиска и замены:

Документ без названия

Строка поиска

Строка замены

(^0013@)^0032-

После этого следует нажать на кнопку «Заменить все». В результате:

    Все переводимые английские термины выделяются полужирным начертанием. При этом все другие английские слова остаются в неприкосновенности.

    Дефис между английским термином и его переводом заменяется на тире. При этом все другие дефисы остаются в неприкосновенности.

    Абзацы с английскими терминами отодвигаются вниз от предыдущих абзацев с объяснением термина и выдвигаются влево.

Т. е., во всех, например, 30000 фрагментах текста, отвечающих вышеприведенным условиям, производится 30000 требуемых изменений и получается следующее:

Документ без названия

Alpha (nu ) meric display - буквенно-цифровой (символьный) дисплей.
Дисплей, предназначенный для работы с буквенной, цифровой и сопутствующей
символьной информацией.
Alpha (nu ) meric keyboard - буквенно (алфавитно)-цифровая клавиатура.
Клавиатура для ввода кодовых представлений цифр и букв, имеющая маркировку
символьного набора.
Alternate key - альтернативный ключ.
Ключ поиска в базе данных, не указанный в качестве первичного ключа.
Alternate Mark Inversion (AMI) - чередующаяся инверсия единиц.; http://members.xoom.com/sergeymh

6. Воронин А. Простая вёрстка в Word. Microsoft Word 2002 XP. - М.: «СПАРРК», 2003. - 352 с.

7. Технология полиграфического производства. Часть 1. Издательские и наборные процессы. Лабораторные работы для специальности 051900 «Графика». М.: МГУП, 2002. - 60 с.

Поиск по документу Word осуществляется функцией «Найти». Смотрите статью «Поиск в документе Word ». Но поиск в Word можно осуществлять не только по словам, но и с учетом регистра, по шрифту, стилю, с помощью подстановочных знаков, т.д.
Если в тексте много похожих слов, то нужно будет искать в результатах поиска среди них. Чтобы найти одно конкретное слово, есть в Word расширенный поиск . В нем можно найти данные по более точным, детальным данным - с учетом регистра (строчные или прописные буквы), слово по полному совпадению, найти слово не только по тексту, но и по оформлению этого слова, по другим условиям.
Итак, на закладке «Главная» в разделе «Редактирование» нажимаем кнопку «Найти». Внизу появившегося окна нажимаем на кнопку «Больше>>>». Появится окно расширенного поиска. Рассмотрим его.
«Направление» - это поиск по документу Word, направление поиска в документе. Например, если выберем направление «Вперед», то поиск будет проходить от курсора только вниз по документу. Если выберем «Назад»- вверх по документу. В ссылках и колонтитулам в этих случаях поиск осуществляться не будет. Если выберем поиск «Везде», то Word будет искать везде по документу, в т.ч. в колонтитулах, в ссылках.
Поиск по словам в Word.
«Учитывать регистр» - это значит, если в строке поиска напишем слово маленькими буквами, то и искать Word будет только слова, написанные маленькими буквами. Если напишем слово с большой буквы, то будет искать слова, написанные с большой буквы.
«Только слова целиком» - будет искаться только слово, которое написали в строке поиска. Например, в строке поиска мы написали слово «мам». Простой поиск выдаст слова – мам, мамочка, мамуля, т.д. Все слова, в которых содержится слово «мам». Расширенный поиск выдаст только слово «мам».
«Подстановочные знаки» - это знаки, которые обозначают определенные значения в слове. Например, мы поставили галочку у функции Word «Подстановочные знаки» , а в строке поиска написали так «С?ло».Это значит, что нужно найти все слова с этими буквами, но вторая буква (где стоит знак вопроса) может быть любая. Поиск нашел такие слова – сало, село.
Рассмотрим несколько подстановочных знаков.
Подстановочные знаки Word .
? (вопросительный знак – любая буква.
*(звездочка) – несколько символов. Например, написали – «Л*сь», найдет – лось, лосось.
(квадратные скобки) - найдет все слова с символами, указанными в квадратных скобках. Например, написали в строке поиска «С[ае]ло», найдет – сало, село. [ - ] (буквы через тире, в квадратных скобках) – будет искать все слова с буквами, которые написаны в диапазоне в квадратных скобках. Например, написал «С[а-е]ло», найдет – сало, село, т.д.
[!] (восклицательный знак в квадратных скобках) – будет искать слова, кроме слов с буквой с восклицательным знаком. Написали в строке поиска «С[!а]ло», найдет – село. А слово «Сало», показывать в результатах поиска не будет, хоть и есть это слово в тексте, п.ч. мы написали в строке поиска условие, чтобы слова, в которых будет после буквы «С» буква «а», не искал.
>(знак больше) – это как стрелка, показывает, в какой части слова искать. Этот знак будет искать слова, которые оканчиваются на указанные в поиске буквы. Например, написали так, «(ист)>». Найдет и покажет в результатах поиска слово - лист, п.ч. оно оканчиваются на «ист». А слово «источник» не покажет.
<(знак меньше) – будет искать слова, которые начинаются с букв, которые мы укажем в поиске. Например, мы написали «<[лис]». Найдет слово – лис, не будет искать и не покажет слово, полис.
@ («собака» – в разговорном русском языке) – повторяющиеся символы. Например, написали «»С@ыпать». Найдет слово ссыпать.
{ n} (фигурные скобки с числом n) – в фигурные скобки ставим число (n), которое укажет, с каким количеством повторений указанного символа нужно искать слова. Например, написали так, «*е{2}». Здесь мы указали такое условие поиска – искать слова, которые имеют несколько символов (*), конкретно букву «е», которая будет в словах повторяться 2 раза. Word нашел такое слово – «смелее». А слово «короче» не покажет в результатах поиска, п.ч. в нем одна буква «е».
{ n,} (фигурная скобка с числом n и запятой) – пишем количество повторений символов от указанного числа и более. Например, написали – «*е{2,}». Поиск выдал слова – смелее, змееед.
Чтобы поставить квадратные скобки в Word , нужно переключить клавиатуру на английскую раскладку. Квадратные скобки находятся на кнопках русских букв «х» и «ъ».
Фигурные скобки в Word ставим, как квадратные, только сначала нажимаем клавишу «Shift».
Функция поиска «Произносится как» позволяет найти слова, которые пишутся по-разному, но произносятся одинаково. Эта функция работает только с английским текстом.
Функция «Все словоформы» ищет все словоформы, например, времена глаголов, т.д.
Поиск в документе Word по формату .
В диалоговом окне «Найти и заменить» нажимаем на кнопку «Формат» , расположенную внизу окна. Выбираем нужное из появившегося списка.

Форматы можно комбинировать. Например, найти текст, написанный полужирным курсивом с неразрывным пробелом, т.д.
Кнопка «Специальный» тоже имеет перечень функций.
Поиск и замена в Word.
В Word можно не только найти расширенным поиском, но и заменить. Переходим в диалоговом окне «Найти и заменить» на закладку «Заменить», и в строке «Заменить» пишем подробные условия замены.
Как удалить в Word слово с ошибкой, которое мы внесли случайно, смотрите в статье "

Занимался вот намедни всяческими сексуальными извращениями с текстами очередных аффтаров от медицины в MS Word. И нужно мне было искать и заменять кучу всякой нецензурщины и тарабарщины, ибо аффтары, по большей своей части, русскому языку вовсе не обучены плохо (всё на аглицком кириллицей норовят писать и прочее) и тексты форматировать читабельно не умеют. Заменять и просто менять там нужно было очень много чего, а стандартных общеизвестных встроенных в редактор средств поиска стало не хватать, нужно было прибегать к использованию . А как? На известные мне ранее маски волшебная программа Word стала грязно ругаться матом. Как всегда выручил Гугл. Немного покопавшись я обнаружил, что гениальные мелкомягкие написатели MS Office и тут пошли своим путём, обозвав такие выражения wildcards и немного изменив их синтаксис. В целом разобраться можно.


Оказалось всё довольно просто (у меня Office 2007, но, думаю, будет справедливо и для предыдущих версий, разве что будут незначительные отличия в названиях пунктов, но вы разберётесь, я верю;)). И не нужно было, по большому счёту, никуда лезть искать. Наряду со сразу видимыми, если вызвать в Word"е окно «Поиск» (Ctrl+F) или «Поиск и замена» (Ctrl+H), поставить курсор в поле «Найти» и нажать кнопочку «Больше», а после "Специальный», спецсимволами, есть и ещё одна опция, о которой чуть ниже.Оказалось всё довольно просто (у меня Office 2007, но, думаю, будет справедливо и для предыдущих версий, разве что будут незначительные отличия в названиях пунктов, но вы разберётесь, я верю;)). И не нужно было, по большому счёту, никуда лезть искать. Наряду со сразу видимыми, если вызвать в Word"е окно «Поиск» (Ctrl+F) или «Поиск и замена» (Ctrl+H), поставить курсор в поле «Найти» и нажать кнопочку «Больше», а после «Специальный», спецсимволами, есть и ещё одна опция, о которой чуть ниже.
Сперва о стандартных масках поиска:
^? — любой знак
^# — любая цифра
^$ — любая буква
^p — Знак абзаца (¶) (если выбран параметр «Подстановочные знаки» следует заменить на ^13 )
^t — знак табуляции (→) (если выбран параметр «Подстановочные знаки» следует заменить на ^9 )
^+ — длинное тире (—)
^= — короткое тире (-)
^^ — знак крышки (^)
^l — принудительный разрыв строки (символ ↵ или 0xBF), такой бывает если нажать Shift+Enter (если выбран параметр «Подстановочные знаки» следует заменить на ^11 )
^n — разрыв колонки (если выбран параметр «Подстановочные знаки» следует заменить на ^14 )
^12 — Разрыв раздела или страницы (при замене добавляет разрыв страницы)
^m — Принудительный разрыв страницы (применяется также для поиска и замены разрывов разделов, если выбран параметр «Подстановочные знаки»)
^s — неразрывный пробел (º) (Ctrl+Shift+Space)
^~ — неразрывный дефис (≈)
^- — мягкий перенос (¬)
Теперь перейдём к полю «Заменить на», тут появляются две специфические опции:
^& — искомый текст
^c — содержимое буфера обмена
Как это можно использовать? Например так — пусть нужно найти текст «Achtung!» и «Achtung.»? покрасить его в зелёный и заменить на «Achtung , minen! » (именно красного цвета). Причём в тексте у вас есть и просто слово «achtung» с маленькой буквы, которое менять не нужно. Решение:
Написать красным «minen! » и вырезать в буфер обмена
Найти (отметив галочку «Учитывать регистр»): Achtung
Заменить на (переставить курсор на это поле и нажать кнопку «Формат», затем выбрать «Шрифт» и там зелёный):
Теперь Найти: Achtung^?
Заменить на: Achtung, ^c

С этим всё действительно просто и понятно. А если нужно в огромном списке литературы вида
Reynolds J. V., Murchan P., Leonard N. et al. High-dose interlenkin-2 promotes bacterial translocation from the gut // Brit. J. Cancer.-1995. -Vol. 72, N 3. - P. 634-636.
привести всё к нормальному виду
Reynoldsº J.V., Murchanº P., Leonardº N. etº al. High-dose interlenkin-2 promotes bacterial translocation from the gut // Brit. J. Cancer.º— 1995.º— V.72(3).º— P.º 634- 636.
Как быть? Ручками править в каждой строчке всё это будет очень долго и утомительно. Но это тоже можно сделать поиском и заменой.
Если отметить в окне поиска и замены галочку «Подстановочные знаки», то содержимое кнопки «Специальный» для поля «Найти» примет несколько иной вид:
? — любой знак
[ - ] — знак в диапазоне
< — в начале слова
> — в конце слова
() — диапазон
[!] — не
{; } — число вхождений
@ — предыдущий 1 или более
* — любое число знаков
А для поля «Заменить на» появится дополнительный пункт
\n — искомое выражение
Как этим пользоваться? Просто. Начну почти по порядку.
? и * — по сути одно и то же, но выражение ??са будет для поиска значить «[пробел] оса», «коса», «лиса» и ещё кучу всего, содержащего два символа впереди «са». А выражение *са выделит вам весь текст от положения курсора в тексте до первого попавшегося «са», в том числе и «[курсор] По полю бежало животное с номером 25, это была лиса».
Близок по смыслу к предыдущим и символ @ . Тут фантазии на пример у меня не хватило, заимствую у мелкомягких: lo@t поможет найти «lot» или «loot», ful@ поможет найти «ful» или «full» и т.д. :)
Почти из той же оперы символы < и > : <ок поможет найти все «около», а ок> — всевозможный «шок».
Выражение поможет найти любую букву английского алфавита в верхнем регистре, а — любую букву и русского и английского. Неразрывно с этим используется и выражение {; } . Выглядит это так: допустим, нужно найти все слова, начинающиеся с заглавной буквы и длиной от 4 до 5 букв и заканчивающиеся вопросительным знаком. Решением будет искать их по следующей маске:
{1;1}{3;4} \?
то есть найти одну заглавную букву и ещё 3 или 4 следующих за ней строчных плюс вопросительный знак. Тут есть одна маленькая тонкость — так как символ «?» используется как подстановочный, то, чтобы поиск его воспринял за знак вопроса, а не любой символ перед ним нужно поставить «\ ». Если нужно найти сам символ «\» в тексте, то это будет выглядеть как \\ , ну и т.д.
При помощи [!] можно найти например всё кроме заглавных букв: [!A-Я] .
Теперь о самом наверное интересном операторе поиска — () . При его помощи можно находить несколько разных выражений и группировать их при помощи оператора \n . Простой пример: пусть вам нужно по всему тексту заменить «Фамилия И О» на «И.О.ºФамилия». Решение:
Найти: ({1;1}{2;11}) ({1;1}) ({1;1})
Заменить на: \2.\3.^s\1
То есть каждое выражение в скобках в поле «Найти» соответствует по порядку оператору \n в поле «Заменить на».
Теперь с заданной выше задачей я думаю вы справитесь и сами;)

ОПТИМИЗАЦИЯ КОДА

  • Для определения количества символов в части документа используйте свойство StoryLength или функцию Len() , но не команду Characters.Count , которая выполняется довольно долго, если символов много.
  • В проверках (If , Select и др.) сравнивайте с проверяемым значением - с тем, что должно быть.
    • Пример. При проверке на True правильно писать:
      If N <> True Then
      Часто ошибочно пишут:
      If N = False Then
      Если N имеет тип отличный от boolean , код может не сработать.
  • Оптимизация перебора массива (Array ):
    • Быстро:
      For i = LBound(Array) to UBound(Array)
      Next i
    • Медленно:
      For Each V in Array
      Next V
  • Оптимизация перебора коллекции (Collection ):
    • Быстро:
      For Each V in Col
      Next V
    • Медленно:
      For i = 1 to Col.Count
      V = Col(i)
      Next i
  • При массовой проверке строк, Len(S) = 0 медленее чем S = "" .
  • Быстродействие перехода по условию:
    • Оператор On ... GoSub ... на порядок быстрее чем Select Case .
    • Select Case вообще медленная проверка, If работает быстрее.
  • Оптимизация перебора символов (Character ) и т.п.:
    • Медленный способ:
      Dim R As Range
      For Each R In ActiveDocument.Characters
      Next R
    • Средний способ:
      Set R = ActiveDocument.Characters.First
      Do
      Set R = R.Next
      Loop While Not (R Is Nothing)
    • Быстрый способ:
      Set R = ActiveDocument.Range(0, 0)
      Do
      Loop While R.Move = 1
  • Оптимизация перебора параграфов (Paragraph ) и т.п.:
    • Медленный способ:
      Dim P As Paragraph
      For Each P In ActiveDocument.Paragraphs
      Next P
    • Средний способ:
      Set P = ActiveDocument.Paragraphs.First
      Do
      Set P = P.Next
      Loop While Not (P Is Nothing)
    • Быстрый способ:
      Dim R As Range
      Set R = ActiveDocument.Range(0, 0)
      Do While R.Move(Unit:=wdParagraph) = 1
      Set P = R.Paragraphs.First
      Loop
  • Безопасное применение цикла For Each
    • Если, в ходе обработки группы элементов документа, сама коллекция изменяется (удаляются или добавляются элементы), то циклом For Each могут быть пропущены некоторые элементы (из тех, что были при запуске цикла) .
    • Пример, где может случится пропуск, и удалены будут не все рисунки:
      Dim SH as Shape

      SH.Delete
      Next
    • Что бы пример работал без сбоев, надо создать временную коллекцию и запомнить в ней все элементы:
      Dim COL as New Collection, SH as Shape
      For Each SH in Selection.Range.ShapeRange
      COL.Add Item:=SH
      Next
      For Each SH in COL
      SH.Delete
      Next
  • При обращении к объекту, впереди его имени желательно и полезно указывать его родителя. Достаточно одного - Parent.Object , но можно и всю цепочку - Parent1.Parent2.Parent3.Object .
    • Пример. В документе в редакторе VBA мы создали форму (UserForm ) с именем "МояФорма", а затем, для ее запуска, в текст документа вставили кнопку (элемент управления CommandButton ), которую также назвали "МояФорма", что естественно и удобно. Теперь, если в макрос нажатия кнопки вставить код МояФорма.Show , то при компиляции ошибки не будет, а вот при запуске мы ошибку получим. Правильно было написать Project.МояФорма.Show , а так мы обратились не к форме, а к кнопке. Если же хотим обратиться к кнопке, то надо писать ThisDocument.МояФорма .
  • Для назначения типов, удобно использовать специальные символы: String - $, Integer - %, Long - &, Single - !
    • Пример: Dim Строка$, Целое%, Длинное&, Вещественное!
  • Для повышения совместимости, имена констант Word лучше заменять их значениями. Это касается языков, списков, полей и др. То есть, в коде пишем 1049, а не wdRussian .
  • В математических формулах, что пишем в коде, надо использовать круглые скобки, чтобы в первую очередь выполнялись операции, уменьшающие промежуточный результат. То есть, сначала - деление и вычитание, потом - умножение и сложение. Иначе, если на каком-то этапе расчета число окажется слишком большим, получим ошибку № 6 "Overflow" - переполнение. Так же, непосредственно в формуле, можно привести тип чисел к Long , например, ибо по умолчанию имеем Integer .
    • Пример. Так будет ошибка:
      Dim V as Variant
      V = 999 * 999 / 999
      V = (999 * 999) / 999
    • А так нет, хотя математически результат один:
      V = 999 * (999 / 999)
      V = 999& * 999 / 999
      V = CLng(999) * 999 / 999
  • Избегайте избыточного изменения документа. Не надо слову назначать жирный шрифт, если оно уже жирное. Проверяйте необходимость изменений. Word реагирует на любые операции с документом, что сказывается на быстродействии. При большом количестве избыточных правок, разница по времени просто гигантская, если добавить простую проверку.
  • Учитывайте параметры автозамены Word, которых становится все больше, от версии к версии.
    • Во-первых, при каждом изменении документа, в том числе макросом, Word выполняет свои автоматические операции. Чем больше изменений и чем больше автозамен, тем медленнее работает макрос.
    • Во-вторых, может случится такое, что макрос правит какой-то текст, а Word тут же подправляет его по-своему, согласно настроек автозамены. Это может быть полезным, при замене кавычек, например, но не всегда.
  • При длительной обработке документа макросом, отключайте автоматические функции Word. Иначе, и обработка замедлится, и Word может зависнуть.
    • Пример. Вы берете большой документ, выполняете его обработку макросом, но Word при этом зависает. Даже не разбираясь в макросах, можно попробовать сделать следующее:
      • Откройте обрабатываемый документ.
      • Перейдите в параметры Word, где отключите:
        • Сохранение > Автосохранение документа (обязательно).
        • Правописание > Автоматическая проверка орфографии и грамматики (желательно).
        • Правка > Учитывать пробелы (желательно).
        • Параметры автозамены (по желанию, уж слишком их много).
      • Запустите макрос. Дождитесь его завершения.
      • Верните параметры Word в исходное состояние.
  • Крайне медленно работает обращение к элементу документа по его индексу. Речь о символах, словах, предложениях, абзацах и др. Чем больше элементов в документе, тем "тормоза" более заметны.
    • Пример. Вместо прямого обращения к знаку:
      Document.Characters(N)
      лучше используйте поиск нужных знаков:
      Document.Range.Find
      в крайнем случае, перебор знаков в цикле:
      For Each C In Document.Characters

КОНТРОЛЬ ОШИБОК (On Error )

  • Код, вносящий изменения в документ, защищайте On Error .
  • Вместо команды Err.Clear , можно использовать On Error Resume Next , которая также очищает последнюю ошибку. В плане надежности это даже полезно.
  • В приведенной ниже структуре, выполняемую часть помещать после Else. Так как, при ошибке в проверке, выполняется блок Then :
    • On Error Resume Next
      If ... Then ... Else ...
  • Если контроль ошибок отключен и происходит присвоение переменной, то при ошибке переменная сохранит старое значение. Поэтому, предварительно, надо сбросить значение переменной.
    • Пример с ошибкой:
      N = 1
      On Error Resume Next
      N = CLng("") " Run-time error 13
      if N = 0 Then Exit Sub
    • Рабочий пример:
      On Error Resume Next
      N = 0: N = CLng("")
      if N = 0 Then Exit Sub
    • Правильно:
      On Error Resume Next
      N = CLng("")
      if Err.Number <> 0 Then Exit Sub

РЕЖИМ ПРОСМОТРА ДОКУМЕНТА (View.Type )

  • В случае когда, в интерфейсе Word, выбран элемент вне окна активного документа, отдельные свойства и методы активного документа могут быть недоступны.
    • Пример. Если в Word 2003 кликнуть правой кнопкой мыши пункт на панели "Схема документа", то документ останется активным, но при обращении к стилю абзаца произойдет ошибка:
      • MsgBox ActiveDocument.Paragraphs.First.Style.NameLocal " Run-time error 4605
    • Одним из вариантов лечения может быть код:
      • ActiveDocument.Windows(1).Panes(1).Activate
  • Selection ведет себя по-разному в различных режимах просмотра документа.
  • При обработке макросами, старайтесь использовать режим просмотра "Обычный" (wdNormalView ). Это повышает быстродействие. Особенно при работе с таблицами.
  • При переключении режима просмотра, может изменится Selection.Range , т.к. есть режимы, где отображаются не все элементы документа.
    • Пример. В режиме просмотра "Обычный" / "Черновик" (wdNormalView ) не видны объекты. И если, в режиме "Разметка страницы" (wdPrintView ), выбрать текст внутри надписи, то, при смене режима на "Обычный", схлопнется Selection.Range .

ПОИСК (Range.Find )

  • Подстановочные знаки
    • По одному и тому же шаблону, с подстановочными знаками, поиск вперед и назад может дать разные результаты. Тестируйте поисковые шаблоны, что бы знать, какие подходят для поиска вперед, а какие назад.
    • Поиск с подстановочными знаками "@" и "{1;}"
      • Дает не одно и тоже.
        • Пример. При поиске вперед в тексте "111+222+333":
          • по шаблону "1@" будет найден один символ "1", а по "1{1;}" - цепочка символов "111"
          • по шаблону "[!2]@+" будет найден текст "111+", а по шаблону "[!2]{1;}+" ничего не будет найдено
      • При сложном поиске, особенно в обратном направлении, больше подходит "@".
        • Пример. Поиск назад в тексте "Один Два Три" по шаблону "<[А-Я]{1;}[А-Яа-я]{1;}>" не даст результата, в отличие от "<[А-Я]@[А-Яа-я]@>".
      • По опыту, более стабильным является "{1;}".
        • Пример. Лучше использовать"<[А-Я]{1;}>", а не "<[А-Я]@>". Результат одинаков, но первый вариант надежнее.
    • Подстановочный знак \n, где n=1,2,3...:
      • Можно использовать не только в поле "Заменить" но и в поле "Найти".
        • Пример. Если ищем по шаблону "(ма)\1", то найдем текст "мама".
        • Пример. Можно искать повторяющиеся слова. Поиск слова встречающегося в тексте пять раз: "(<*>)*\1*\1*\1*\1".
      • Замененный текст, в некоторых случаях, наследует формат впередистоящего.
        • Пример. Если искать "(?)X" и заменять на "\1Y" то, когда первый символ найденного текста подстрочный, а второй нет, после замены и второй станет подстрочным. Поиск "X(?)" и замена на "Y\1" не приводит к наследованию.
    • Спецсимвол "!" при поиске с подстановочными знаками:
      • Использовать осторожно. Слишком глобально и много исключений, предусмотреть которые очень трудно.
      • Будут найдены только простые символы.
        • Пример. Поиск по шаблону "[!A]" не найдет графический объект, гиперссылку и т.п.
        • Пример. Поиск в таблице с обычным текстом по шаблону "Дом[!^12]{1;}" найдет текст от слова "Дом" до конца ячейки (тот же результат дает поиск назад по шаблону "Дом*").
    • При поиске с подстановочными знаками, старайтесь не использовать знак конца абзаца "^13" вместе со скобками. Замечено нестандартное поведение.
      • Пример. Если попробуем две точки в конце абзаца заменить одной, т.е. ищем "([!.].).(^13)" и заменяем на "\1\2", то в параграфе со списком получим интересный глюк.
    • При поиске и замене с помощью скобок (подстановочные знаки), поиск надо повторять дважды, когда заменяемая часть находится не в конце искомого текста.
      • Пример. При поиске "(X)+(X)" и замене на "\1=\2" в тексте "X+X+X+X+X" получим "X=X+X=X+X". Т.е. поиск надо повторить дважды или, выполняя поиск пошагово, корректировать оставшуюся область поиска.
    • Поиск с подстановочными знаками не работает с полями. То есть, с его помощью невозможно найти текст внутри поля.
    • Осторожно используйте длинные, сложные шаблоны поиска с подстановочными знаками. Бывают такие сочетания "шаблон поиска + обрабатываемый им документ", что подвешивают Word намертво. То есть, в одном документе все работает, а в другом - виснет. Чем проще, тем лучше.
  • Оптимизация массовых замен
    • Медленный способ, как ни странно:
      Range.Find.Execute Replace:=wdReplaceAll
    • Быстрый способ, особенно при больших объемах:
      Range.Find.Execute Replace:=wdReplaceNone
      If Range.Find.Found Then
      Range.Collapse wdCollapseStart
      Range.Find.Execute Replace:=wdReplaceAll
      End If
    • Самосброс. Некоторые параметры поиска, Word меняет самостоятельно. Есть взвимозависимые параметры, когда один параметр сбрасывается при изменении вами другого. Есть параметры сбрасываемые Word в результате запуска вами поиска. Поэтому, при массовых заменах, советую для каждой замены прописывать все параметры.
  • Поиск, разное
    • При поиске стиля, наблюдаем интересный глюк в абзаце перед таблицей. Абзац стилизован одним стилем. При поиске назад, все в порядке. А вот при поиске вперед, сначала поиск находит абзац без знака абзаца, а при продолжении поиска - знак абзаца. Что через диалог, что макросом.
    • При замене текста, удаляются или повреждаются закладки:
      • Удаляются закладки, попадающие в заменяемый текст.
      • Удаляется закладка, область которой совпадает с заменяемым текстом.
      • Закладка, охватывающая часть текста, обрезается и вытесняется за текст.
      • Сохраняется точечная закладка, стоящая с края текста.
    • Всегда продолжайте поиск с конца найденного блока. Например, с конца параграфа, а не с начала следующего. Иначе велика вероятность зацикливания, особенно в таблицах.
    • Поиск без текста - только формата (жирный, наклонный шрифт и т.п.), начинается с края выбранной области по направлению поиска. Область как бы предварительно схлопывается в направлении поиска.
    • Поиск не сработает, если искомый текст занимает всю область поиска.
      • Пример. В области R, содержащей текст R.Text="Иван" , поиск R.Find.Text="Иван" не сработает.
    • В таблице, для поиска в последнем параграфе ячейки таблицы при помощи Selection, надо брать область параграфа без последнего символа. Причина хорошо видна, если выполнить код: Cell.Range.Characters.Last.Select
    • Учитывайте при поиске символы (Character ) содержащие не один знак. Такие как символ конца ячейки таблицы (13 + 7), гиперссылки и т.п.
      • Пример. Поиск по шаблону "Вася[!.]" не найдет слово "Вася" стоящее последним в ячейке таблицы или перед гиперссылкой.
    • Если область поиска охватывает часть гиперссылки, то поиск будет произведен в гиперссылке целиком. Желательно выравнивать область поиска с началом/концом символа (Character ). Например, так:
      Range.SetRange Start:=Range.Characters.First.Start, End:=Range.Characters.Last.End
    • При поиске в выбранной области (Selection) учтите, что в таблице невозможно выбрать: стока + ячейка.
      • Пример. Код, приведенный ниже, выберет все от начала строки с ячейкой таблицы до конца документа:
        Range(позиция в ячейке таблицы, позиция конца документа).Select
    • Команда Find.Execute иногда выдает False , в то время как поиск успешен и Find.Found=True . Т.е. надежнее писать так:
      Range.Find.Execute
      If Range.Find.Found = True Then ...
    • В виде макроса, реализовать опцию поиска "Выделить все...", для стиля, шрифта, или другого форматирования, можно с помощью команды SelectSimilarFormatting
      • Пример. Выделение всех вхождений стиля "Заголовок 1":
        Selection.Find.Style = "Заголовок 1"
        Selection.Find.Execute
        Application.Run "SelectSimilarFormatting"
    • Спецсимвол ^d (он же ^19 - начало поля, есть еще ^21 - конец поля) позволяет искать как любые поля, так и поля определенного типа. Более того, можно найти, выделить и обработать строго отфильтрованные, нужные поля.
      • Пример обработки полей типа AUTOTEXT:
        • Включим режим отображения кода полей (Alt+F9)
        • Откроем окно расширенного поиска (Ctrl+F, Ctrl+H)
        • В поле "Найти" водим текст: ^d^wAUTOTEXT^w
        • Активируем флаг "Выделить все элементы..."
        • Выполним поиск. В результате, будут выделены все поля типа AUTOTEXT. Причем, выделяются не искомые фрагменты кода полей, а именно поля целиком!
        • Выделенную группу полей можно вырезать, скопировать, удалить, форматировать и др.
        • Можно переключиться обратно - в режим отображения значений полей (Alt+F9). При этом, поля останутся выделенными.
    • Если выставить Selection.Find.Wrap = wdFindContinue , то при проходе поиска через край (начало/конец документа), этот параметр самосбросится и станет wdFindStop .

ШРИФТ (Font )

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

СКРЫТЫЙ ТЕКСТ (Font.Hidden )

  • Когда скрытый текст виден (ShowHiddenText=True ), то он ведет себя как обычный текст.
  • Когда скрытый текст не виден (ShowHiddenText=False ), то:
    • Скрытый текст исключается из свойств:
      Paragraphs
      Range.Characters
      Range.Text
    • Скрытый текст остается в свойствах:
      Range.Start
      Range.End
      Range.Font
      Selection.Type
  • При переключении видимости скрытого текста (ShowHiddenText ), проверяйте и корректируйте области Range . Желательно избегать ситуации, когда текст скрыт, а край области находится внутри скрытого текста.

ТАБЛИЦЫ (Table )

  • Команда Select , для выбора столбцов таблицы, работает по-разному, когда таблица находится на одной странице и когда на нескольких.
  • Если область схлопнута и находится в начале параграфа сразу за таблицей, то у этой области Range.Tables.Count = 1 . Поэтому, нахождение в таблице лучше проверять функцией Range.Information(wdWithInTable) .
  • Если Selection находится сразу за последней ячейкой строки таблицы то:
    Selection.Cells.Count = 1
    Selection.Range.Cells.Count = 0
  • Осторожно использовать команды перехода по параграфам в таблицах с объединенными ячейками. Например: Selection.Move Unit:=wdParagraph, Count:=1 . При поиске возможно зацикливание.
  • Вставка нового столбца в таблицу может быть невозможна из-за ошибки "Превышена максимальная ширина". Поэтому, при создании таблицы макросом, лучше задать столбцам фиксированную ширину, а уже после заполнения можно включить автоподбор ширины и др.

СТИЛИ (Style )

  • Желательно исключить пробелы из имен стилей, созданных пользователем. Например, при наличии пробелов, сбоит функция "Выделить все" стиля. Встроенных стилей это не касается.
  • Имена встроенных стилей привязаны к региональным настройкам и пишутся на языке интерфейса. Например, стиль "Заголовок 1" в русском Word, это "Header 1" в английском. В макросах, для встроенных стилей, надо использовать номера wdBuiltinStyle , для повышения совместимости.
  • Осторожно работайте с неиспользуемыми стилями (Style.InUse = False ). Хотя эти стили и находятся в коллекции документа (Document.Styles ), но к документу пока не относятся, правильнее считать их отдельной группой. Word следит за такими стилями, и даже простое чтение макросом свойств (не всех, но например Style.Description ) неиспользуемого стиля, вызывает автоматическое подключение этого стиля к документу и цепную перенастройку других стилей. В результате чего, документ будет изменен (Document.Saved = False ), связи его стилей (свойства BaseStyle, LinkStyle ) будут перенастроены по какому-то внутреннему алгоритму Word, могут появиться изменения в форматировании документа.
  • Параметр стиля InUse означает, что стиль подключен к документу. Это не значит, что стиль используется прямо сейчас, достаточно было применить стиль ранее. Так же, это может быть стиль, созданный или модифицированный в этом документе.
    • Пример. Если применить в документе стандартный стиль "Подпись", а затем удалить все стилизованные им фрагменты, то параметр InUse стиля "Подпись" останется равным True .
  • Присвоение стиля делайте через имя, не через объект.
    • Ошибка (сбой произойдет, если имя стиля "005", то есть какой-то номер в виде текста):
      Selection.Find.Style = MyStyle
    • Правильно:
      Selection.Find.Style = MyStyle.NameLocal
  • В стиле таблицы программно (макросом) нельзя задать:
    • Вертикальное выравнивание текста ячеек.
    • Значения полей ячеек по умолчанию (для всей таблицы) (TopPadding и др. меняет поля у всех ячеек стиля сразу).
    • Параметр "Как во всей таблице" для полей ячейки.

ВЫБРАННЫЙ ФРАГМЕНТ (Selection )

  • Объект Selection является уникальным, также как и многие его свойства и методы. Например, у объекта Range набор инструментов для работы с областью существенно уступает Selection .
  • Несомненный плюс Selection в том, что возможна работа с несколькими фрагментами, выбранными в разных местах документа. В отличие от Range , где возможна обработка только одного непрерывного фрагмента документа.
  • Старайтесь как можно реже использовать Selection в макросах, особенно в сложных. Только по необходимости. Причина - к изменению Selection , привязано очень много автоматических операций Word. Использование Selection , в лучшем случае, сильно замедлит работу макроса, в худшем - приведет к ошибке, сбою.
  • Не путать одинаковые свойства и методы у Объект.Свойства и Объект.Range.Свойства. Например, свойства Selection и те же свойства Selection.Range могут существенно различаться.
  • При некоторых типах Selection.Type (например, если выбрано полотно) не работает команда ActiveDocument.Styles.Add .
  • Когда Selection.Range в начале параграфа, команда Selection.Collapse wdCollapseStart иногда переводит курсор в конец предыдущего параграфа.
  • Свойства Selection относятся к активной части документа.
    • Пример:
      ActiveDocument.StoryRanges(Index:=wdFootnotesStory).Select
      Selection.Find.Execute " что-то ищем и находим...
      " до следующей команды Selection находится в FootnotesStory
      " ОШИБКА:
      ActiveDocument.Range(Selection.Start, Selection.End).Select
      " выбрали неизвестно что в главной части документа (wdMainTextStory)
      " ПРАВИЛЬНО:
      Selection.SetRange Selection.Start, Selection.End
  • Без использования буфера, выбранный фрагмент (Selection ), можно копировать и перемещать внутри документа с помощью команд CopyText и MoveText соответственно.

ОБЪЕКТЫ

  • Проверка объекта:
    • Объект is Nothing = True , если объект не определен.
    • IsObjectValid(Объект) <> True , если объект был удален.
      • Рекомендую использовать эту проверку при пакетной обработке объектов в цикле For Each .
      • Кроме удаленных, эта проверка отлавливает и поврежденные объекты (встречаются и такие).
  • Проверка типа объекта:
    • If TypeOf Объект Is Тип Then
  • Имя типа объекта:
    • S = VBA.TypeName(Объект)
  • Запись свойства объекта по имени:
    • CallByName Selection.Find, "Text", vbLet, "стул"
    • Аналог: Selection.Find.Text = "стул"
  • Чтение свойства объекта по имени:
    • S = CallByName(Selection.Find, "Text", vbGet)
    • Аналог: S = Selection.Find.Text
  • Вызов метода объекта по имени:
    • CallByName Selection.Find, "Execute", vbMethod, "стул", True
    • Аналог: Selection.Find.Execute "стул", True
  • Удаляя параграф, вы удаляете прикрепленные к нему рисунки, надписи и другие объекты.
  • При работе с рисунками (объекты Shape и InLineShape ) надо серьезно учитывать версию Word. Результат работы одного и того же кода, в разных версиях Word, может существенно отличаться.
  • Объекты типа Shape , привязывается не к параграфу, а к месту в параграфе. Соответственно работает и ShapeRange .
    • Пример. Знак "разрыв страницы" делит параграф на две части (не на два параграфа). Первая часть будет на одной странице, вторая - на другой. И рисунки можно будет вставлять как на одну страницу, так и на другую, с привязкой к одному и тому же параграфу. Аналогично действует знак "разрыв колонки".
  • Параметр Anchor , при создании Shape , зачастую игнорируется. Помогает вырезание и вставка Shape . В этом случае, Anchor всегда совпадает с местом вставки, что позволяет привязать Shape даже к одному знаку.
    • Пример вставки и привязки фигуры "Сердце":
      Dim R as Range, SH as Shape
      Set R = Selection.Range " место привязки
      R.Collapse wdCollapseStart
      Set SH = ActiveDocument.Shapes.AddShape(msoShapeHeart, 0, 0, 100, 100, R) " глючит
      If R.Start <> SH.Anchor.Start Then " проверка и коррекция
      SH.Anchor.Cut
      R.Paste
      Set SH = R.ShapeRange(1)
      End If
  • При позиционировании Shape на странице - при изменении свойств Top и Left , используйте переменные типа Variant . Иначе, позиция Shape может скакать. Например, при использовании типа Single .

ФОРМА, ПАНЕЛЬ, МЕНЮ

  • Параметр TakeFocusOnClick , у элементов немодальной формы (ShowModal=False ), всегда оставляйте True . Иначе, форма будет либо не получать фокус, когда она не активна, либо терять фокус, когда элемент формы вызывает другой диалог.
  • При создании элементов панели инструментов (кнопок, меню и др.), в команде CommandBarControls.Add параметр Temporary игнорируется. Temporary всегда False , как бы.

РАЗНОЕ

  • При проверке кода символа учитывайте, что функция AscW() может выдать отрицательное число, так как диапазон Unicode от -32768 до 65535.
    • Например, надо проверить, что код символа от 0 до 32:
      if AscW(S) <= 32 then " ошибка!
      if AscW(S) >= 0 and AscW(S) <= 32 then " правильно
  • Команды Copy , Cut , Paste и другие, работающие с буфером обмена, дополняйте командой DoEvents . Иначе, может возникнуть ошибка "в буфере отсутствуют данные или они имеют неверный формат". Особенно актуально при использовании буфера в цикле.
  • При открытии документа в режиме "только для чтения", в нем, тем не менее, могут произойти изменения. При этом, свойство Document.Saved станет равно False . Это происходит из-за параметров документа и Word. Например, при активном параметре "автоматически обновлять связи при открытии".
  • Коллекция Application.Documents включает в себя и скрытые документы, которые нельзя сделать активными (ActiveDocument ).
  • Учитывайте, что Range.Start и Range.Characters.First.Start не всегда совпадают. Например, когда Range.Start внутри перекрестной ссылки, гиперссылки и т.п.
  • Даже когда область Range схлопнута Range.Characters.Count=1 . Поэтому, нулевую длину области надо проверять так:
    If Range.Start = Range.End Then ...
  • Не путать Len(Range.Text) c Range.Characters.Count . Один Character может содержать несколько символов, а значит возможна ситуация когда: Len(Range.Text) > Range.Characters.Count
  • Функция InRange вернет False , если проверяемая область схлопнута и стоит в конце области-родителя. Но вернет True , если схлопнутая область в начале. Такая хитрая логика, не прописанная в документации.
  • Команда Application.Run не возвращает параметры типа Variant . Задавайте тип явно.
    • Пример с ошибкой:
      Sub AAA()
      Dim V As Variant " надо писать As Long
      Application.Run MacroName:="BBB", VarG1:=V
      MsgBox V
      End Sub
      Sub BBB(ByRef V)
      V = 123
      End Sub
  • Команда InsertParagraphBefore/After иногда не срабатывает. Помогает ее замена на: InsertBefore Text:=vbCr .
  • Область с последним символом документа ведет себя нестандартно, что может привести к зацикливанию.
    • Пример:
      ActiveDocument.Range.Characters.Last.Select
      Selection.Collapse Direction:=wdCollapseEnd " глюк здесь
  • Оператор With ... End With аналогичен объявлению и освобождению новой переменной. Имя переменной как бы пустое, а для доступа к ее свойствам достаточно напечатать точку.
    • Пример с ошибкой:
      Dim C As Cell, i As Long
      With Selection
      For i = 1 To Selection.Cells.Count " ячеек несколько
      .Cells(i).Range.Text = "X"
      Next i
      End With
    • Исправленный пример:
      Dim C As Cell, i As Long
      With Selection.Cells
      For i = 1 To .Count
      .Item(i).Range.Text = "X"
      Next i
      End With
  • Переход в начало N-ой страницы документа:
    ActiveDocument.GoTo(wdGoToPage, wdGoToAbsolute, N).Select
    или
    Selection.GoTo(wdGoToPage, wdGoToAbsolute, N)
  • Когда одновременно запущено несколько приложений Word, использующих одну надстройку, невозможно выполнить команду Document.Save для этой надстройки, ее будут блокировать остальные Word-приложения. То есть, если вы храните какие-то данные в теле надстройки, например в переменных (Variables ), сохранить их не получится. Возможно это и хорошо, но если сохранять нужно, используйте ini-файл, реестр или др.


Понравилась статья? Поделитесь ей