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

  • Для определения количества символов в части документа используйте свойство 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-файл, реестр или др.
Дата: 14 сентября 2017 Категория:

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

Все примеры я привожу с помощью MS Word 2013. Если у Вас другая версия программы, описанный функционал может немного отличаться.

Поиск в MS Word

Чтобы начать поиск, выполните на ленте Главная – Редактирование – Найти (или нажмите комбинацию Ctrl+F ).

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

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

Если кликнуть по любому из результатов – курсор переместится к этому слову на листе, и оно будет выделено. В таком случае его легко будет сразу заменить другим текстом.

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

Если нужно задать более строгие параметры поиска – выполните на ленте: Главная – Редактирование – Найти – Расширенный поиск . В открывшемся окне «Найти и заменить» нажмите «Больше».

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

  • Направление – выбрать направление поиска от текущего положения курсора. Везде – во всем документе, Назад – двигаться к началу документа, Вперед – двигаться к концу;
  • Учитывать регистр – учитывает прописные и заглавные буквы. По умолчанию регистр не учитывается;
  • Только слово целиком – исключить результаты, где искомое слово будет частью другого слова. Если не установить эту галку, то, например, поиск слова «кот» отберет для Вас и слово «кот лета», поскольку оно включает в себя искомый текст;
  • Подстановочные знаки – позволяют искать с учетом непечатаемых символов или когда искомая фраза известна не полностью. Например, Вы могли написать «клён», а могли «клен». Чтобы найти это слово в любом случае – используйте подстановочный знак «^?», который обозначает любой символ. Т.е. в строке поиска напишите «кл^?н». Запоминать подстановочные символы необязательно, их cписок открывается по нажатию кнопки «Специальный» в окне «Найти и заменить»;
  • Произносится как – используется только для англоязычных слов, позволяет искать слова, которые одинаково произносятся, но пишутся по-разному;
  • Все словоформы – для поиска слова в любой его словоформе;
  • Учитывать префикс, учитывать суффикс – ищем слова, начинающиеся или заканчивающиеся определенным текстом;
  • Не учитывать знаки препинания – игнорирует запятые, точки и другие знаки препинания
  • Не учитывать пробелы – игнорирует пробелы;
  • Формат – задать поиск по формату текста

Записывайте текст поиска в поле «Найти», устанавливайте нужные параметры поиска и нажимайте «Найти далее». Если результат будет найден – он сразу отобразится на экране. В противном случае, программа сообщит, что по Вашему запросу нет результатов.

Замена текста в Microsoft Word

Часто нужно заменить часть текста другим. Например, изменилось наименование организации, и его нужно исправить во всем документе. Конечно, Вам не придется менять все вручную, воспользуемся встроенными инструментами Ворда.

Сначала откроем окно «Найти и заменить» на ленте, или просто нажмем Ctrl+H (буква латинская). Перейдем на вкладку «Заменить» и в поле «Найти» запишем фразу, которую нужно заменить. Здесь, как и в поиске, можно использовать те же расширенные параметры.

В поле «Заменить на» укажем, каким текстом заместить найденное словосочетание. Если нужно заменить только ближайший результат поиска – жмите «Заменить». Если замену делаем по всему документу – выберите «Заменить все».

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

Советую попрактиковаться с поиском и заменой, используя описанные инструменты. Если Вы будете решать сложные задачи в Word, днями работать с огромными текстами – эти навыки станут полезными уже с первого дня применения. Они входят в «джентльменский набор» любого пользователя, экономят уйму времени и снижают вероятность ошибки при ручных исправлениях.

Вот и все о поиске. А впереди Вас ждет . Прочтите, и никакая досадная ошибка больше не проберется в ваш текст. До встречи в следующей статье!

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 с.

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

1. Можно в интернете поискать таблицу "ASCII", "ANSI" или "Юникод".
2. Использование "Вставка" - "Символ".

Показать

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

В поле "Код знака" код символа может быть в десятичной и шестнадцатеричной системе счисления. Чтобы узнать, в какой системе счисления находится код в поле "Код знака", посмотрите справа поле "из" и что написано на конце в скобках. Там может быть или "(дес.)" или "(шестн.)".

Если "дес", то просто подставляйте код знака, как есть в поле "Найти", добавив спереди символ "^". Если "шестн", то сначала переведите число в десятичную систему счисления (попробуйте найти в интернете онлайн-переводчики), а затем подставляйте в поле "Найти", добавив спереди "^". Если этот символ есть только в таблице "Юникод", то спереди добавьте "^u".

Если в диалоге выделен другой символ, значит в этом диалоге нет информации по данному символу. Такое может быть, например, со спецсимволами, например, с символом "знак абзаца" - ansi-код 13; в этом диалоге коды начинаются с большего кода.

В этом диалоге используется три таблицы символов:
1) ASCII
2) ANSI. Для русского языка таблица "ANSI" в этом диалоге называется "Кириллица".
3) Юникод

Способы, как узнать код символа с помощью программирования

1. Во встроенной vba-справке есть раздел: VBA language reference > Visual Basic language reference > Character Sets.

2. Можно выделить нужный символ в программе "Word", затем нужно перейти в VBA и в окне "Immediate Window" нужно использовать такие коды:
Print Asc(Selection.Text)
или
Print AscW(Selection.Text)
Для кода, полученного первым способом, спереди нужно подставить "^", а во втором случае "^u".

3. Если второй способ даёт неправильный код (такое может быть иногда по непонятным причинам), то тогда такой способ. Скопируйте символ, для которого нужно узнать код, - отобразите окно "Найти и заменить" - вставьте в поле "Найти" скопированный символ - включите запись макросов - щёлкните "Найти" - отключите запись макросов - перейдите в VBA и возьмите код символа из записанного макроса.

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

Примечания

В ворде при поиске и замене нужно спереди кода символа ещё добавлять нули, чтобы было четыре цифры, например: ^0013. Это такой синтаксис. Если просто указать "^13", то не будет работать, если после "^13" будет ещё какой-то текст.

Поиск по документу 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 слово с ошибкой, которое мы внесли случайно, смотрите в статье "