Урок 10 по VBA — Цикл for each

Урок 10 по VBA — Цикл for each Макросы на VBA

В этой статье мы рассмотрим цикл 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, который позволяет задавать условие выполнения операций.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий