In this article I will explain how you can use VBA for word to select text.
–
Select Entire Document:
Using the code snippet below you can select the entire word document:
Selection.WholeStory
Result:
–
Select The Current Line:
Using the code below you can select the current line:
Sub main()
Selection.HomeKey Unit:=wdLine
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
End Sub
Assume the cursor is somewhere in the middle of the line:
The first line moves the cursor to the start of the line:
Selection.HomeKey Unit:=wdLine
The next line move the cursor to the end of the line while selecting the text:
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Result:
–
Select to End of Line:
The code below will only select till the end of the line:
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Result:
–
Select to Start of Line:
The code below will select text up to the start of the line:
Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
Result:
–
Select Certain Number of Characters:
Lets say we need to select only a certain number of characters from the current location of the cursor. The code below will select 5 characters to the right:
Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend
Result:
The code below will select 10 characters to the left:
Selection.MoveLeft Unit:=wdCharacter, Count:=10, Extend:=wdExtend
Result:
–
Select Text up to a Certain Character:
You might want to select text until you reach a certain character. For example a space character, “*”, “/”, …
The code below selects text until a space character is reached:
Sub test()
Dim flag As Boolean
flag = True
While flag = True
Selection.MoveRight Unit:=wdCharacter, Count:=1, _
Extend:=wdExtend
'checks the last character to see if its a space
If Strings.Right(Selection.Range.Text, 1) = " " Then
'if it was a space the loop flag will end
flag = False
End If
Wend
End Sub
Result:
The line below selects one additional character to the right:
Selection.MoveRight Unit:=wdCharacter, Count:=1, _
Extend:=wdExtend
The if statement below checks to see if the last character selected is a space character:
If Strings.Right(Selection.Range.Text, 1) = " " Then
...
End If
For more information about the Strings.Right function please see the article below. Although the article was written for Excel, it can be extended to VBA for Word:
- Excel VBA String Proccessing and Manipulation
See also:
- Word VBA, Move Cursor to Start of Document
- Word VBA, Move Cursor to End of Document
- Word VBA, Move Cursor to End of Line
- Word VBA, Move Cursor to Start of Line
- Excel VBA String Processing and Manipulation
- Word VBA Bookmarks
- Word VBA, Read All Lines
If you need assistance with your code, or you are looking for a VBA programmer to hire feel free to contact me. Also please visit my website www.software-solutions-online.com
title | ms.prod | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|
Finding and Replacing Text or Formatting |
word |
9ab9f4a7-9833-5a78-56b0-56a161480f18 |
06/08/2019 |
medium |
Finding and replacing is exposed by the Find and Replacement objects. The Find object is available from the Selection object and the Range object. The find action differs slightly depending upon whether you access the Find object from the Selection object or the Range object.
Finding text and selecting it
If the Find object is accessed from the Selection object, the selection is changed when the find criteria is found. The following example selects the next occurrence of the word «Hello.» If the end of the document is reached before the word «Hello» is found, the search is stopped.
With Selection.Find .Forward = True .Wrap = wdFindStop .Text = "Hello" .Execute End With
The Find object includes properties that relate to the options in the Find and Replace dialog box. You can set the individual properties of the Find object or use arguments with the Execute method, as shown in the following example.
Selection.Find.Execute FindText:="Hello", _ Forward:=True, Wrap:=wdFindStop
Finding text without changing the selection
If the Find object is accessed from a Range object, the selection is not changed but the Range is redefined when the find criteria is found. The following example locates the first occurrence of the word «blue» in the active document. If the find operation is successful, the range is redefined and bold formatting is applied to the word «blue.»
With ActiveDocument.Content.Find .Text = "blue" .Forward = True .Execute If .Found = True Then .Parent.Bold = True End With
The following example performs the same result as the previous example, using arguments of the Execute method.
Set myRange = ActiveDocument.Content myRange.Find.Execute FindText:="blue", Forward:=True If myRange.Find.Found = True Then myRange.Bold = True
Using the Replacement object
The Replacement object represents the replace criteria for a find and replace operation. The properties and methods of the Replacement object correspond to the options in the Find and Replace dialog box (Edit menu).
The Replacement object is available from the Find object. The following example replaces all occurrences of the word «hi» with «hello». The selection changes when the find criteria is found because the Find object is accessed from the Selection object.
With Selection.Find .ClearFormatting .Text = "hi" .Replacement.ClearFormatting .Replacement.Text = "hello" .Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue End With
The following example removes bold formatting in the active document. The Bold property is True for the Find object and False for the Replacement object. To find and replace formatting, set the find and replace text to empty strings («») and set the Format argument of the Execute method to True. The selection remains unchanged because the Find object is accessed from a Range object (the Content property returns a Range object).
With ActiveDocument.Content.Find .ClearFormatting .Font.Bold = True With .Replacement .ClearFormatting .Font.Bold = False End With .Execute FindText:="", ReplaceWith:="", _ Format:=True, Replace:=wdReplaceAll End With
[!includeSupport and feedback]
Всем привет, с вами автор блога scriptcoding.ru. В этой статье мы рассмотрим методы объекта Word Selection, которые позволяют очистить материал от форматирования, преобразовать в таблицу, а также производить копирование, вставку и так далее. Помним, что данный класс отвечает за выделение текста в Word.
Содержание
- Методы класса Word.Selection – выделение текста в Word
- Примера на языке VBScript – выделение текста в редакторе Word
- Примера на языке JScript – выделение текста в редакторе Word
Методы класса Word.Selection – выделение текста в Word
Я приведу по два примера программного кода на языках JScript, VBScript и VBA. Хотя по сути, код под макрос (VBA) и сценарий VBScript особо не отличается. Для тех, кто забыл: для создания макроса в документе Microsoft Office нужно вызвать редактор Visual Basic for Application (комбинация клавиш Alt + F11), далее, добавить в проект новый модуль (макрос).
Методы с префиксом Clear… позволяют очистить выделенный материал от форматирования (абзацы, стили, символы и так далее):
ClearCharacterAllFormatting() — Все форматирование.
ClearCharacterDirectFormatting() — Форматирование знаков.
ClearCharacterStyle() — Форматирование знаков, применяемых через стили.
ClearFormatting() – Все форматирования (параграфы, стили и так далее).
ClearParagraphAllFormatting() — Форматирование абзаца.
ClearParagraphDirectFormatting() — Форматирование абзацев, применяемых вручную.
ClearParagraphStyle() — Форматирование абзацев, применяемых через стили.
Collapse(Direction) – Позволяет убрать выделение текста Word и переместить указатель в начало или конец. VBA Selection. Если параметры отсутствуют, то просто убирается выделение. Параметр Direction содержит значение константы WdCollapseDirection:
- wdCollapseEnd — 0 – Указатель вконец
- wdCollapseStart — 1 – Указатель вначале
ConvertToTable(Separator, NumRows, NumColumns, InitialColumnWidth, Format, ApplyBorders, ApplyShading, ApplyFont, ApplyColor, ApplyHeadingRows, ApplyLastRow, ApplyFirstColumn, ApplyLastColumn, AutoFit, AutoFitBehavior, DefaultTableBehavior) – Довольно мощный метод, который позволяет преобразовать выделенный Word текст в таблицу.
Separator — Символ-разделитель, может быть знаком или значением константы WdTableFieldSeparator:
- wdSeparateByParagraphs — 0 — абзаца.
- wdSeparateByTabs — 1 — табуляции.
- wdSeparateByCommas — 2 — запятая.
- wdSeparateByDefaultListSeparator — 3 — разделитель списка по умолчанию.
NumRows— Количество строк.
NumColumns— Количество столбиков.
InitialColumnWidth— Начальная ширина каждого столбца, в пунктах.
Format– Определяет формат таблицы и содержит значение константы WdTableFormat.
ApplyBorders— TRUE — применять границы.
ApplyShading— TRUE — применить затенение.
ApplyFont— TRUE применять свойства шрифтов.
ApplyColor— TRUE применять цветовые свойства.
ApplyHeadingRows— TRUE — применить свойства заголовок-строка.
ApplyLastRow— TRUE — применить свойства последней строке.
ApplyFirstColumn— TRUE — применить свойства первого столбцов.
ApplyLastColumn— TRUE — применить свойства последнего столбца.
AutoFit— TRUE — уменьшить ширину столбцов таблицы как можно больше.
AutoFitBehavior — Устанавливает правила авто-подбора (если DefaultTableBehavior содержит значение wdWord8TableBehavior, то этот аргумент игнорируется, VBA Selection), содержит значения константы WdAutoFitBehavior:
- wdAutoFitContent — 1 — автоматически размер
- wdAutoFitFixed — 0 — фиксированный размер
- wdAutoFitWindow — 2 — автоматический размер по ширине активного окна
DefaultTableBehavior— Значение, указывающее, следует ли автоматически изменять размер ячеек таблицы по содержимому. Selection VBA. Содержит значение константы WdDefaultTableBehavior:
- wdWord8TableBehavior — 0 — отключает Авто-подбор (по умолчанию)
- wdWord9TableBehavior — 1 — включить Авто-подбор
Хорошо, с теоретической частью мы закончили, теперь можно приступить к программированию.
Примера на языке VBScript – выделение текста в редакторе Word
' ---------------------------------------------------------------------------- ' Объект Selection - выделение текста в Word ' Преобразование в таблицу - язык VBScript ' VBA_Selection_Table.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord, oDoc, oSel, i Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents oDoc.Add() Set oSel = oWord.Selection oWord.Visible = True For i = 0 To 10 With oSel .InsertBreak 6 .InsertBefore "один, два, три, четыре, пять, шесть, selection word vba" .EndOf .InsertBreak 6 End With Next oWord.Documents(1).Select() oSel.ConvertToTable ",", 31,,,18
В данном примере в цикле For (смотрите статью «Урок 6 по VBScript: Циклы for…next и for each…next«), который выполняется шесть раз, происходит вставка перевода на новую строку, вставка текстовой фразы и перемещаем курсов к конец строки. С помощью оператора with мы можем экономить размер программного кода – не нужно лишний раз писать имя класса. Вконце происходит выделение текста Word и преобразование его в таблицу.
Примера на языке JScript – выделение текста в редакторе Word
// ---------------------------------------------------------------------------- // Объект Selection - выделение текста в Word // Преобразование в таблицу - язык JScript // VBA_Selection_Table.js // ---------------------------------------------------------------------------- var oWord1, oDoc1, oSel1, i; oWord1 = WScript.CreateObject("Word.Application"); oDoc1 = oWord1.Documents; oDoc1.Add(); oSel1 = oWord1.Selection; oWord1.Visible = true; for (i=0; i<=10;i++){ with(oSel1){ InsertBreak(6); InsertBefore("один, два, три, четыре, пять, шесть, selection word vba"); EndOf(); InsertBreak(6); } } oWord1.Documents(1).Select(); oSel1.ConvertToTable(",", 31,"","",18);
Логика работы данного программного кода аналогичны предыдущему примеру, тут мы уже использовали цикл for языка JS, читайте в статье «Урок 9 по JScript — оператор цикла for«. Тут тоже использовался оператор with, обратите внимание, что имена переменных изменились, а в конце каждой строки кода прописана точка с запятой.
Примера на языке Visual Basic for Application – выделение текста в редакторе Word
'VBA Dim oWord2 As Object, oDoc2 As Object, oSel2 As Object, i Set oWord2 = CreateObject("Word.Application") Set oDoc2 = oWord2.Documents oDoc2.Add Set oSel2 = oWord2.Selection oWord2.Visible = True For i = 0 To 10 With oSel2 .InsertBreak 6: .InsertBefore "один, два, три, четыре, пять, шесть, selection word vba" .EndOf: .InsertBreak 6 End With Next oWord2.Documents(1).Select oSel2.ConvertToTable Separator:=",", NumRows:=31, Format:=18
Хорошо, давайте продолжим рассматривать методы класса Selection.
EndOf() – Перемещает курсор в конец выделения.
StartOf() – Перемещает курсор в начало выделения.
SetRange(start, end) – Позволяет задать начальное и конечное значение для выделения текста Word.
TypeText() – Выполняет ту же функцию, что и свойство Text – ввод информации.
TypeParagraph() — Метод вставляет параграф.
Copy(), Cut(), Paste(), Delete() – Копирует, вырезает, вставляет и удаляет выделенный текст в Word.
CopyAsPicture() – Копирует выбранный материал как изображение.
И так, теперь рассмотрим программный код с данными методами.
' ---------------------------------------------------------------------------- ' Класс Selection - выделение текста в Word ' Копирование и вставка - язык VBScript ' VBA_Selection_Copy_Paste.vbs ' ---------------------------------------------------------------------------- Option Explicit dim oWord3, oDoc3, oSel3, i Set oWord3 = CreateObject("Word.Application") Set oDoc3 = oWord3.Documents oDoc3.Add() Set oSel3 = oWord3.Selection oWord3.Visible = True ' Вводим информацию в документ сто раз For i=0 to 100 oSel3.TypeText "Пример ввода данных - selection word vba. " Next With oSel3 ' Выделяем, копируем и вставляем .SetRange 100, 300 .Copy .MoveDown .Paste ' Выбираем материал и копируем ее как изображение .SetRange 100, 300 .CopyAsPicture End With
По сути, данный программный код практически аналогичен предыдущим. Тут в цикле происходит вставка данных несколько раз, а далее следуют операции выделения текста в документе Word, его копирование и вставка.
// ---------------------------------------------------------------------------- // Класс Selection - выделение текста в Word // Копирование и вставка - язык JScript // VBA_Selection_Copy_Paste.js // ---------------------------------------------------------------------------- var oWord5, oDoc5, oSel5, i; oWord5 = WScript.CreateObject("Word.Application"); oDoc5 = oWord5.Documents; oDoc5.Add(); oSel5 = oWord5.Selection; oWord5.Visible = true; // Вводим данные в документ сто раз for(i=0; i<=100; i++){ oSel5.TypeText("Пример ввода информации - selection word vba. "); } with(oSel5){ // Выделяем, копируем и вставляем SetRange(100, 300); Copy(); MoveDown(); Paste(); // Выделяем и копируем как изображение SetRange(100, 300); CopyAsPicture(); }
Ну и в заключение, привожу программный код для макроса:
' VBA Dim oWord6 As Object, oDoc6 As Object, oSel6 As Object, i Set oWord6 = CreateObject("Word.Application") Set oDoc6 = oWord6.Documents oDoc6.Add Set oSel6 = oWord6.Selection oWord6.Visible = True For i = 0 To 100 oSel6.TypeText "Пример ввода информации - selection word vba. " Next With oSel6 .SetRange 100, 300: .Copy: .MoveDown: .Paste .SetRange 100, 300: .CopyAsPicture End With
Хорошо, на этом можно закончить данную статью. Параллельно, информацию по работе с классом Selection можете рассмотреть еще две публикации, в которых я рассмотрел остальные методы и свойства класса Selection.
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS
Contact US
Thanks. We have received your request and will respond promptly.
Log In
Come Join Us!
Are you a
Computer / IT professional?
Join Tek-Tips Forums!
- Talk With Other Members
- Be Notified Of Responses
To Your Posts - Keyword Search
- One-Click Access To Your
Favorite Forums - Automated Signatures
On Your Posts - Best Of All, It’s Free!
*Tek-Tips’s functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.
Posting Guidelines
Promoting, selling, recruiting, coursework and thesis posting is forbidden.
Students Click Here
Select text in Word with VBASelect text in Word with VBA(OP) 7 Jul 06 01:45 Hi, I will select text between a start word and a end word. Thanks in advance. Red Flag SubmittedThank you for helping keep Tek-Tips Forums free from inappropriate posts. |
Join Tek-Tips® Today!
Join your peers on the Internet’s largest technical computer professional community.
It’s easy to join and it’s free.
Here’s Why Members Love Tek-Tips Forums:
- Talk To Other Members
- Notification Of Responses To Questions
- Favorite Forums One Click Access
- Keyword Search Of All Posts, And More…
Register now while it’s still free!
Already a member? Close this window and log in.
Join Us Close
02-04-2014, 12:33 AM |
|||
|
|||
How to find and select text in a document? I’m trying to create a Word 2010 macro that finds, selects, and reformats a single word in my document starting from the current cursor position. During recording of the macro, I’ve tried to use Find in the menu (Ctrl-F) but nothing is recorded in my macro for the find operation even though the cursor moves and highlights the found word. I’ve tried using the code below but that is also not moving the current cursor position to this word. Can somebody tell me how to record a Find text operation in a Word macro or else tell me what the correct VBA code is to do this? Thanks in advance! Selection.Find.Text = «Synposis»
Selection.Style = ActiveDocument.Styles(«Body Text») |
02-04-2014, 06:53 PM |
Your code suggests you want to toggle the bold attribute for ‘Synopsis’ in the ‘Body Text’ Style, not simply make it all bold or all not bold. In that case, you could use a macro like: Code: Sub Demo() Application.ScreenUpdating = False Dim Rng As Range With Selection Set Rng = .Range With .Find .ClearFormatting .Replacement.ClearFormatting .Text = "Synopsis" .Replacement.Text = "^&" .Style = "Body Text" .Forward = True .Wrap = wdFindStop .Format = True .MatchCase = True .MatchWholeWord = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute End With Do While .Find.Found .Font.Bold = wdToggle .Collapse wdCollapseEnd .Find.Execute Loop End With Rng.Select Set Rng = Nothing Application.ScreenUpdating = True End Sub If, however, you wish to make all such text bold, the macro could be made much more efficient and simplified to: Code: Sub Demo() Application.ScreenUpdating = False With Selection With .Find .ClearFormatting .Replacement.ClearFormatting .Text = "Synopsis" .Replacement.Text = "^&" .Style = "Body Text" .Replacement.Font.Bold = True .Forward = True .Wrap = wdFindStop .Format = True .MatchCase = True .MatchWholeWord = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With End With Application.ScreenUpdating = True End Sub If you want to make the font not bold instead, change:
__________________ |
02-04-2014, 07:02 PM |
|||
|
|||
Thanks. Does the code have to be this complicated? All I want to do is find the next word «Synopsis» after the current cursor position and change it’s style to Body Text and make it bold face. |
02-04-2014, 07:26 PM |
No, it doesn’t ‘have’ to be so complicated, but leaving out some parameters might lead to unexpected results … Re: Quote: change it’s style to Body Text and make it bold face That’s not what the code I posted does. Based on what you had posted, the code I posted looks for ‘Synopsis’ that is already in the ‘Body Text’ Style. Furthermore, you can’t re-format only a single word of many in a paragraph with the ‘Body Text’ Style, as that Style is a paragraph Style. Of course, that doesn’t matter if ‘Synopsis’ is the only word in the paragraphs concerned. As for changing the font to bold, if ‘Synopsis’ is the only word in the paragraphs concerned, you’d do better to change the ‘Body Text’ Style’s font to bold than to override the Style format. Similarly, if ‘Synopsis’ is only one word of many in a paragraph, you’d do better to apply the ‘Strong’ character Style to ‘Synopsis’ than to override the Style format. For example: Code: Sub Demo() Application.ScreenUpdating = False With Selection With .Find .ClearFormatting .Replacement.ClearFormatting .Text = "Synopsis" .Replacement.Text = "^&" .Forward = True .Wrap = wdFindStop .Format = True .MatchCase = True .MatchWholeWord = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Replacement.Style = "Body Text" .Execute Replace:=wdReplaceAll .Replacement.Style = "Strong" .Execute Replace:=wdReplaceAll End With End With Application.ScreenUpdating = True End Sub
__________________ |
02-04-2014, 07:29 PM |
|||
|
|||
Is there any way to generate this code using Word’s macro recording mode? When I tried to do a Find «Synopsis» operation, no VBA code was generated. |
02-04-2014, 07:34 PM |
Basic code produced using the macro recorder: Code: Sub Macro1() ' ' Macro1 Macro ' ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting Selection.Find.Replacement.Style = ActiveDocument.Styles("Body Text") With Selection.Find .Text = "Synopsis" .Replacement.Text = "^&" .Forward = True .Wrap = wdFindContinue .Format = True .MatchCase = True .MatchWholeWord = True .MatchByte = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub
__________________ |
02-04-2014, 07:47 PM |
|||
|
|||
How did you get it to record a Find text string operation? |
02-04-2014, 07:50 PM |
By inputting the parameters you see recorded into the Find/Replace dialogue…
__________________ |
02-04-2014, 08:04 PM |
|||
|
|||
It’s recording ok now. I had to use keyboard commands to select the Find operation instead of the mouse. Thanks for all your help! |