Макрос выделяющий текст в word

1 / 1 / 0

Регистрация: 27.06.2012

Сообщений: 10

1

28.06.2012, 08:46. Показов 49484. Ответов 30


Студворк — интернет-сервис помощи студентам

Добрый день!
Помогите, пожалуйста с кодом макроса!
Дан файл с текстом:

………….
…Олег….
………….
…Иван….
………….

Необходимо выделить и скопировать все, что находится после слова «Олег» до слова «Иван».

Добавлено через 1 час 27 минут
Как поставить курсор после слова «Олег» я понял, но не понимаю, как выделить текст (или сосчитать количество символов) до слова Иван ((



1



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.06.2012, 08:46

30

KoGG

5590 / 1580 / 406

Регистрация: 23.12.2010

Сообщений: 2,366

Записей в блоге: 1

28.06.2012, 11:43

2

Лучший ответ Сообщение было отмечено как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub Выделить_между()
    Dim MyRange As Range, rStart&, rEnd&
    Set MyRange = ActiveDocument.Content
    With MyRange
        With .Find
            .ClearFormatting
            .Text = "Олег"
            .Forward = True
            .Wrap = wdFindStop
            .Format = False
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
            .Execute
            If .Found Then rStart = MyRange.End: rEnd = rStart
        End With
    End With
    Set MyRange = ActiveDocument.Content
    With MyRange
        With .Find
            .Text = "Иван"
            .Execute
            If .Found Then rEnd = MyRange.Start
        End With
    End With
    If rEnd > rStart Then
        ActiveDocument.Range(rStart, rEnd).Select
        Selection.Copy
    End If
End Sub



3



1 / 1 / 0

Регистрация: 27.06.2012

Сообщений: 10

28.06.2012, 13:58

 [ТС]

3

спасибо большое



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

28.06.2012, 20:28

4

Лучший ответ Сообщение было отмечено как решение

Решение

Можно одним поиском обойтись:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Макрос1()
Dim r
Set r = ActiveDocument.Range
With r.Find
    .ClearFormatting
    .Text = "Олег*Иван"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    If .Execute Then
        ActiveDocument.Range(r.Start + 4, r.End - 4).Select
        Selection.Copy
    Else
        MsgBox "Текст не найден!", vbExclamation
    End If
End With
End Sub



4



0 / 0 / 0

Регистрация: 23.10.2013

Сообщений: 4

29.10.2013, 09:53

5

А как быть если в тексте несколько фрагментов, которые нужно выделить по очереди?



0



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

29.10.2013, 10:49

6

Если автоматизировать, то вот от этого можно плясать:

Цитата
Сообщение от Казанский
Посмотреть сообщение

Visual Basic
1
.Text = "Олег*Иван"

Конечно, с подгонкой длины ограничивающих слов:

Цитата
Сообщение от Казанский
Посмотреть сообщение

ActiveDocument.Range(r.Start + 4, r.End — 4).Select

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



0



0 / 0 / 0

Регистрация: 23.10.2013

Сообщений: 4

30.10.2013, 03:13

7

Имеется документ, состоящий из некоторого количества блоков текста. Каждый блок имеет вид [начало] текст [конец]. Текст выгружается из БД, причем без форматирования и каждая строка заканчивается символом абзаца (^p), и приходитсякаждый раз исправлять текст. Я написал макрос, который приводит текстовку в нормальный вид, разбивает на абзацы выбранный фрагмент документа, поэтому приходится постоянно самостоятельно выделять блок текста и выполнять макрос. За реальный абзац я беру только сочетание вида «.^p», остальные заменяю на пробелы. Код, который подсказал KoGG’a выделяет только первый блок, а хотелось бы чтобы происходило поочередное выделение и форматирование каждого блока текста во всем документе.
Спасибо за помощь)



0



0 / 0 / 0

Регистрация: 23.10.2013

Сообщений: 4

30.10.2013, 05:20

9

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



0



Sasha_Smirnov

5561 / 1367 / 150

Регистрация: 08.02.2009

Сообщений: 4,107

Записей в блоге: 30

30.10.2013, 10:17

10

И мне было бы радостно, но с собой не ношу — он в офисе…

Да и воздействует он на весь документ. А вот Автоформат, возможно, на выделение:

VB.NET
1
Selection.Range.Autoformat

(возможно, чушь написал: попробовать не могу: я не в офисе)



0



0 / 0 / 0

Регистрация: 23.10.2013

Сообщений: 4

30.10.2013, 10:23

11

Автоформат выполняется в выделенной области, но опять же, нужно выделить несколько областей, чтобы весь документ был в нормальном виде)



0



361 / 38 / 2

Регистрация: 16.03.2013

Сообщений: 186

31.10.2013, 13:47

13

Как быть, если нужно выделить все вхождения между Иван*Олег?

Иван………..Олег
…………………….
…………………….
Иван…Олег
………………………
Иван…Олег



0



Аксима

6076 / 1320 / 195

Регистрация: 12.12.2012

Сообщений: 1,023

31.10.2013, 17:51

14

Цитата
Сообщение от Slamzor
Посмотреть сообщение

Как быть, если нужно выделить все вхождения между Иван*Олег?

Использовать замечательный код Казанского из поста №4 данной темы, конечно же:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub Ìàêðîñ1()
    Dim r, f As Boolean, firstOccurence As Long
    Set r = ActiveDocument.Range
    Do
        With r.Find
            .ClearFormatting
            .Text = "Èâàí*Îëåã"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
            If .Execute Then
                If f Then
                    If r.Start = firstOccurence Then
                        MsgBox "Áîëüøå íè÷åãî íå íàéäåíî.", vbInformation
                        Exit Do
                    End If
                Else
                    firstOccurence = r.Start
                    f = True
                End If
                ActiveDocument.Range(r.Start + 4, r.End - 4).Select
                MsgBox "Íàéäåí ïîäõîäÿùèé òåêñò...", vbInformation
                Set r = ActiveDocument.Range(r.End, r.End)
            Else
                MsgBox "Òåêñò íå íàéäåí!", vbExclamation
                Exit Do
            End If
        End With
    Loop
End Sub

Как говорится, найдите 10 отличий .

  1. добавил цикл;
  2. ввел строку для обновления диапазона поиска;
  3. ввел проверку для предотвращения поиска уже найденных текстов;
  4. и… все.

С уважением,

Aksima



1



361 / 38 / 2

Регистрация: 16.03.2013

Сообщений: 186

31.10.2013, 18:58

15

Aksima Спасибо. Только это скорее поиск, чем выделение, нельзя этот текст обработать. Подскажите, в какую часть кода можно обрабатывающую часть добавить, например стиль присвоить.
Я начинающий, в такой штуке мне сложно разобраться.



0



Аксима

6076 / 1320 / 195

Регистрация: 12.12.2012

Сообщений: 1,023

31.10.2013, 23:11

16

Цитата
Сообщение от Slamzor
Посмотреть сообщение

нельзя этот текст обработать

Неправда — можно. Замените строчку, отвечающую за выделение текста…

Visual Basic
1
ActiveDocument.Range(r.Start + 4, r.End - 4).Select

…на код обработки текста.

Например, после замены ее на:

Visual Basic
1
ActiveDocument.Range(r.Start + 4, r.End - 4).Style = ActiveDocument.Styles("Ñèëüíîå âûäåëåíèå")

найденный текст будет выделяться стилем «Сильное выделение».

С уважением,

Aksima



2



4 / 4 / 0

Регистрация: 18.02.2013

Сообщений: 539

31.10.2013, 23:15

17

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



0



361 / 38 / 2

Регистрация: 16.03.2013

Сообщений: 186

31.10.2013, 23:50

18

Лучший ответ Сообщение было отмечено как решение

Решение

Aksima спорить не буду). Я имел в виду, что средствами Word … Спасибо еще раз.

койтемиров

Миниатюры

Выделение фрагмента текста в Word, заключенного между заданными словами
 

Выделение фрагмента текста в Word, заключенного между заданными словами
 



0



4 / 4 / 0

Регистрация: 18.02.2013

Сообщений: 539

01.11.2013, 00:22

19

Slamzor, а для чего такая писанина в ворде нужна бывает? к примеру



0



361 / 38 / 2

Регистрация: 16.03.2013

Сообщений: 186

01.11.2013, 08:10

20

Цитата
Сообщение от койтемиров
Посмотреть сообщение

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

