Упражнение 3
Изучите операторы Do….Loop.
Скопируйте в модуль код процедур DWL и DUL, выполните процедуры и проанализируйте результаты их выполнения.
Разработайте процедуру с использованием оператора Do Until для решения следующей задачи.
В таблице Excel, приведённой ниже, требуется определить фамилии студентов, получивших на экзамене хотя бы одну оценку “Неуд”.
СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ ВЕДОМОСТЬ |
|||
ИВАНОВ |
ХОР |
ОТЛ |
НЕУД |
ПЕТРОВ |
ХОР |
НЕУД |
ХОР |
СИДОРОВ |
ОТЛ |
НЕУД |
ОТЛ |
Результаты представить в виде следующей таблицы:
Неудовлетворительные оценки получили |
ИВАНОВ |
ПЕТРОВ |
СИДОРОВ |
Методические указания по выполнению Упражнения 3.
Создайте таблицу СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ ВЕДОМОСТЬ на листе «Ведомость», начиная с ячейки A1. Представленная выше таблица является примером её реализации; количество фамилий в общем случае =< 40.
Составьте алгоритм решения задачи в виде блок-схемы, лучше – с комментариями. Реализацию алгоритма в среде VBA осуществите несколькими процедурами, используя оператор Call для их взаимодействия. Например, оформление таблицы результатов можно выполнить отдельной процедурой.
Явно объявите переменные, которые вы предполагаете использовать в процедуре, в том числе переменные циклов.
Переменные, представляющие значения фамилий, являются строковыми размером до 20 символов и должны объявляться как String*20.
Результатную таблицу разместите на том же листе, на котором размещается СВОДНАЯ ЭКЗАМЕНАЦИОННАЯ ВЕДОМОСТЬ, начиная с ячейки H1, выполнив форматирование таблицы таким образом, как представлено на образце.
Решение задачи можно осуществлять двумя способами: помещать фамилии студентов, получивших неудовлетворительную оценку сразу в результатную таблицу или сначала создать массив фамилий двоечников, а затем скопировать их в результатную таблицу.
Концом списка фамилий является “пустая” строка, имеющая значение “”. Это значение можно использовать для определения конца списка в таблице Excel. Поскольку ячейка таблицы Excel может содержать невидимые пробелы, для определения того, что строка является “пустой”, следует использовать функцию VBA Trim, возвращающую значение ячейки или переменной без начальных и конечных пробелов, например, Trim(Cells(k, 1)), Trim(Фамилия).
Для просмотра исходного списка значений ячеек или массива фамилий следует использовать оператор Do Until, проверяющий, заполнена ли очередная ячейка таблицы или соответствующая ей переменная.
Оператор For Each … Next
Инструкция For Each применяется для выполнения одного и того же набора операторов для элемента массива или коллекции. Инструкция For Each имеет следующий формат:
For Each элемент In группа
[операторы]
[Exit For]
[операторы]
Next
Где группа – имя коллекции или массива, обязательный параметр; элемент – переменная, используемая для итерации по элементам коллекции или массива, может иметь только тип Variant, обязательный параметр; операторы – один или более операторов, которые выполняются для каждого элемента в группе.
Цикл выполняется, если в группе имеется, по крайней мере, один элемент. Все операторы цикла выполняются для каждого элемента в группе. После этого управление передаётся оператору, следующему за ключевым словом Next.
Цикл For Each...Next похож на For...Next за исключением того, что он повторно выполняет одну и ту же группу операторов для каждого элемента набора объектов или массива. Это особенно полезно в том случае, когда не известно число элементов в наборе или когда их количество может измениться, пока работает процедура.
В приведённой ниже процедуре ForEach используется динамический массив Мас, размерность которого L определяется как целая часть произведения значения случайной функции Rnd в операторе ReDim. Определение целой части производится при помощи встроенной функции VBA Int. Если количество элементов массива равно 0, то об этом выдаётся сообщение и происходит выход из процедуры.
По инструкции For i = 1 To L производится присвоение значений элементам массива Мас случайными числами и вывод их на экран.
По инструкции For Each… осуществляется присвоение значений ячейкам A1:AL ячейкам активного рабочего листа A1: AL случайных чисел
Option Base 1
Option Explicit
––––––––––––––––––––––––––––––––––––––––––––––––––––––
Sub ForEach()
Dim Mas() As Single
Dim L As Integer, i As Integer, k As Integer
Dim n As Variant
L = Int(Rnd * 10)
If L = 0 Then
MsgBox "Количество элементов массива равно " & L
Exit Sub
End If
MsgBox "Количество элементов массива равно " & L
ReDim Mas(L) ' Устанавливается размер динамического
' массива
For i = 1 To L
Mas(i) = Rnd
MsgBox "Mas(" & i & ")=" & Mas(i)
Next i
k = 0
For Each n In Mas
k = k + 1
Cells(1, k) = n
Next n
End Sub
Можно выводить все элементы массива в одном окне, предварительно сформировав параметр Prompt.
Sub ForEach1()
Dim Mas() As Single
Dim L As Integer, i As Integer, k As Integer
Dim n As Variant
Dim Massiv As String
L = Int(Rnd * 10)
If L = 0 Then
MsgBox "Количество элементов массива равно " & L
Exit Sub
End If
MsgBox "Количество элементов массива равно " & L
ReDim Mas(L) ' Устанавливается размер динамического
' массива
For i = 1 To L
Mas(i) = Rnd
Massiv = Massiv & "Mas(" & i & ")=" & Mas(i) & _
vbNewLine
Next i
MsgBox Massiv
k = 0
For Each n In Mas
k = k + 1
Cells(1, k) = n
Next n
End Sub
