Как выделить абзац vba word

0 / 0 / 0

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

Сообщений: 23

1

07.11.2010, 16:14. Показов 21243. Ответов 22


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

Помогите разобраться пожалуйста и написать макрос.
Сразу признаюсь, что я не программист, хотя мне многое интересно.
Очень часто приходится использовать выделение текста в ворде. Использую вордовскую настройку выделения текста по абзацам посредством горячих клавиш Сtrl+Shift+Стрелка вниз(Стрелка вверх). Но проблема заключается в том, что возникает необходимость выделять текст как по абзацам, так и по разрывам строк сразу. Как написать такой макрос, который выделял бы текст как по абзацам так и по разрывам строки всю голову уже сломала. Макрос выделяет либо только по абзацам и все, либо только по разрывам строк.
Да в таблицах текст он должен тоже выделять как по абзацам так и по разрывам строк, но учитывать аналогию выделения текста в столбцах стандартного вордовского макроса (Сtrl+Shift+Стрелка вниз(Стрелка вверх)). Он там как то по столбцам хитро выделяет.

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

В итоге мне нужно, чтобы было 2 макроса по аналогии:
1) Сtrl+Shift+Стрелка вниз и
2) Сtrl+Shift+Стрелка вверх
Но с добавлением возможности выделять текст как по абзацам так и по разрывам строк.

Вот пример моей неудачной попытки:

Sub Мак1()
If Chr(11) <> Chr(13) Then
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil Cset:=Chr(11)
Else
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil Cset:=Chr(13)
End If
End Sub

Точно также интересует создать 2 макроса, но уже для перехода внутри документа по тексту сразу как по абзацам, так и по разрывам строк, как в предыдущем вопросе. Т.е. по аналогии Ctrl+Стрелка вниз(Стрелка вверх).



0



Busine2009

Заблокирован

07.11.2010, 16:22

2

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



0



0 / 0 / 0

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

Сообщений: 23

07.11.2010, 16:36

 [ТС]

3

вот фрагмент документа.

Как выделить текст по абзацам и разрывам строк в Word?



0



Busine2009

Заблокирован

07.11.2010, 16:40

4

natawka,
а почему надо, чтобы курсор не убегал? Тогда вы не сможете отследить то ли выделено или не то.
Да и прежде, чем выдумывать коды, надо использовать макрорекордер: Сервис — Макрос — Начать запись. С помощью него я уже нашёл, как выделять по абзацам, только курсор убегает:

Visual Basic
1
2
3
4
5
6
7
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 07.11.2010 Никита
'
    Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
End Sub



0



0 / 0 / 0

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

Сообщений: 23

07.11.2010, 17:05

 [ТС]

5

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

Selection.MoveEndUntil Cset:=Chr(11)

посзволяет выделять непосредственно до знака разрыв строки «Chr(11)» или же знака абзаца «Chr(13)»

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

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



0



Busine2009

Заблокирован

07.11.2010, 17:10

6

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

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

про это не понятно, вставьте скриншот.

Т.е. знак абзаца не должен быть выделен? Должен быть выделен текст именно до знака абзаца?

Т.е. при нажатии на кнопку текст выделяется до следующего абзаца, затем нажимаем ещё раз — снова выделяется до следующего абзаца, но если в абзаце есть разрыв строки, то выделение будет осуществлено до разрыва строки?

Разрывы строк в данном случае (на мой взгляд) не нужны. Нужно их заменить на знаки абзаца. Тогда проблема уйдёт. Когда делаются списки, то разрывы строк не ставят — ставят знаки абзаца.



0



0 / 0 / 0

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

Сообщений: 23

07.11.2010, 18:45

 [ТС]

7

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

про это не понятно, вставьте скриншот.

Т.е. знак абзаца не должен быть выделен? Должен быть выделен текст именно до знака абзаца?

Т.е. при нажатии на кнопку текст выделяется до следующего абзаца, затем нажимаем ещё раз — снова выделяется до следующего абзаца, но если в абзаце есть разрыв строки, то выделение будет осуществлено до разрыва строки?

Варианты 1 и 2 — это то как мне нужно. Текст выделяется до знака абзаца или же знака разрыв строки, при этом текст выделенный только до середины экрана. Невыделенная часть текста остается внизу, я ее могу наблюдать (видеть). Если же мне нужно выделять текст дальше по каким то необходимым причинам, то текст должен двигаться, при этом выделенная часть текста должна быть относительно курсора. На рисунках как видите это середина экрана, потому что курсор мой находился по середине экрана в тексте:

