Массивы и циклы в VBA Access 2003

Продолжаем изучать 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 создадим форму, добавим элемент управления «кнопка» и в обработчик события «Нажатия кнопки» вставим следующий код (предполагается, что данные действия Вы уже должны уметь, если нет то вот скриншот):

Скриншот 1

Код:

'Переменные
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

Результат:

Скриншот 2

Теперь давайте приведем пример динамического массива:

'Объявляем массив с типом 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

Результат будет вот таким

Скриншот 3

Поясню, мы объявили тип с двумя переменными, затем объявили массив с нашим типом, что позволяет нам записывать как бы в одну переменную два значения, и в итоге получается своего рода ассоциативный массив.

Циклы и массивы очень часто используют для работы с неким массивом данных, например Recordset что значительно облегчает работу.

Для основ я думаю этого достаточно, примеры использования циклов и массивов мы продолжим изучать в следующих материалах, а пока на этом все. Удачи в освоении VBA Access!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.