В дипломе, в диссертации, в тех документации. Да мало ли где.
Например, можно поправить текст между всеми словами как Рисунок — Таблица. Весь текст привести к единому формату. Макрос универсален, каждый сам себе применение найдет. Единственное, не привязаться к тексту, если он в таблице, у меня в некоторых случаях, вторая часть поиска в таблице находится.



0



Доброго времени суток всем подписчикам и читателям блога scriptcoding.ru. В этой статье мы продолжим изучать класс Selection, который показывает, как выделить фрагмент текста в документе Word.

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

Объект Word Selection содержит довольно много методов, большая часть из которых практически не используется, да и превращать блог в энциклопедию просто нет смысла. Поэтому, я решил разбить описание методов на две статьи, выбрав только те, которые чаще всего используются. В этой первой части я рассмотрю примеры работы с двумя категориями – методы с префиксомInsert и Move. Со второй частью можете ознакомиться в статье «Объект Word Selection — выделение текста, методы #2«.

Содержание

  1. Методы Insert… – выделение фрагментов текста в Word
  2. Методы Insert… – выделение фрагментов текста в Word
  3. Методы Insert… – выделение фрагментов текста в Word
  4. Методы Insert… – выделение фрагментов текста в Word

Методы Insert… – выделение фрагментов текста в Word

как выделить фрагмент в тексте

Примеры будут как для редактора VBA, так и для сценариев Windows Script Host, и так, начнем…

Методы с префиксом Insert… позволяют вставить текст в документ:

InsertAfter(text) и InsertBefore(text) – Вставка текста (text) в конец или в начало выделения. При отсутствии выделения вставка производится там, где находится курсор. Сам материал остается выделенным.

InsertBreak(type) — Вставляет страницу, колонку или секцию. Параметр type содержит значение константы WdBreakType:

  • wdTextWrappingBreak — 11 — Конец текущей строки и продолжение вставки ниже изображения, таблицы или другого объекта. Материал продолжается на следующей пустой строке, которая не содержит таблицу, совмещенную с левой или правой границей.
  • wdLineBreakClearRight — 10 — Перевод на новую строку.
  • wdLineBreakClearLeft — 9 — Перевод на новую строку.
  • wdColumnBreak — 8 — Разрыв колонки.
  • wdPageBreak — 7 — Вставка новой страницы.
  • wdLineBreak — 6 — Перевод на новую строку.
  • wdSectionBreakOddPage — 5 — Начало нового раздела со следующей нечетной страницы.
  • wdSectionBreakEvenPage — 4 — Начало нового раздела со следующей четной страницы.
  • wdSectionBreakContinuous — 3 — Новый раздел без разрыва страницы.
  • wdSectionBreakNextPage — 2 — Начало нового раздела со следующей страницы.

Прежде чем приступать к программированию, стоит сделать некоторое пояснение. По сути, ряд действий будут всегда одинаковыми – создание нового документа (за это будет отвечать функция или процедура Create_Doc). Изменяться будут только вызываемые методы.

Программный код на VBScript:

' ----------------------------------------------------------------------------
' Объект Word Selection - методы
' Пример на языке VBScript - выделение фрагментов Word текста
' Selection-1.vbs
' ----------------------------------------------------------------------------
Option Explicit
' Глобальные переменные
dim oWord, oDoc, oSel, i
 
' Процедура создания нового документа
Sub Create_Doc()
Set oWord = CreateObject("Word.Application")
Set oDoc = oWord.Documents
oDoc.Add()
Set oSel = oWord.Selection
oWord.Visible = True
End Sub
 
Sub Insert_After_Before()
     With oSel
     .Text = "как выделить фрагмент текста "
     .InsertAfter "          ............Конец"
     .InsertBefore "Начало......    "
     .EndOf
     .InsertBreak 6
     End With
End Sub
 
call Create_Doc
call Insert_After_Before

Давайте посмотрим, что данный пример делает. При вызове процедуры Insert_After_Before происходит добавление в документ текстовой строки, далее в конец добавляется фраза » …………Конец», а в начало — «Начало…… «. Потом происходит перевод курсора в конец и добавление перевода строки.

Пример на JScript:

// ----------------------------------------------------------------------------
// Объект Word Selection - методы
// Пример на языке JScript - выделение фрагмента в тексте
// Selection-1.js
// ----------------------------------------------------------------------------
 
