For each in vba word

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's user avatar

braX

11.5k5 gold badges20 silver badges33 bronze badges

asked Mar 28, 2014 at 11:06

Kamran's user avatar

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

Aidan's user avatar

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

Marcucciboy2's user avatar

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!

automacro

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.

vba loop builder

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

vba for each cell in range

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

Список папок VBA

Теперь настало самое интересно, в редакторе кода для формы пропишите:

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 – имя папки.

Вывод специальных папок в VBA

А вот пример вывода списка специальных папок 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>

Like this post? Please share to your friends:
  • Fonts standard with word
  • For each excel worksheet
  • Fonts on the word content
  • For each excel sheet
  • Fonts names on word