Как выделить текст по абзацам и разрывам строк в Word?

Как выделить текст по абзацам и разрывам строк в Word?

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

Как выделить текст по абзацам и разрывам строк в Word?

Разрывы строк в данном случае (на мой взгляд) не нужны. Нужно их заменить на знаки абзаца. Тогда проблема уйдёт. Когда делаются списки, то разрывы строк не ставят — ставят знаки абзаца.

А вот здесь не Вам решать и даже не мне, где в каком случае разрывы строк нужны, а в каком случае нет. Это зависит не от меня. Я не имею права самостоятельно редактировать (форматировать) текст исполненный в том оригинале, в котором мне его передают. Моя бы воля я бы вообще разрывы строк (как и лишние пустые абзацы, кстати сказать) не использовала, т.к. не вижу в них смысла и до определенного момента даже с ними и не сталкивалась.



0



Busine2009

Заблокирован

07.11.2010, 18:55

8

natawka,
и выделять нужно именно до самого знака абзаца (разрыва строки), т.е. сам знак абзаца (разрыв строки) не должны быть выделены? А зачем это?



0



0 / 0 / 0

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

Сообщений: 23

07.11.2010, 19:30

 [ТС]

9

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

и выделять нужно именно до самого знака абзаца (разрыва строки), т.е. сам знак абзаца (разрыв строки) не должны быть выделены? А зачем это?

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

строго

от начала курсора и до знака либо chr(11), либо chr(13).

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



0



Busine2009

Заблокирован

07.11.2010, 20:15

10

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

Visual Basic
1
2
3
4
Sub Мак1()
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
End Sub



0



kukuruku310

306 / 187 / 26

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

Сообщений: 540

07.11.2010, 20:56

11

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
36
37
38
' для движения вниз
Sub Мак1()
  Dim bPos As Long
  Dim ePos As Long
  
  ' чесно(очень) говоря, я не понял смысла строки "If Chr(11) <> Chr(13) Then", и других мыслей, как найти _
    разрыв строки или разрыв абзаца по-другому не нашел, поэтому побуквенно двигаемся по тексту, пока не встретим _
    тот или другой. Это, конечно, приводит к неприятному мельканию экрана, но как это устранить тоже не нашел. _
    Как вариант, можно использовать не Selection, а двигаться по paragraph.range.text, но это, насколько знаю, _
    работает гораздо дольше, в общем это только идея, а уж усовершенствовать ее/придумать что-то получше - в Ваших руках
 
  Application.ScreenUpdating = False ' мертвому припарка - то же мерцание
  ' запомнили текущее выделение
  bPos = Selection.Start
  ePos = Selection.End
  
  ' переходим в конец текущего выделения и проверяем, что за символ оказался перед нашим носом
  Selection.EndKey
  ' если это разрыв строки/абзаца - пропускаем его и ищем следующий
  If Selection.Text = Chr(11) Or Selection.Text = Chr(13) Then Selection.MoveRight
  Do While Selection.Text <> Chr(11) And Selection.Text <> Chr(13)
    Selection.MoveRight
  Loop
  
  ' запомнили, где остановились
  ePos = Selection.Range.End
 
  ' не нашел объекта, в свойствах которого можно было бы определить, где на текущем виде экрана располагается _
    тот или другой текст, поэтому просто опускаемся на 2 параграфа вниз, _
    (если на фиксированное число строк, то можно заменить на wdLine)
  Selection.MoveDown wdParagraph, 2
  
  ' восстанавливаем выделение
  Selection.End = ePos
  Selection.Start = bPos
  
  Application.ScreenUpdating = True '...
End Sub

P.S. для текста в таблицах, надо, конечно учитывать еще и знак конца ячейки



0



Busine2009

Заблокирован

07.11.2010, 21:21

12

Мой вариант, как продвигаться вниз, правда я логики так и не понял (я про «And»), но работает:

Visual Basic
1
2
3
4
5
6
Sub m_2()
Selection.HomeKey unit:=wdLine
Do
    Selection.MoveDown unit:=wdLine, Count:=1
Loop While Selection.Previous <> Chr(11) And Selection.Previous <> Chr(13)
End Sub



0



natawka

0 / 0 / 0

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

Сообщений: 23

07.11.2010, 21:30

 [ТС]

13

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

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

Visual Basic
1
2
3
4
Sub Мак1()
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
End Sub

Спасибо, но не во всех местах это срабатывает, в таблице так не получается, если ячейки объединенные.
В 1-ом случае выделяет до последней ячейки во 2 столбце

Как выделить текст по абзацам и разрывам строк в Word?

Дальше выделяет следующую ячейку уже в 1 столбце игнорируя выделения текста всех ячеек во 2 столбце

Как выделить текст по абзацам и разрывам строк в Word?

Ну дальше он выделяет как полную строку, но уже захватывает следующую строку.

Как выделить текст по абзацам и разрывам строк в Word?

И еще, у меня вопрос, а как сделать тогда наоборот? Т.е. снимать выделение по тому же принципу.



0



Busine2009

Заблокирован

07.11.2010, 21:47

14

natawka,
вот такой вариант с поднятием текста:

Visual Basic
1
2
3
4
5
6
7
Sub Мак1()
Application.ScreenUpdating = False
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
ActiveWindow.ScrollIntoView Selection.Range, False
Application.ScreenUpdating = True
End Sub

Добавлено через 1 минуту

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

снимать выделение по тому же принципу.

т.е. вверх что ли подниматься?

Добавлено через 1 минуту

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

в таблице так не получается

а вручную получается так?



0



natawka

0 / 0 / 0

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

Сообщений: 23

07.11.2010, 22:19

 [ТС]

15

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

Здесь есть минусы

:
1) выделяет со знаками chr(11) и chr(13)
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
Sub мак1()
'недоделано про таб.
'Выделяет текст как разрыву строки, так и по абзацу
   On Error Resume Next
    'If (Clcn = 0) Or (Clcn = 1) Then
    If (Selection.Tables(1).Rows.Count < 0) Then
        Do
        'Selection.MoveEnd wdCharacter, 1
        Selection.MoveEnd wdLine
        Loop Until (Asc(Selection.Characters.Last) = 11) _
        Or (Asc(Selection.Characters.Last) = 13)
    Else
    rc = Selection.Rows.Count
    'Clcn = Selection.Cells.Count
    'clmn = Selection.Columns.Count
        Do
        'Selection.MoveEnd wdCharacter, 1
        Selection.MoveEnd wdRow
        'Selection.MoveEnd wdCell, 1
        'Selection.MoveEnd wdColumn, 1
        Loop Until (Asc(Selection.Characters.Last) = 11) _
        Or (Asc(Selection.Characters.Last) = 13)
    End If
End Sub

Ребят, если сделать про chr(11) и chr(13) не получается, то фиг с ним, хотя бы так. НО вот как сделать чтобы после таблицы дальше продолжал выделение как ни в чем не бывало????

Добавлено через 16 минут
Busine2009,

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

natawka,
вот такой вариант с поднятием текста:

Visual Basic
1
2
3
4
5
6
7
Sub Мак1()
Application.ScreenUpdating = False
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
ActiveWindow.ScrollIntoView Selection.Range, False
Application.ScreenUpdating = True
End Sub

Добавлено через 1 минуту

т.е. вверх что ли подниматься?

Добавлено через 1 минуту

а вручную получается так?

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



0



Busine2009

Заблокирован

07.11.2010, 22:54

16

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

в таблице так не получается

а вручную получается?

Добавлено через 1 минуту

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

пустые абзацы не выделяет

а зачем их выделять?

Добавлено через 29 секунд

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

и в таблице глючит.

я в таблице не тестировал.

Добавлено через 20 минут
natawka,
вот такой ещё вариант поднятия:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Мак1()
Dim pLeft As Long
Dim pTop As Long
Dim pWidth As Long
Dim pHeight As Long
Dim vСчётчик As Long
Application.ScreenUpdating = False
ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range.Characters.Last
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
Do While pTop > 300
    ActiveWindow.SmallScroll Down:=1
    ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range.Characters.Last
    vСчётчик = vСчётчик + 1
    If vСчётчик > 5 Then
        Exit Sub
    End If
Loop
Application.ScreenUpdating = True
End Sub

Добавлено через 55 секунд

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

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

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

Добавлено через 2 минуты

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

НО вот как сделать чтобы после таблицы дальше продолжал выделение как ни в чем не бывало????

т.е. пропустить таблицу и дальше двигаться?



1



natawka

0 / 0 / 0

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

Сообщений: 23

07.11.2010, 23:00

 [ТС]

17

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

а вручную получается?

Добавлено через 1 минуту

а зачем их выделять?

Добавлено через 29 секунд

я в таблице не тестировал.

Добавлено через 20 минут
natawka,
вот такой ещё вариант поднятия:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Мак1()
Dim pLeft As Long
Dim pTop As Long
Dim pWidth As Long
Dim pHeight As Long
Dim vСчётчик As Long
Application.ScreenUpdating = False
ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range.Characters.Last
Selection.MoveRight , 1, Extend:=wdExtend
Selection.MoveEndUntil cset:=Chr(13) & Chr(11)
Do While pTop > 300
    ActiveWindow.SmallScroll Down:=1
    ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range.Characters.Last
    vСчётчик = vСчётчик + 1
    If vСчётчик > 5 Then
        Exit Sub
    End If
Loop
Application.ScreenUpdating = True
End Sub

Добавлено через 55 секунд

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

Добавлено через 2 минуты

т.е. пропустить таблицу и дальше двигаться?

О, ура, оно самое, именно это с поднятием экрана мне и нужно было



0



306 / 187 / 26

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

Сообщений: 540

07.11.2010, 23:13

18

пустые абзацы не выделяет, стопорится и в таблице глючит.

чтобы не останавливалось на пустых абзацах напишите вместо «If условие Then» «Do While условие»
А режимы обработки таблицы и текста надо по-любому разделять. Т.к. у Вас никогда не получится выделить кусок текста и кусок строки внутри таблицы, да даже куски текста внутри разных ячеек таблицы. А определить переход в таблицу достаточно просто: Selection.Tables.Count > 0



0



0 / 0 / 0

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

Сообщений: 23

07.11.2010, 23:27

 [ТС]

19

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

т.е. пропустить таблицу и дальше двигаться?

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

Добавлено через 10 минут

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

чтобы не останавливалось на пустых абзацах напишите вместо «If условие Then» «Do While условие»
А режимы обработки таблицы и текста надо по-любому разделять. Т.к. у Вас никогда не получится выделить кусок текста и кусок строки внутри таблицы, да даже куски текста внутри разных ячеек таблицы. А определить переход в таблицу достаточно просто: Selection.Tables.Count > 0

Спасибо, приму к сведению.



0



Busine2009

Заблокирован

07.11.2010, 23:34

20

natawka,
обратная вибиистическая задача:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Макрос1()
Application.ScreenUpdating = False
If Selection.Range.ComputeStatistics(wdStatisticLines) = 1 Then
    Exit Sub
End If
Do While Selection.Words.Last <> Chr(11) And Selection.Words.Last <> Chr(13)
    Selection.MoveLeft unit:=wdWord, Count:=1, Extend:=wdExtend
    If Selection.Range.ComputeStatistics(wdStatisticLines) = 1 Then
        Exit Sub
    End If
Loop
Selection.MoveLeft unit:=wdCharacter, Count:=1, Extend:=wdExtend
Application.ScreenUpdating = True
End Sub

Добавлено через 1 минуту
natawka,
так ты ответишь на вопрос или нет: при ручном выделении у тебя всё нормально выделяется в таблицах (3 раз уже спрашиваю)?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

07.11.2010, 23:34

Помогаю со студенческими работами здесь

Выделить красным нежирный текст (MS Word)
Добрый день!
Возможно, элементарный вопрос, но я как-то не додумался как сделать грамотно.

Есть…

Выделить текст между двумя пустыми строками в документе Word
есть документ в формате doc, как выделить заголовок между 2мя пустыми строками. Спасибо

Нужно последовательно выводить текст разделённый по абзацам из файла
Делаю тест в консоли. Выводится первый вопрос из файла, пользователь вводит ответ- выводится…

Считать текст из текстового файла, вставить в Word, выделить цветом слова по критерию
помогите пожалуйста сделать((очень надо

Задание. С помощью программных средств VBA разработать…

Выделить из двух последних строк на странице документа Word цифры и записать их в строковую переменную
Есть несколько типов документов в rtf, каждый на ~1000 страниц, внутри счета и квитанции. Есть…

Как выделить текст жирным (не ключевое слово, а простой текст)?
Я выделяю ключевые слова тегом &lt;strong&gt;. А как выделить «обычные слова», которые не являются…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

I’ve modified your code sample and this works for me. Since you already declare and assign a Range to BIOCell you can use that throughout your macro to identify the cell contents. There’s no need to use the «Like» test since Range.Find.Execute returns True if successful, otherwise False. When Find is successful, the Range will change to what has been found (in other words it’s no longer the entire cell).

Trying to replace with a paragraph mark isn’t working as you wish. Since you need to do something that can’t be done with Find/Replace anyway (the bullets) simply add the paragraph mark if Find is successful, put the Range focus at the end of the cell, than apply the Bullets formatting. (Note that there’s no need to use Selection if you have the Range object.)

Sub FindInCellAppendBullets()
    Dim BIOCell As Range
    Dim found As Boolean

    With ActiveDocument
        Set BIOCell = .Range(Start:=.Tables(1).Cell(13, 2).Range.Start, _
            End:=.Tables(1).Cell(13, 2).Range.End)
        BIOCell.Select
    End With

     With BIOCell.Find
        .Text = "as follows: "
        found = .Execute
        If found Then
            BIOCell.InsertParagraphAfter
            BIOCell.Collapse wdCollapseEnd
            BIOCell.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
               ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
               False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
               wdWord10ListBehavior
        Else
            MsgBox "couldn't find it"
        End If
    End With    
End Sub

If the table cell already has paragraphs of text and you want everything after the Find term to be bulleted, then the code could look like the example that follows.

In this case, a second Range object is used to perform the Find, while BIOCell remains assigned to the entire cell. (Always use the Duplicate property to make a «copy» of a Range that can be used independently. Range is an anamoly in the Office object models: Range=Range makes both Ranges identical — if you change the position of one, the position of the other changes, as well.)

Once Find is successful, the findRange is collapsed to the end of the Find term and moved one paragraph further (to the first paragraph following the found text). The end of the Range is then extended to the end of the cell (end of BIOCell), then moved back a couple of characters so that it doesn’t include the end-of-cell markers. (Otherwise the bullets would be applied to the entire cell instead of up through the last paragraph of the cell.)

Sub FindInCellFormatWithBullets()
    Dim BIOCell As Range
    Dim findRange As Range
    Dim found As Boolean

    With ActiveDocument
        Set BIOCell = .Range(Start:=.Tables(1).Cell(13, 2).Range.Start, _
            End:=.Tables(1).Cell(13, 2).Range.End)
        Set findRange = BIOCell.Duplicate
        BIOCell.Select
    End With

     With findRange.Find
        .Text = "as follows: "
        found = .Execute
        If found Then
            findRange.MoveStart wdParagraph, 1
            findRange.End = BIOCell.End - 2
            findRange.ListFormat.ApplyListTemplateWithLevel ListTemplate:= _
               ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:= _
               False, ApplyTo:=wdListApplyToWholeList, DefaultListBehavior:= _
               wdWord10ListBehavior
        Else
            MsgBox "couldn't find it"
        End If
    End With

End Sub

Доброго времени суток всем подписчикам и читателям блога 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 я рассмотрел в этой статье.

  1. Объекты
    Range и Selection.
    Работа с текстом.
  2. Выделенный
    текст.
  3. Текстовый
    диапазон.
  4. Выделение
    текста.
  5. Вырождение
    диапазона.
  6. Форматирование
    текста.
  7. Поиск
    и замена
  8. Коллекция
    Tables.

1.Объекты Range и Selection.Работа с текстом.

Работа с текстом осуществляется с помощью ряда объектов.
Весь текст документа можно представить в виде пирамиды, основой которой
являются символы, а вершиной – собственно документ. В иерархическом порядке
объектов VBA документ Word можно представить как:

Символы (Characters) ® Слова (Words) ®
Предложения (Sentences) ® ®Абзацы
(Paragraphs) ®Разделы
(Sections) ®Документ
(Document)

Кроме этих объектов, явно указывающих на тот или иной
элемент документа, в VBA имеется два объекта, которые позволяют работать с
текстом как с целым, без явного структурного разделения: объект Rahge ассоциируется с любым фрагментом документа, а объект Selection – с любым выделенным фрагментом текста. Оба эти
объекта похожи по своему действию, однако они различаются по своим
функциональным возможностям.

2.Выделенный текст.

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

Эта особенность часто используется для получения ссылки на
объект, описывающий текущий элемент документа.

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

Dim e As Paragraphs

Set e = Selection.Paragraphs

MsgBox e.Count

Свойством по умолчанию для объекта типа Selection
является свойство Text, возвращающее выделенный
текст.

Selection.[.Text][=Text]

Для замены текущего выделенного текста используется метод
TypeText
.

Selection.TypeText(Text)

Пример: вставляем в документ текст «ХХХ» и начинаем новый
абзац.

With
Selection

.TypeText Text:=«XXX»

.TypeParagraph

End With

Для управления параметрами вставки текста можно использовать
свойство ReplaceSelection.

Selection.ReplaceSelection [=Boolean]

Если true – текущее выделение
замещается, если False – то вставлять перед
выделением.

3.Текстовый диапазон. Объект Range
предназначен для выделения и обработки фрагментов текста. Этот объект является
семейством многих объектов.

Например для выделения
абзаца, в котором сейчас находится указатель достаточно использовать код

Selection.Paragraphs(1).Range.Select

 Область текста,
связанная с объектом типа Range, характеризуется
начальными и конечными символами. Для получения информации о них нужно
использовать свойства Start и End.

objrange.Start [=Position]

objrange.End [=Position]

параметр Position (типа Long) позволяет задать индекс символа, с которого должен
начаться или которым должен закончится фрагмент
текста, связанного с данным объектом objRange.

Для получения ссылки на текстовый диапазон можно
использовать метод Range.

ObjDocumet.Range(Start, End)

Параметр Start указывает на индекс
символа, с которого должен начаться диапазон, а параметр End
– на индекс последнего символа. Индексы символов соответствуют их порядковым
номерам в семействе Words, ссылку на которое
возвращает свойство Words объекта Document.

4. Выделение текста.

Формально объект Range связан
только с диапазоном текста. Этот диапазон может быть никак не связан с текущим
положением курсора или выделением. Однако диапазон, связанный с объектом Range, можно выделить в любой момент времени с помощью метода
Select.

ObjRange.Select

Пример: выделить второй абзац текущего документа.

ThisDocument.Paragraphs(2).Range.Select

5.Вырождение диапазона.

Для создания вырожденного диапазона можно использовать метод
Collapse
.

objRange.Collapse [(Direction)]

 Параметр Direction позволяет задать направление, в котором будет
выполнено вырождение. Если параметр имеет значение wdCollapseStart,
то вырождение выполняется в направлении начала диапазона, т.е. End:=Start. Если параметр имеет значение wdCollapseEnd, то Start:=End

Пример: снятия выделения в документе, курсор помещен в конец
выделеного диапазона.

Selection.Collapse wdCollapseEnd

6.Форматирование текста.

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

Свойство Bold – позволяет установить параметры
жирного начертания символов.

Если свойство имеет значение True, то начертание жирное , если False
нежирное. Свойство также может возвращать значение wdUnderfined,
указывающее на смешанное начертание. Для установления стиля начертания можно
использовать следующие значения True,
False или wdToggle,
позволяющие переключить текущее написание шрифта.

objRange.Bold
[=Boolean]

Свойство  CombineCharacters

Свойство позволяет сжать все символы выделенного диапазона.  Если свойство имеет значение true, то выполняется сжатие.

Свойство FilTextWidth

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

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

Selection.Range.FilTextWidth=CentimetersToPoints(5)

Свойство objRange.FormattedText

Свойство возвращает ссылку на объект типа Range ,
который ассоциируется с текстом в пределах данного диапазона objRange,
имеющего специфическое форматирование.

 Cвойство
Italic
позволяет установить параметры курсивного начертания символов.

Свойство ListFormat
возвращает ссылку на объект типа Listformat, содержащего
нумерованные или маркированные списки, используемые в данном диапазоне.

Свойство ListParagraph

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

Свойство Shadingвозвращает ссылку на объект типа Shading, позволяющего указать цвет и
формат заливки для данного диапазона.

Свойство Revisions

Свойство возвращает ссылку на объект типа Revisions , который
связан с исправлениями , находящимися  в данном диапазоне.

Свойство Showall[=Boolean]

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

Свойство Style[=Style]

Свойство позволяет задать стиль для данного абзаца. Параметр
Stile(тип Stile) позволяет указать один
из существующих типов.

Свойство Underline[=Underline]

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

Метод InsertAfter вставляет
заданный текст в конце диапазона или выделения.

Синтаксис:

objRange.InsertAfter(Text)

Пример:

ActiveDocument.Range.InsertAfter
«пример»

Метод InsertParagraph
позволяет заменить заданный диапазон символов или выделения на новый абзац.
После его использования объект Range отождествляется
с новым абзацем.

Метод InsertSymbol
предназначен для вставки символа в заданное место диапазона или выделения. При
использовании данного метода содержимое диапазона или выделения удаляется. Если
этого не требуется, то перед вызовом этого метода следует использовать метод Collapse.

Синтаксис:

ObjRange.InsertSimbol (CharacterNumber, Font, Unicode)

Параметр CharacterNumber
определяет код символа. Параметр Font
определяет имя шрифта, используемого в качестве источника символов. Параметр Unicode если значение True,
то вставляется юникодовый символ, заданный аргументом
CharacterNumbe. В противном случае (по умолчанию False) будет вставлен символ ANSI, заданный аргументом CharacterNumbe.

Пример:

Selection.Collapse direction:=wdCollapseStart

Selection.InsertSymbol characterNumber:=171, Font:=»Symbol», unicode:=False           «

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

7.Поиск и замена

Поиск   и замена- это
стандартные инструменты любого приложенияMicrosoft Office .Как правило, команды
вызова соответствующих диалоговых окон располагаются в меню Правка(Edit). Инструменты поиска и
замены в VBAреализуются
с помощью объектов Find и Replacement.

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

Стандартный инструмент поиска и замены работает следующим образом
: вы открываете окно диалога Поиск и замена(Find and Replace) , вводите в соответствующие поля необходимые значения , определяете дополнительные параметры поиска и нажимаете
кнопку Поиск(Find) или
Заменить(RepleceОднако
при частом поиске или замене одних и тех же значений для этой операции удобно
назначить кнопку на панели инструментов , комбинацию клавиш или разместить ее в
контекстном меню. Для реализации этой задачи нужно сначала создать
соответствующий макрос.

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

  1. Подготовить
    документ к поиску
  2. Выбрать
    команду Сервис +Макросачать запись
  3. В
    поле Имя макроса введите имя макроса , в поле
    Описание добавьте описание макроса
  4. Нажмите
    кнопку Ok – откроется панель инструментов Остановит запись , содержащая кнопки управления записью макроса:
    Остановить запись и Пауза.
  5. Выберите
    команду Правкаайти

Укажите необходимые параметры
поиска и нажмите кнопку Найти

На панели инструментов Остановить запись нажмите кнопку Остановить
запись

Откройте окно редактирования Visual Basic for Application и
перейдите к записанному макросу.

Выполните ручное редактирование
макроса

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

Пример:

 Sub ReplaceSpace4()

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text=space(4)

.Replacement.text=”^t”

.forward=true

.Wrap=WdfindWrap.wdfindall

End With

Selection.Find.Execute Replace:=wdReplaceall

End Sub

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

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

Переменная strText(тип string) содержит текст, вкотром осуществляется поиск .
Если заданный текст будет найден (метод Execute возвращает True), то осуществляется вызов процедуры
ReplaceSpace4,
показанной в предыдущем примере .

Пример:

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

 With Selection.Find

.Text= strText

If .Execute Then ReplaceSpace4

End With

8.Коллекция Tables.

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

Таблица Word
имеет такую же структуру, как и электронная таблица Excel
– элемент таблицы, находящийся на пересечении строки и столбца, называется
ячейкой и идентифицируется по имени столбца и номеру строки.

В VBA для доступа к таблицам
используется объект Tables, являющийся семейством
объектов Table, каждый из которых связан с конкретной
таблицей. Для получения ссылки на семейство Tables
можно использовать свойство Tables объекта Document.

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

Синтаксис:

Set oblTable=objDocument.Tables.Item(Key)

Параметр Key,
является уникальным идентификатором каждой таблицы, хранящейся в объекте Tables.

Для создания новой таблицы
используется метод Add объекта Tables. Этот метод возвращает ссылку на созданную таблицу(Table).

objTables.Add
(Range, NumRows, NumColums)

Параметр Range
позволяет указать область документа, куда будет вставлена таблица. Если
параметр не пустой, т.е. имеется выделенная область, то она будет заменена
вставляемой таблицей.

Параметры NumRows,
NumColums
позволяют указать на число строк и
столбцов таблицы.

Пример: создадим таблицу в выделенном
месте или там где стоит курсор.

Set instable = ActiveDocument.Tables.Add(Selection.Range, 4, 10)

Sub макрос()

    ‘ Макрос ищет в основном тексте (в колонтитулах и другом не ищет).

    Dim phrases, sbornik()
    Dim pars As Collection, ub2 As Long
    Dim counter As Long, max As Long
    Dim i As Long, j As Long

            ‘1. Юзер указывает, какие фразы надо искать.
    phrases = InputBox(«Введите искомые фразы через запятую:»)
    ‘ Если юзер щёлкнул «Cancel».
    If phrases = «» Then
        Exit Sub
    End If

        ‘2. Откл. монитора (может это ускорит макрос и чтобы не мерцало).
    Application.ScreenUpdating = False

        ‘3. Разбивка введённого текста на части по запятой.
    phrases = Split(phrases, «,»)

        ‘4. Создание ячеек в массиве «sbornik». В нём создаётся столько строк,
        ‘ сколько абзацев. И столько столбцов, сколько искомых фраз.
        ‘ То есть в массиве для каждого абзаца будет своя строка.
    ReDim sbornik(1 To ActiveDocument.Paragraphs.Count, 1 To UBound(phrases) + 1)

        ‘5. Поиск.
    For i = 0 To UBound(phrases)
        find phrases(i), sbornik(), i + 1
    Next i

        ‘6. Определение, в каком абзаце находится больше всего разных искомых слов.
    ‘1) Определение, сколько максимально было найдено в одном любом абзаце.
    ub2 = UBound(sbornik, 2)
    For i = 1 To UBound(sbornik, 1)
        counter = 0
        For j = 1 To ub2
            If sbornik(i, j) = True Then
                counter = counter + 1
            End If
        Next j
        sbornik(i, 1) = counter
        If counter > max Then
            max = counter
        End If
    Next i

        ‘2) Если вообще не было найдено искомых фраз.
    If max = 0 Then
        Application.ScreenUpdating = True
        MsgBox «Искомые фразы не найдены.», vbExclamation
        Exit Sub
    End If

        ‘3) Определение, в каком абзаце находится больше всего разных искомых слов.
    Set pars = New Collection
    For i = 1 To UBound(sbornik, 1)
        If sbornik(i, 1) = max Then
            pars.Add Item:=i
        End If
    Next i

        ‘4) Закраска абзацев с максимальным кол-вом.
    For i = 1 To pars.Count
        ActiveDocument.Paragraphs(pars(i)).Shading.BackgroundPatternColor = -654246042
    Next i

        ‘7. Вкл. монитора.
    Application.ScreenUpdating = True

        ‘8. Сообщение.
    MsgBox «Готово.», vbInformation

End Sub

Private Sub find(phrase, sbornik(), PhraseIndex As Long)

    Dim find_rng As Range, find As find
    Dim index As Long

            ‘1. Создание объектов, которые будут искать.
    Set find_rng = ActiveDocument.Range(0, 0)
    Set find = find_rng.find

        ‘2. Настройка поиска.
    find.Text = phrase
    find.Wrap = wdFindStop

        ‘3. Поиск.
    Do While find.Execute = True

            ‘1) Закраска найденной фразы.
        find_rng.Font.ColorIndex = wdRed

                ‘2) Запись порядкового номера абзаца в переменную «index».
            ‘ В ворде нет готового инструмента для определения порядкового номера абзаца,
            ‘ поэтому используется обходной способ — подсчёт кол-ва абзацев от
            ‘ начала файла до заданного фрагмента. В нашем случае до найденного фрагмента,
            ‘ включая сам найденный фрагмент.
        index = ActiveDocument.Range(0, find_rng.End).Paragraphs.Count

                ‘3) Запись в массив «sbornik» в соответствующую строку и столбец слова «True».
        sbornik(index, PhraseIndex) = True

            Loop

    End Sub

[свернуть]

Понравилась статья? Поделить с друзьями:
  • Как выделит строку активной ячейки в excel
  • Как выделенное перенести в excel
  • Как выдать на экран панель инструментов рисование excel
  • Как выгрузить яндекс директ в excel
  • Как выгрузить товары с сайта в excel