I know how to get every paragraph in a word document. But I am looking for a way to loop through each word in a MS Word document.
Sub Sample()
Dim apara As Paragraph
Dim lineText As String
For Each apara In ActiveDocument.Paragraphs
lineText = apara.Range
'Now print the paragraph
Debug.Print lineText
Next apara
End Sub
braX
11.5k5 gold badges20 silver badges33 bronze badges
asked Mar 28, 2014 at 11:06
1
For Each sentence In ActiveDocument.StoryRanges
For Each w In sentence.Words
Debug.Print w
Next
Next
answered Mar 28, 2014 at 13:16
AidanAidan
1,5401 gold badge13 silver badges20 bronze badges
0
Here’s another, very similar solution which may be helpful for others. The accepted answer grabs every single word in the document including header, footer, etc., whereas this answer will only grab the words in the «main» area of the document.
For Each para In ActiveDocument.Paragraphs
For Each wrd In para.Range.Words
Debug.Print wrd
Next wrd
Next para
answered Oct 31, 2018 at 17:24
Marcucciboy2Marcucciboy2
3,1483 gold badges19 silver badges38 bronze badges
In this Article
- For Each Loop
- For Each: Basic Examples
- Loop Through Cells
- Loop Through Sheets
- Loop Through Workbooks
- Loop Through Shapes
- Loop Through Charts
- Loop Through PivotTables
- Loop Through Tables
- Loop Through Items in Array
- Loop Through Numbers
- For Each Loop Builder
- For Each – If
- For Each Cell in Range – If
- For Each Common Examples
- Close All Workbooks
- Hide All Sheets
- Unhide All Sheets
- Protect All Sheets
- Unprotect All Sheets
- Delete All Shapes On All Worksheets
- Refresh All PivotTables
- Using For Each in Access VBA
This tutorial will show you examples of using the For Each Loop in VBA. Click here to learn more about loops in general.
For Each Loop
The For Each Loop allows you to loop through each object in a collection:
- All cells in a range
- All worksheets in a workbook
- All open workbooks
- All shapes in a worksheet
- All items in an array
- and more!
For Each: Basic Examples
These examples will demonstrate how to set up For Each loops to loop through different types of objects.
Loop Through Cells
This procedure will loop through each cell in range A1:A10, setting the cell to it’s right equal to itself.
Sub ForEachCell()
Dim Cell As Range
For Each Cell In Sheets("Sheet1").Range("A1:A10")
Cell.Offset(0, 1).value = Cell.value
Next Cell
End Sub
Loop Through Sheets
This procedure will loop through each sheet in a Workbook, unhiding each sheet.
Sub ForEachSheets()
Dim ws As Worksheet
For Each ws In Sheets
ws.Visible = True
Next ws
End Sub
Loop Through Workbooks
This procedure will loop through each Workbook, closing each one.
Sub ForEachWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close
Next wb
End Sub
Loop Through Shapes
This procedure will loop through each shape in Sheet1, deleting each one.
Sub ForEachShape()
Dim Shp As Shape
For Each Shp In Sheets("Sheet1").Shapes
Shp.Delete
Next Shp
End Sub
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Loop Through Charts
This procedure will loop through each Chart in Sheet1, deleting each one.
Sub ForEachCharts()
Dim cht As ChartObject
For Each cht In Sheets("Sheet1").ChartObjects
cht.Delete
Next cht
End Sub
Loop Through PivotTables
This procedure will loop through each PivotTable in Sheet1, clearing each one
Sub ForEachPivotTables()
Dim pvt As PivotTable
For Each pvt In Sheets("Sheet1").PivotTables
pvt.ClearTable
Next pvt
End Sub
Loop Through Tables
This procedure will loop through each Table in Sheet1, deleting each one.
Sub ForEachTables()
Dim tbl As ListObject
For Each tbl In Sheets("Sheet1").ListObjects
tbl.Delete
Next tbl
End Sub
VBA Programming | Code Generator does work for you!
Loop Through Items in Array
This procedure will loop through each item in an Array, display each value in a msgbox,
Sub ForEachItemInArray()
Dim arrValue As Variant
Dim Item As Variant
arrValue = Array("Item 1", "Item 2", "Item 3")
For Each Item In arrValue
MsgBox Item
Next Item
End Sub
Loop Through Numbers
This procedure will loop through each number in an Array, display each value in a msgbox,
Sub ForEachNumberInNumbers()
Dim arrNumber(1 To 3) As Integer
Dim num As Variant
arrNumber(1) = 10
arrNumber(2) = 20
arrNumber(3) = 30
For Each num In arrNumber
Msgbox num
Next num
End Sub
For Each Loop Builder
The examples in this article were built with the Loop Builder in our VBA Add-in: AutoMacro.
The Loop Builder makes it very easy to generate code to loop through objects. AutoMacro also contains many other Code Generators, an extensive Code Library, and powerful Coding Tools.
For Each – If
You can also use If Statements within Loops to test if objects meet certain criteria, only performing actions on those objects that meet the criteria. Here is an example of looping through each cell in a range:
For Each Cell in Range – If
Sub If_Loop()
Dim Cell as Range
For Each Cell In Range("A2:A6")
If Cell.Value > 0 Then
Cell.Offset(0, 1).Value = "Positive"
ElseIf Cell.Value < 0 Then
Cell.Offset(0, 1).Value = "Negative"
Else
Cell.Offset(0, 1).Value = "Zero"
End If
Next Cell
End Sub
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
For Each Common Examples
Close All Workbooks
This procedure will close all open workbooks, saving changes.
Sub CloseAllWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
wb.Close SaveChanges:=True
Next wb
End Sub
Hide All Sheets
This procedure will hide all worksheets.
Sub HideAllSheets()
Dim ws As Worksheet
For Each ws In Sheets
ws.Visible = xlSheetHidden
Next ws
End Sub
Unhide All Sheets
This procedure will unhide all worksheets.
Sub UnhideAllSheets()
Dim ws As Worksheet
For Each ws In Sheets
ws.Visible = xlSheetVisible
Next ws
End Sub
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Protect All Sheets
This procedure will protect all worksheets.
Sub ProtectAllSheets()
Dim ws As Worksheet
For Each ws In Sheets
ws.Protect Password:="..."
Next ws
End Sub
Unprotect All Sheets
This procedure will unprotect all worksheets.
Sub UnprotectAllSheets()
Dim ws As Worksheet
For Each ws In Sheets
ws.Unprotect Password:="..."
Next ws
End Sub
Delete All Shapes On All Worksheets
This procedure will delete all shapes in a workbook.
Sub DeleteAllShapesOnAllWorksheets()
Dim Sheet As Worksheet
Dim Shp As Shape
For Each Sheet In Sheets
For Each Shp In Sheet.Shapes
Shp.Delete
Next Shp
Next Sheet
End Sub
Refresh All PivotTables
This procedure will refresh all PivotTables on a sheet.
Sub RefreshAllPivotTables()
Dim pvt As PivotTable
For Each pvt In Sheets("Sheet1").PivotTables
pvt.RefreshTable
Next pvt
End Sub
Using For Each in Access VBA
The For Each loop works the same way in Access VBA as it does in Excel VBA. The following example will remove all the tables in the current database.
Sub RemoveAllTables()
Dim tdf As TableDef
Dim dbs As Database
Set dbs = CurrentDb
For Each tdf In dbs.TableDefs
DoCmd.DeleteObject tdf.Name
Loop
Set dbs = Nothing
End Sub
В этой статье мы рассмотрим цикл for each VBA языка и познакомимся с коллекциями. Сначала, определимся, что такое коллекция. Коллекция – по своей природе этот тот же массив, но количество элементов в нем нам неизвестно, например: нам нужно получить список файлов или каталогов в данной папке или на данном диске, их количество нам не ведомо. Как вы уже догадались, использовать простой цикл VBA for next тут просто не возможно, так как там нам надо задать точное количество операций для обработки данных.
Именно для таких случае был придуман цикл vba for each next, который содержит следующий синтаксис:
For Each элемент In коллекция
[exit for]
Операторы
[exit for]
Next элемент
Как видим, синтаксис довольно схож с циклом for next, но тут не надо задавать начальные и конечные значения, а также отсутствует шаг счетчика.
Элемент – это переменная, которая будет хранить значение при каждой итерации (переборе коллекции)
Коллекция – собственно, то, что нам надо обработать
Как видим, тут тоже можно использовать выражение Exit For для выхода из цикла.
Давайте рассмотрим такой пример: в редакторе кода VBA создадим форму с именем SubForm, на поверхность формы добавим три объекта:
Текстовая метка – объект Label, разместите метку в самом верху, она нужна лишь для информирования
Список – объект List, в нем будет выводиться список всех папок на диске D.
Кнопка – объект CommandButton, при нажатии на кнопку будет вызываться соответствующая подпрограмма.
Внешний вид формы можно увидеть на рисунке.
Также нам надо добавить в редактор новый модуль (макрос), выберите в меню Insert пункт Module, имя модуля пусть будет SubModule. В редакторе кода для модуля пропишите:
Sub SubModule() SubForm.Show End Sub
Этот код связывает макрос и форму, при запуске макроса произойдет вывод формы (свойство Show).
Теперь настало самое интересно, в редакторе кода для формы пропишите:
Private Sub GetFolders() ' формируем ссылку на объект FileSystemObject Set FSO = CreateObject("Scripting.FileSystemObject") ' получаем доступ к диску D: Set Drive = FSO.GetFolder("D:") ' фрмируем коллекцию каталогов Set Folders = Drive.SubFolders 'устанавливаем свойства списка With ListBox1 .ColumnHeads = False .MultiSelect = fmMultiSelectSingle End With 'Начинаем перебор коллекции For Each Folder In Folders ListBox1.AddItem Folder.Name Next End Sub Private Sub CommandButton1_Click() 'Вызываем процедуру Call GetFolders End Sub Private Sub UserForm_Initialize() Label1.Caption = "Списк каталогов на D:\" Label1.FontSize = 15 Label1.ForeColor = vbBlue CommandButton1.Caption = "Список" End Sub
В самом начале мы объявили процедуру GetFolder, в которой происходит подключение внешнего объект Scripting.FileSystemObject (ознакомится с методами и свойствами данного компонента можно в статье “Объект FileSystemObect”), он отвечает за работу с файловой системой. Далее происходит доступ к диску D и получение коллекции все папок, хранящихся на нем (Drive.SubFolders). Хорошо, теперь переменная Folders является коллекцией и ее можно обработать с помощью цикла for each vba языка. Обратите внимание, что ссылка на объект создается с помощью ключевого слова set. Что бы заполнить список (ListBox), мы используем метод AddItem, после которого следует строка Folder.Name – имя папки.
А вот пример вывода списка специальных папок Windows (специальные папки – папки, которые автоматически создаются системой: мои документы, каталог со шрифтами, системный каталог и так далее):
Private Sub GetFolders() Dim WshShell, SpecObj, i ' формируем ссылку на объект Wscript.Shell Set WshShell = CreateObject("Wscript.Shell") ' получаем доступ к специальным папкам Set SpecObj = WshShell.SpecialFolders 'устанавливаем свойства списка With ListBox1 .ColumnHeads = False .MultiSelect = fmMultiSelectSingle End With 'Начинаем перебор коллекции For Each i In SpecObj ListBox1.AddItem i Next End Sub
Тут мы использовали объект WScript.Shell для получения списка специальных папок, ознакомится с его методами и свойствами можно в статье (объект Wscript.Shell). И так, в следующей статье мы рассмотрим цикл do loop языка Visual Basic for Applications, который позволяет задавать условие выполнения операций.
Цикл For Each… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For Each… Next.
Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Этот замечательный цикл применяется, когда неизвестно количество элементов в группе и их индексация, в противном случае, более предпочтительным считается использование цикла For…Next.
For Each element In group [ statements ] [ Exit For ] [ statements ] Next [ element ] |
В квадратных скобках указаны необязательные атрибуты цикла For Each… Next.
Компоненты цикла For Each… Next
Компонент | Описание |
---|---|
element | Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*. |
group | Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each… Next. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
*Если цикл For Each… Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.
**Если не использовать в цикле свой код, смысл применения цикла теряется.
Примеры циклов For Each… Next
Цикл для диапазона ячеек
На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:
Sub test1() Dim element As Range, a As String a = «Данные, полученные с помощью цикла For Each… Next:» For Each element In Selection a = a & vbNewLine & «Ячейка « & element.Address & _ » содержит значение: « & CStr(element.Value) Next MsgBox a End Sub |
Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.
Цикл для коллекции листов
Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:
Sub test2() Dim element As Worksheet, a As String a = «Список листов, содержащихся в этой книге:» For Each element In Worksheets a = a & vbNewLine & element.Index _ & «) « & element.Name Next MsgBox a End Sub |
Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.
Цикл для массива
Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.
Sub test3() Dim element As Variant, a As String, group As Variant group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь») ‘или можно присвоить массиву значения диапазона ячеек ‘рабочего листа, например, выбранного: group = Selection a = «Массив содержит следующие значения:» & vbNewLine For Each element In group a = a & vbNewLine & element Next MsgBox a End Sub |
Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.
Sub test4() Dim element As Variant, a As String, group As Variant group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь») ‘или можно присвоить массиву значения диапазона ячеек ‘рабочего листа, например, выделенного: group = Selection a = «Массив содержит следующие значения:» & vbNewLine For Each element In group element = «Попугай» a = a & vbNewLine & element Next MsgBox a End Sub |
Этот код, как и все остальные в этой статье, тестировался в Excel 2016.
Цикл для коллекции подкаталогов и выход из цикла
В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each… Next.».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub test5() Dim FSO As Object, myFolders As Object, myFolder As Object, a As String ‘Создаем новый FileSystemObject и присваиваем его переменной «FSO» Set FSO = CreateObject(«Scripting.FileSystemObject») ‘Извлекаем список подкаталогов на диске «C» и присваиваем ‘его переменной «myFolders» Set myFolders = FSO.GetFolder(«C:») a = «Папки на диске C:» & vbNewLine ‘Проходим циклом по списку подкаталогов и добавляем в переменную «a« ‘их имена, дойдя до папки «Program Files«, выходим из цикла For Each myFolder In myFolders.SubFolders a = a & vbNewLine & myFolder.Name If myFolder.Name = «Program Files» Then a = a & vbNewLine & vbNewLine & «Хватит, дальше читать не буду!» _ & vbNewLine & vbNewLine & «С уважением,» & vbNewLine & _ «Ваш цикл For Each... Next.« Exit For End If Next Set FSO = Nothing MsgBox a End Sub |
Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.
В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.
Содержание
- 1 Early Exit from a Loop
- 2 For…Each Variation
- 3 Looping through the elements in an array
- 4 Loop through ranges
- 5 Using Nested Loops
- 6 Using the For Each…Next Loop
Early Exit from a Loop
<source lang="vb">
Sub GetControls2()
Dim myControl As Control Dim myForm As Form DoCmd.OpenForm "Customers" Set myForm = Screen.ActiveForm For Each myControl In myForm Debug.Print myControl.Name If myControl.Name = "Address" Then Exit For Next
End Sub
</source>
For…Each Variation
<source lang="vb">
Sub WorksheetLoop2()
Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Debug.Print ws.Name Next
End Sub
</source>
Looping through the elements in an array
<source lang="vb">
Sub ArrayLoop()
Dim avColors As Variant Dim vItem As Variant avColors = Array("Red", "Green", "Blue") For Each vItem In avColors Debug.Print vItem Next
End Sub
</source>
Loop through ranges
<source lang="vb">
Sub TestAreas()
Dim rng As Range For Each rng In Range("A1:B5,C6:D10,E11:F15").Areas MsgBox rng.Address Next rng
End Sub
</source>
Using Nested Loops
<source lang="vb">
Sub GetFormsAndControls()
Dim accObj As AccessObject Dim myControl As Control Set obj = CurrentProject.AllForms For Each accObj In obj Debug.Print accObj.Name & "---Form" If Not accObj.IsLoaded Then DoCmd.OpenForm accObj.Name For Each myControl In Forms(accObj.Name).Controls Debug.Print Chr(9) & myControl.Name Next DoCmd.Close End If Next
End Sub
</source>
Using the For Each…Next Loop
<source lang="vb"> Sub GetControls() Dim myControl As Control Dim myForm As Form DoCmd.OpenForm "Customers" Set myForm = Screen.ActiveForm For Each myControl In myForm Debug.Print myControl.Name Next End Sub </source>