// глобальные переменные
var oWord, oDoc, oSel, i
 
function Create_Doc(){
oWord = WScript.CreateObject("Word.Application");
oDoc = oWord.Documents;
oDoc.Add();
oSel = oWord.Selection;
oWord.Visible = true;
}
 
function Insert_After_Before(){
     with(oSel){
                 Text = "как выделить в документе фрагмент текста ";
                 InsertAfter("          ............Конец");
                 InsertBefore("Начало......    ");
                 EndOf();
                 InsertBreak(6);
     }
}
 
Create_Doc();
Insert_After_Before();

Для VBA мы просто запускаем редактор кода, добавляем новый модуль и прописываем код, в моем случае имя модуля — Module1:

Sub Module1()
' ----------------------------------------------------------------------------
' выделение в Word фрагментов текста
' ----------------------------------------------------------------------------
 
Dim oWord1 As Object, oDoc1 As Object, oSel1 As Object, i
 
Set oWord1 = CreateObject("Word.Application")
Set oDoc1 = oWord1.Documents
oDoc1.Add
Set oSel1 = oWord1.Selection
oWord1.Visible = True
 
'***************************************
With oSel1
     .Text = "как выделить фрагмент текста "
     .InsertAfter "          ............Конец"
     .InsertBefore "Начало......    "
     .EndOf
     .InsertBreak wdLineBreak
End With
'***************************************
 
End Sub

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

Методы Insert… – выделение фрагментов текста в Word

InsertCaption(Label, Title, TitleAutoText, Position, ExcludeLabel) — Вставляет заголовок сразу после или перед указанным выбором. Обязательным является только параметр Label.

Label – Нумерационный заголовок. Параметр может быть строкой или значением константы WdCaptionLabelID:

  • wdCaptionEquation — Уравнение
  • wdCaptionFigure — Рисунок
  • wdCaptionTable – Таблица

Если метка (Label) не определена, то возникнет ошибка. Для определения метки надо использовать метод Add коллекции CaptionLabels, например:

Applicationd.CaptionLabels.Add Name:="Рисунок"

Title– Заголовок, который будет отображаться справа от метки.

TitleAutoText– Авто-заголовок, перекрывает параметр Title.

Position— Указывает, будет ли вставлен заголовок выше или ниже. Может быть одной из констант WdCaptionPosition:

  • wdCaptionPositionAbove — 0 — Метка название добавляется выше.
  • wdCaptionPositionBelow — 1 — Метка название добавляется ниже.

ExcludeLabel— TRUE — отключить метку, заданную в параметре Label. FALSE — включить метку. Дополнительно.

Ниже я приведу примеры, что бы не дублировать программный код, я привел только содержимое процедуры Sub Insert_Caption.

' VBScript
Sub Insert_Caption()
     oWord3.CaptionLabels.Add "Номер"
     For i = 0 To 10
                 oSel3.InsertCaption "Номер", "    как выделять фрагменты текста " & i
                 oSel3.InsertBreak 6
     Next
End Sub

Тут используется цикл for для вставки нескольких фрагментов — «Урок 6 по VBScript: Циклы for…next и for each…next«.

//JScript
function Insert_Caption(){
oWord4.CaptionLabels.Add("Номер");
     for (i = 0; i<=10; i++){
                 oSel4.InsertCaption("Номер", "    выделение фрагмента текста " + i);
                 oSel4.InsertBreak(6);
     }
}

Тут тоже используется цикл for, но уже для JS кода — «Урок 9 по JScript — оператор цикла for«.

' VBA
oWord5.CaptionLabels.Add "Номер"
For i = 0 To 10
     oSel5.InsertCaption Label:="Номер", Title:="    Фраза VBA Selection " & i
     oSel5.InsertBreak wdLineBreak
Next

Обратите внимание, чтоимена переменных в примерах отличаются, это пришлось сделать с технических причин – в глазах поисковых систем статья становится заспамленой. Хорошо, давайте двигаться дальше.

Методы Insert… – выделение фрагментов текста в Word

как можно выделить фрагмент текста

InsertDateTime(DateTimeFormat) – Метод позволяет вставить дату или время в документ, или одновременно оба значения. Помимо параметра DateTimeFormat есть еще четыре, но они практически не используются.

