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