Продолжаем изучать VBA Access, и сегодня мы будем разговаривать о том, как можно использовать циклы и массивы в VBA Access. Как обычно рассмотрим все это на примерах, а также научимся создавать собственный тип данных типа record или «запись», который пригодится как раз, для того чтобы сделать своего рода ассоциативный массив, не совсем конечно, но в некоторых случаях может сильно облегчить Вам реализацию той или иной задачи.
Ранее мы с Вами уже сталкивались с задачами, которые необходимо было реализовать в Access 2003, а конкретней средствами VBA, например, Access – Импорт данных в базу MSSql 2008 или Выгрузка данных в текстовый файл из MSSql 2008 клиентом Access 2003 И там мы как раз сталкивались с циклами, но подробно о них мы не разговаривали, поэтому пришло время поговорить о циклах и еще, об очень полезной штуке в VBA это массивы.
Примечание! Для понимания всего того, о чем мы сегодня будем разговаривать, советую ознакомиться с материалом – Встроенные функции VBA Access.
Циклы в VBA Access
И как Вы поняли, начнем мы с циклов, и если конкретней, то с небольшой теории.
Цикл – это действия (инструкции), которые повторяются неоднократно, и прекращают свое выполнение в зависимости от условий или просто выполняются заданное количество раз.
В VBA, как и в других языках программирования существуют несколько разновидностей циклов, и сейчас самые часто используемые мы рассмотрим.
Цикл For ….. Next – это цикл, который выполняется заданное количество раз, будь то вручную или в зависимости от значения переменной.
Данный цикл просто незаменим тогда, когда необходимо выполнять действие, определенное количество раз, синтаксис его очень прост:
For счетчик=начальное значение счетчика to конечное значение счетчика Инструкции Step (шаг итерации) Exit for (выход из цикла до срочно) Next (следующая итерация)
А теперь давайте приведем пару простых примеров для понимания, откроем Access создадим форму, добавим элемент управления «кнопка» и в обработчик события «Нажатия кнопки» вставим следующий код (предполагается, что данные действия Вы уже должны уметь, если нет то вот скриншот):
Код:
'Переменные Dim cnt As Integer Dim i As Integer Dim rezult As Integer 'Задаем количество, столько раз будет выполняться цикл cnt = 10 rezult = 0 'Сам цикл For i = 1 To cnt rezult = rezult + 1 Next 'Просто сообщение о результате выполнения цикла MsgBox "Цикл выполнился " & rezult & " раз"
Это самый простой пример, когда мы сами указали сколько раз будет выполняться наш цикл, результат будет 10 раз, теперь давайте приведем пример чуть посложней:
'Переменные Dim cnt As Integer Dim i As Integer Dim rezult As Integer 'Задаем количество, столько раз будет выполняться цикл cnt = 10 rezult = 0 'Сам цикл For i = 1 To cnt Step 2 'Если i больше 5, то выходим из цикла If i > 5 Then Exit For End If rezult = rezult + 1 Next 'Просто сообщение о результате выполнения цикла MsgBox "Цикл выполнился " & rezult & " раз"
Догадайтесь сколько раз выполнится цикл? Ответ 3 раза, потому что мы указали шаг равным 2, и еще тогда когда i стало больше 5, мы завершили цикл, т.е.
Первая итерация
i = 1
result = 1
Вторая итерация
i = 3
result = 2
Третья итерация
i = 5
result = 3
Четвертая итерация
i = 7
и вот тут мы вышли из цикла
Надеюсь понятно:)
Цикл do while ……loop – это цикл выполняется до тех пор, пока соблюдается определенное условие, которое в свою очередь проверяется до начала итерации, другими словами цикл может и не начаться, если условие сразу не выполняется.
Синтаксис:
do while условие инструкции exit do (Выход из цикла по дополнительному условию) loop (переход к следующей итерации)
пример:
Dim cnt As Integer Dim rezult As Integer cnt = 1 rezult = 0 Do While cnt < 10 If rezult > 5 Then Exit Do End If rezult = rezult + 1 cnt = cnt + 1 Loop MsgBox "Цикл выполнился " & rezult & " раз"
Здесь мы входим в цикл и сразу проверяем cnt у нас меньше 10 и если да то выполняем блок инструкций, в которых у нас стоит еще одно условие, если result стал больше 5, то просто выходим из цикла. Результат в этом случае будет 6 раз, и в этом случае мы вышли из цикла через Exit Do.
Цикл do….. loop while – это цикл выполняется до тех пор, пока соблюдается определенное условие, а вот в этой разновидности циклов условие проверяется после выполнения первой итерации, и здесь хоть одна итерация да выполнится.
Пример:
Dim cnt As Integer Dim rezult As Integer cnt = 1 rezult = 0 Do If rezult > 5 Then Exit Do End If rezult = rezult + 1 cnt = cnt + 1 Loop While cnt < 5 MsgBox "Цикл выполнился " & rezult & " раз"
Это практически такой же пример, как и предыдущий только условие проверяется после выполнения операторов в теле цикла, и для того чтобы выйти из цикла по основному условию, я изменил условие на cnt<5 и именно по этому условию мы вышли из цикла, так как когда переменная cnt достигла значения пяти то переменная rezul оставалась со значение 4, это кстати и результат.
Также существуют циклы:
Do until…..loop – цикл выполняется до тех пор пока условие не выполняется, а когда условие выполнится то произойдет завершение цикла. Проверка осуществляется до начала цикла.
Синтаксис:
Do until условие инструкции exit do (Выход из цикла по дополнительному условию) loop (переход к следующей итерации)
Do ….. until loop – тот же самый цикл только проверка осуществляется после выполнения блока инструкций.
Синтаксис:
Do инструкции exit do (Выход из цикла по дополнительному условию) loop until условие
Массивы в VBA Access
Массив в VBA – это набор однотипных переменных. Массивы в VBA бывают статические, динамические, одномерные и многомерные. Для просмотра данных в массиве очень часто используют циклы, не спроста мы их рассмотрели в начале этого материала.
Синтаксис объявления массива:
Dim имя_массива (нижняя граница to верхняя) as тип данных в массиве
Давайте приведем простой пример, одномерного статического массива.
'Объявляем массив с типом String Dim test_arr(1 To 2) As String Dim str As String 'записываем данные в массив test_arr(1) = "Первый элемент" test_arr(2) = "Второй элемент" 'циклом перебираем массив и записываем значения в переменную str For i = 1 To 2 str = str & vbNewLine & test_arr(i) Next 'Выводим итоговую строку MsgBox str
Результат:
Теперь давайте приведем пример динамического массива:
'Объявляем массив с типом String, уже без размерности Dim test_arr() As String Dim str As String Dim n As Integer n = 2 'переопределяем размерность массива ReDim test_arr(1 To n) As String 'записываем данные в массив test_arr(1) = "Первый элемент" test_arr(2) = "Второй элемент" 'циклом перебираем массив и записываем значения в переменную str For i = 1 To 2 str = str & vbNewLine & test_arr(i) Next 'Выводим итоговую строку MsgBox str
Здесь мы объявили массив без указания его размерности, а затем просто его переопределили оператором ReDim. Если еще добавить необязательное ключевое слово Preserve то массив изменит свой размер с сохранением всех данных в нем, которые там уже были, например:
ReDim Preserve test_arr(1 To 10) As String
Пример многомерного массива:
Dim test_arr(2, 2) As String Dim str As String 'записываем данные в массив test_arr(1, 1) = "Первый элемент первого массива" test_arr(1, 2) = "Второй элемент первого массива" test_arr(2, 1) = "Первый элемент второго массива" test_arr(2, 2) = "Второй элемент второго массива" 'циклами перебираем массив и записываем значения в переменную str For i = 1 To 2 For a = 1 To 2 str = str & vbNewLine & test_arr(i, a) Next Next 'выводим итоговую строку MsgBox str
Здесь я просто использую два цикла для переборки элементов массива.
А теперь, как и обещал, давайте приведем примеры объявления собственного типа данных, и применим его к данным в массиве.
Для объявления типа необходимо прописать:
Public Type mytype name_str As String value_str As String End Type
А в процедуру вставляем:
'объявляем массив с нашим типом Dim test_arr(2) As mytype Dim str As String 'записываем данные в наш массив test_arr(1).name_str = "Поле 1" test_arr(1).value_str = "Значение поля 1" test_arr(2).name_str = "Поле 2" test_arr(2).value_str = "Значение поля 2" For i = 1 To 2 str = str & test_arr(i).name_str & " = " & test_arr(i).value_str & vbNewLine Next MsgBox str
Результат будет вот таким
Поясню, мы объявили тип с двумя переменными, затем объявили массив с нашим типом, что позволяет нам записывать как бы в одну переменную два значения, и в итоге получается своего рода ассоциативный массив.
Циклы и массивы очень часто используют для работы с неким массивом данных, например Recordset что значительно облегчает работу.
Для основ я думаю этого достаточно, примеры использования циклов и массивов мы продолжим изучать в следующих материалах, а пока на этом все. Удачи в освоении VBA Access!