DateTimeFormat – Необязательный параметр, позволяет указать формат даты и времени.

' VBScript
Sub Insert_Date
    With oSel4
        .Text = "как выделить фрагмент текста "
        .EndOf
        .InsertBreak 6
        .InsertDateTime
        .InsertBreak 6
        .InsertDateTime "MMMM dd, yyyy"
        .InsertBreak 6
        .InsertDateTime "MMMM dd, yyyy - H:M:S"
    End With
End Sub

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

//JScript
function Insert_Date(){
    with(oSel4){
        Text = " выделение фрагментов Word текста ";
        EndOf();
        InsertBreak(6);
        InsertDateTime();
        InsertBreak(6);
        InsertDateTime("MMMM dd, yyyy");
        InsertBreak(6);
        InsertDateTime("MMMM dd, yyyy - H:M:S");
    }
}

Тут логика работы аналогична.

' VBA
With oSel5
     .Text = " как выделить в Word фрагмент текста "
     .EndOf
     .InsertBreak wdLineBreak
     .InsertDateTime
     .InsertBreak wdLineBreak
     .InsertDateTime "MMMM dd, yyyy"
     .InsertBreak wdLineBreak
     .InsertDateTime "MMMM dd, yyyy - H:M:S"
End With

Хорошо, осталось рассмотреть последнюю третью часть статьи.

Методы Insert… – выделение фрагментов текста в Word

InsertFile(FileName) – Позволяет вставить содержимое указанного файла в документ, параметр FileName хранит имя или путь к файлу, если путь отсутствует, то будет подразумеваться текущий каталог.

InsertNewPage — Вставляет новую страницу в место, где находится указатель.

InsertParagraph— Заменяет выделение знаком абзаца.

InsertParagraphAfter— Вставляет знак абзаца после выделения .

InsertParagraphBefore— Вставляет новый абзац перед выделением.

Методы с префиксом Move… также встречаются едва ли не в любой программе, связанной с вводом текста в Word. Самые важные и удобные из этих методов:

MoveLeft(), MoveRight(), MoveUp(), MoveDown() – Методы дают возможность переместить курсор влево, вправо, вверх и вниз. Все четыре метода принимают следующие параметры (Unit, Count, Extend), являющиеся необязательными:

Unit — Блок, по которым выбор должен быть перемещен. Параметр Unit содержит значения константы wdUnits.

Count – Единица перемещения. Значение по умолчанию 1.

Extend — Может быть либо wdMove (по умолчанию) или wdExtend.

MoveEnd(), MoveStart() – Перемещение курсора в конец или начало выделения, параметры — Unit, Count.

MoveStartUntil(), MoveStartWhile(), MoveEndUntil(), MoveEndWhile() – Позволяют переместить курсор к заданному символу или последовательности символов. Параметры Cset (обязательный) и Count (дополнительный):

Cset — Один или несколько символов. Аргумент является чувствительным к регистру.

Count – Задает целое или отрицательное значение, на которое происходит перемещение курсора.

Move(Unit, Count) – Фактически, тут мы может указать направление (Count) и текстовую единицу (Unit).

Логика работы для следующих примеров остается та же – меняется только код вызываемой процедуры. Фактически, код для языка VBScript и VBA является идентичным.

' VBScript
Sub Get_Move()
With oSel6
     ' вставляем в документ фразу сто раз
     For i = 0 To 10
                 .Text = "как выделить фрагменты нужного текста "
                 ' Перемещаем курсор в конец
                 .EndOf
     Next
 
     For i = 0 To 300
                 .MoveLeft
     Next
 
     For i = 0 To 100
                 .MoveRight
     Next
 
     For i = 0 To 4
                 .MoveUp
     Next
 
     .MoveStartUntil "Word"
 
     For i = 0 To 15
                 .Move 2, 5
     Next
End With
End Sub

Видим, что в данном коде мы использовали несколько операторов for.

//JScript
function Get_Move(){
with(oSel6){
     for (i=0; i<=10; i++){
                 .Text = "Текстовая строка: выделение фрагментов текста  ";
                 .EndOf();
     }
 
     for (i=0; i<= 300; i++){ .MoveLeft(); }
     for (i=0; i<= 100; i++){ .MoveRight(); }
     for (i=0; i<= 4; i++){ .MoveUp(); }
     .MoveStartUntil("Word");
     for (i=0; i<= 15; i++){ .Move(2, 5); }
}
}

Обратите внимание на приведенные в самом начале статьи примеры кода для языков VBA и VBScript, в макросе мы можем использовать именованные константы объекта Word, но в теле Windows Script Host сценария нет, так как там они не доступны. Описание свойств класса Selection я рассмотрел в этой статье.

Условие: Написать макрос для Word, который запрашивает слово и выделяет его каким-либо образом в тексте.

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

[code lang=»vb»]
Sub Выделение()
Dim Выделение As String
Выделение = InputBox(«Введите слово для выделения», «Выделяем слова»)
If Выделение = Empty Then Exit Sub
For Each i In ActiveDocument.Words()
With Selection.Find
.Text = Выделение
.Replacement.Text = «»
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
If Not Selection.Font.ColorIndex = wdBlue Then
Selection.Font.ColorIndex = wdBlue
Selection.MoveRight Unit:=wdWord, Count:=1
Else
MsgBox «Выделение закончено!»
Exit Sub
End If
Next i
End Sub
[/code]

Получается такое: говорим пользователю, а введи-ка нам слово для поиска. А он и вводит. Это слово пишется в переменную, которая называется «Выделение«. Далее проверка. Если пользователь решил ничего не вбивать — выйти. А дальше основной цикл, с помощью которого перебираются все слова документа с текстом из переменной. Далее исполняем поиск по заданным параметрам и начинаем выделять слова.

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

Когда-то да не выделенные слова закончатся. И тогда вывести сообщение: Выделение закончено!

In VBA for Word 2007, I want to be able to open a document, highlight sections of text and replace those sections with fields linked to a docvariables. The process would be:

  1. Open document.
  2. Select text.
  3. Select docvariable from list.
  4. Insert field linked to selected docvariable.
  5. Repeat steps 1-4 as required.

There is no way to know beforehand what the text to be selected is or which docvariable is going to be linked to which field or how many times these steps are going to be repeated.

Only with Microsoft could the most absolutely fundamental, simple task of allowing the user to make a selection at run-time and pass this selection back to sub-routine be so tortuous and surreal. I have spent 2 days trying to figure this out. If anyone can help, I will name my next child after you.

Berkay Turancı's user avatar

asked Apr 2, 2009 at 14:31

david's user avatar

1

I think «tortuous and surreal» is a misconception.

Create a small form with a dropdown (named "selVarName", for example) that lets you select all document variable names available. Link the form to a custom button in the Quick Access Toolbar.

Upon clicking «OK» in this form do something like this:

Private Sub btnOK_Click()
  Dim v As Word.Variable
  Dim n As String

  n = Me.selVarName.Value
  With Selection
    For Each v In .Document.Variables
      If v.Name = n Then v.Delete: Exit For
    Next v
    .Document.Variables.Add n, .Range.Text
  End With
End Sub

And this has bells and whistles already. You can do additional checking like «no text selected», for example.

answered Apr 2, 2009 at 14:55

Tomalak's user avatar

TomalakTomalak

330k66 gold badges523 silver badges623 bronze badges

3

Макрос для Word2003 Выделение слов

svoyak

Дата: Четверг, 31.08.2017, 07:51 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Доброго дня!
Очень нужен макрос для выделения цветом слов в документе.
Есть список слов порядка 100 шт. и он постоянно дополняется.
И так же есть множество документов в которых слова из списка нужно либо исправить, либо удалить, либо оставить — на усмотрение редактирующего.
Нашел такой:
[vba]

Код

Sub PaintGrey()
Selection.Find.ClearFormatting
Options.DefaultHighlightColorIndex = wdRed
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True ‘ подсветка
With Selection.Find
.Text = «ght» ‘ текст для поиска
.Replacement.Text = «ght» ‘ текст для замены
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

[/vba]
Но он мне не подходит, так как нужно под каждое слово, копировать часть макроса, вставлять слово 2 раза и так 100 раз(((
Хотелось бы, что бы можно было их через запятую, что-ли написать и в любой момент дополнить если нужно.

Сообщение отредактировал svoyakЧетверг, 31.08.2017, 08:00

 

Ответить

китин

Дата: Четверг, 31.08.2017, 07:54 |
Сообщение № 2

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

svoyak

Дата: Четверг, 31.08.2017, 08:03 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

китин, Исправил, сори))) Надеюсь так пойдёт?
просто меня пинают чуть-чуть), вот в попыхах ищу выход.

 

Ответить

Pelena

Дата: Четверг, 31.08.2017, 08:06 |
Сообщение № 4

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Файлик с примером бы ещё для тренировки
И вот это

либо исправить, либо удалить, либо оставить — на усмотрение редактирующего

не понятно, как Вы хотите реализовать


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

svoyak

Дата: Четверг, 31.08.2017, 08:34 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, Список слов пока в отдельном файле, а документы просто текстовый файл в word — смысла в нём не много будет

Цитата svoyak, 31.08.2017 в 07:51, в сообщении № 1 ( писал(а)):
либо исправить, либо удалить, либо оставить — на усмотрение редактирующего
не понятно, как Вы хотите реализовать

Допустим у меня есть текст в котором слово «привет» есть 3 раза, слово «пока» — 2 раза, словосочетание «не менее» — 2 раза и так далее ещё 50 слов или больше.
Так вот нужно, чтобы макрос просто выделил все эти слова ЦВЕТОМ за 1 нажатие и всё!

Сообщение отредактировал svoyakЧетверг, 31.08.2017, 08:36

 

Ответить

Pelena

Дата: Четверг, 31.08.2017, 08:49 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

[vba]

Код

Sub PaintGrey()
    Dim xfind(), i&
    xfind = Array(«привет», «пока», «не менее»)
    Selection.Find.ClearFormatting
    Options.DefaultHighlightColorIndex = wdRed
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True    ‘ подсветка
    For i = 0 To UBound(xfind)
        With Selection.Find
            .Text = xfind(i)    ‘ текст для поиска
            .Replacement.Text = xfind(i)    ‘ текст для замены
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Next i
End Sub

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

svoyak

Дата: Четверг, 31.08.2017, 08:54 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, Огромное вам человеческое спасибо!!!
Всё работает отлично!!!

 

Ответить

svoyak

Дата: Четверг, 31.08.2017, 11:11 |
Сообщение № 8

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, А можно попросить тоже самое только для Excel?
А то документы идут не только в word

 

Ответить

Pelena

Дата: Четверг, 31.08.2017, 11:37 |
Сообщение № 9

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Думаю, макрос будет уже другой.
Создайте тему в разделе ВОПРОСЫ ПО EXCEL, опишите задачу, приложите файл с примером


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

svoyak

Дата: Пятница, 01.09.2017, 05:21 |
Сообщение № 10

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, Вы знаете, появилась другая проблема. Список слов большой:
(«более», «менее», «не более», «не менее», «наиболее», «наименее», «меньше», «больше», «не меньше», «не больше», «ниже», «выше», «не ниже», «не выше», «не хуже», «не лучше», «должен быть», «должна быть», «должно быть», «должны быть», «не должен быть», «не должна быть», «не должно быть», «не должны быть», «должен иметь», «должна иметь», «должно иметь», «должны иметь», «не должен иметь», «не должна иметь», «не должно иметь», «не должны иметь», «должен равняться», «должна равняться», «должно равняться», «должны равняться», «не должен равняться», «не должна равняться», «не должно равняться», «не должны равняться», «должен обеспечиваться», «должна обеспечиваться», «должно обеспечиваться», «должны обеспечиваться», «не должен обеспечиваться», «не должна обеспечиваться», «не должно обеспечиваться», «не должны обеспечиваться», «возможно», «вероятно», «примерно», «возле», «либо», «может», «в основном», «и другое», «в пределах», «ориентировочно», «до», «от», «возможно», «иным», «иные», «иной», «иная», «или», «или иным», «или иные», «или иной», «или иная», «или эквивалент», «или эквивалентно», «или эквивалентное», «или эквивалентны», «или эквивалентные», «или эквивалентных», «прочий», «прочая», «прочие», «около», «расположен около», «ориентировочно», «примерно», «приближающегося», «приблизительно»)

А они не влазят в 1 строчку все, а на две он их разбивать не хочет. Не знаю как их всех туда запихать.(

 

Ответить

svoyak

Дата: Пятница, 01.09.2017, 05:28 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, Всё, сам разобрался, спасибо)

 

Ответить

Pelena

Дата: Пятница, 01.09.2017, 11:20 |
Сообщение № 12

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Если слов много, можно их в отдельный файл выписать в столбик и такой макрос применить. Файл список слов должен находиться в той же папке
[vba]

Код

Sub PaintGrey()
    Dim xfind(), xrepl(), i&
    Dim WDoc As Object
    Dim pr As Paragraph
    Set WDoc = Documents.Open(ThisDocument.Path & «» & «список слов.docx»)
    For Each pr In ActiveDocument.Paragraphs
        i = i + 1
        ReDim Preserve xfind(1 To i)
        xfind(i) = Left(pr.Range.Text, Len(pr.Range.Text) — 1)
    Next pr
    WDoc.Close
    ThisDocument.Activate
    Selection.Find.ClearFormatting
    Options.DefaultHighlightColorIndex = wdRed
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True    ‘ подсветка
    For i = 1 To UBound(xfind)
        With Selection.Find
            .Text = xfind(i)    ‘ текст для поиска
            .Replacement.Text = xfind(i)    ‘ текст для замены
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Next i
End Sub

[/vba]

К сообщению приложен файл:

Word.rar
(67.9 Kb)


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

serejaa

Дата: Воскресенье, 24.09.2017, 00:10 |
Сообщение № 13

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena, подскажите что я делаю не так. со скриптами встретился впервые.
первый ваш вариант добавил в ворд2016, работает отлично. но со вторым проблема. Выдаёт ошибку
Run-time error ’91’:
Object variable or With block variable not set
пробовал копировать скрипт и копировать файл «список слов.docx», всегда ошибка.

К сообщению приложен файл:

8370051.jpg
(13.4 Kb)

 

Ответить

Pelena

Дата: Воскресенье, 24.09.2017, 07:35 |
Сообщение № 14

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Как же я могу подсказать, если не вижу Ваши файлы? По картинке лечить не умею.
Ошибка Object variable or With block variable not set говорит о том, что объектная переменная не определена. В макросе только одна объектная переменная WDoc. Значит, проблемы с открытием файла список слов.docx
Проверила свои файлы из сообщения 12 на Excel 2016, у меня макрос сработал


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

serejaa

Дата: Суббота, 11.11.2017, 00:31 |
Сообщение № 15

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

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

[vba]

Код

Sub PaintYellow()
Dim xfind(), i&
xfind = Array(«привет», «пока», «менее»)
Selection.Find.ClearFormatting
Options.DefaultHighlightColorIndex = wdYellow
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True ‘ подсветка
For i = 0 To UBound(xfind)
With Selection.Find
.Text = xfind(i) ‘ текст для поиска
.Replacement.Text = xfind(i) ‘ текст для замены
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Next i
End Sub

[/vba]

Сообщение отредактировал serejaaСуббота, 11.11.2017, 00:32

 

Ответить

serejaa

Дата: Суббота, 11.11.2017, 01:55 |
Сообщение № 16

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

уже не надо, сам разобрался. :)

 

Ответить

serejaa

Дата: Среда, 24.07.2019, 14:12 |
Сообщение № 17

Группа: Пользователи

Ранг: Прохожий

Сообщений: 4


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Pelena,
подскажите пожалуйста что сделать, если список слов не помещается в 1 строку в макросе?

Sub PaintGrey()
    Dim xfind(), i&
    xfind = Array(«привет», «пока», «не менее»)
    Selection.Find.ClearFormatting
    Options.DefaultHighlightColorIndex = wdRed
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True    ‘ подсветка
    For i = 0 To UBound(xfind)
        With Selection.Find
            .Text = xfind(i)    ‘ текст для поиска
            .Replacement.Text = xfind(i)    ‘ текст для замены
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    Next i
End Sub

 

Ответить

Pelena

Дата: Среда, 24.07.2019, 14:23 |
Сообщение № 18

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Чтобы разбить строку в макросе, надо в конце поставить пробел, знак подчеркивания и нажать Enter, тогда следующая строка будет продолжением предыдущей.
Или посмотрите вариант в сообщении 12


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Макрос выделить все таблицы word
  • Макрос выделения значения excel
  • Макрос выделения диапазона ячеек excel
  • Макрос выделения всей строки excel
  • Макрос вывода на печать excel