- •Е. А. Сидорова, п. С. Челобанов основы программирования на vba омск 2011
- •1. Понятие и свойства алгоритма
- •1.1. Понятие алгоритма
- •1.2. Свойства и виды алгоритмов
- •1.3. Способы представления алгоритмов
- •2. Язык программирования vba
- •2.1. Языки программирования
- •2.2. Общие сведения о vba
- •2.3. Основные понятия языка программирования
- •2.4. Алфавит vba
- •2.5. Типы данных
- •2.6. Формы записи вещественных чисел в программе
- •2.7. Переменные
- •2.8. Константы
- •2.9. Встроенные функции
- •2.10. Выражения
- •2.11. Редактор Visual Basic
- •2.12. Правила записи и ввода программ на vba
- •2.13. Создание первой программы
- •3. Управление вводом и выводом данных
- •3.1. Оператор присваивания
- •3.2. Операторы ввода данных
- •3.3. Генерирование случайных чисел
- •3.4. Операторы вывода данных
- •4. Линейные вычислительные процессы
- •5. Разветвляющиеся вычислительные процессы
- •5.1. Алгоритм разветвляющегося процесса
- •5.2. Оператор условного перехода If
- •5.2.1. Однострочный (линейный) оператор If
- •If Условие Then Операторы_1 [ Else Операторы_2 ],
- •5.2.2. Блочная форма оператора If
- •5.3. Объединение условий с помощью логических операций
- •5.4. Оператор безусловного перехода GoTo
- •5.5. Оператор выбора Select Case
- •6. Символьные переменные
- •6.1. Общие понятия
- •6.2. Сравнение строк
- •6.3. Строковые функции
- •6.4. Оператор Mid
- •7. Введение в объектно-ориентированное программирование
- •7.1. Основные понятия
- •7.2. Создание пользовательского интерфейса
- •7.3. Установка свойств объектов и определение методов
- •7.4. Составление программного кода
- •7.5. Создание пользовательского приложения с использованием формы
- •7.5.1. Создание формы
- •7.5.2. Разработка программного кода
- •8. Циклические вычислительные процессы
- •8.1. Понятие цикла
- •8.2. Арифметический цикл
- •8.2.1. Цикл с разветвлением
- •8.2.2. Цикл со счетчиком. Вычисление максимума и минимума
- •8.2.3. Вложенные циклы
- •8.3. Вычисление сумм и произведений
- •8.4. Итерационные циклы
- •8.4.1. Операторы цикла Do … Loop
- •9. Модульное программирование.
- •9.1. Понятие процедуры
- •9.2. Параметры процедур – формальные и фактические
- •9.3. Разработка процедур-функций
- •9.4. Разработка процедур-подпрограмм
- •9.5. Срочный выход из процедур и циклов
- •10. Переменные с индексами. Одномерные массивы
- •10.1. Понятие массива
- •10.2. Ввод массива
- •10.2.1. Считывание массива с листа Excel
- •10.2.2. Заполнение массива случайными числами
- •10.3. Вывод массива
- •10.4. Решение задач с использованием массивов
- •644046, Г. Омск, пр. Маркса, 35
9.5. Срочный выход из процедур и циклов
Для срочного выхода из модульной или циклической структуры до ее окончания (например, при получении недопустимых значений) служит оператор Exit <структура>, который записывается непосредственно в теле этой структуры, а в результате его выполнения осуществляется переход к оператору, следующему за последним оператором структуры:
Exit Sub выход из ПП к оператору, следующему за оператором ее вызова;
Exit Function выход из ПФ к оператору, следующему за оператором ее вызова;
Exit For выход из цикла For … Next к оператору, следующему за Next;
Exit Do выход из цикла Do … Loop к оператору, следующему за Loop.
Прервать работу программы можно, нажав клавиши Ctrl + Pause/Break.
10. Переменные с индексами. Одномерные массивы
10.1. Понятие массива
Начнем изучение этой темы с простого примера.
Пример ОМ1. Вычислить сумму шести произвольных чисел.
Первый способ. Каждое число обозначим отдельной переменной:
Sub Пример_ОМ1_способ1()
Dim a As Single, b As Single, c As Single, d As Single,
Dim e As Single, f As Single, Dim s As Single
a = Val(InputBox("Введите a")) : b = Val(InputBox("Введите b"))
c = Val(InputBox("Введите c")) : d = Val(InputBox("Введите d"))
e = Val(InputBox("Введите e")) : f = Val(InputBox("Введите f"))
s = a + b + c + d + e + f
Debug.Print "Сумма ="; s
End Sub
Преимущество этого способа заключается в том, что сохраняются все введенные значения, недостаток – объем программы зависит от количества чисел (например, для 500 чисел он будет очень большим).
Второй способ. Каждое число будем вводить в цикле в одну и ту же переменную a, для вычисления суммы организуем цикл накопления:
Sub Пример_ОМ1_способ2()
Dim a As Single, i As Byte, s As Single
s = 0
For i = 1 To 6
a = Val(InputBox("Введите a" & i))
s = s + a
Next i
Debug.Print "Сумма ="; s
End Sub
Преимущество второго способа состоит в том, что объем программы не зависит от количества чисел (программа вводит каждое новое значение в одну и ту же переменную а и добавляет его к сумме предыдущих чисел), недостаток – в конце цикла переменная а содержит только последнее введенное значение, все предыдущие значения оказываются утраченными. Таким образом, положительные и отрицательные моменты рассмотренных способов решения данного примера прямо противоположны.
Чтобы объединить положительные свойства обоих способов существуют специальные средства. В тех случаях, когда необходимо манипулировать множеством значений одной переменной с сохранением этих значений в памяти ЭВМ, используют переменную с индексом. Индекс – порядковый номер очередного значения переменной, он может быть записан в виде константы, переменной или арифметического выражения и может принимать целые положительные значения и быть нулем. Индексы записывают в скобках после имени переменной, например: z(5), x1(i), pr(n+2).
Переменные с индексами являются элементами массивов.
Массив – упорядоченный по возрастанию индексов набор значений одной переменной.
Массив характеризуется:
именем (записывается по обычным правилам);
количеством измерений (индексов): одномерные, двумерные, многомерные массивы;
размером (верхней границей каждого из индексов).
Примерами одномерных массивов в математике являются векторы, двумерных – матрицы.
Отдельными элементами массива можно пользоваться так же, как и простыми переменными, не забывая при этом в скобках указывать индекс, например: x(5) = 2, r(7) = 2 * x + 4, x(i) = y(k) + 1, Debug.Print x(n).
По умолчанию элементы массива в VBA нумеруются, начиная с нуля. Чтобы установить нумерацию элементов всех массивов с единицы, в тексте программы на уровне общих объявлений модуля необходимо записать оператор Option Base 1.
До использования массива в программе его необходимо объявить, это можно сделать с помощью оператора Dim с указанием имени массива, максимально возможного индекса и типа данных в нем:
Dim Имя_массива(Max_индекс) [As Тип]
Например: Dim A(7) As Single
или: Const n = 7
Dim A(n) As Single
При выполнении оператора Dim в памяти ЭВМ резервируется необходимое для размещения массива количество ячеек (в данном случае 8 – от 0 до 7 (так как нет Option Base 1)). В ГСА оператор Dim не отображается.
Возможно объявление массива с указанием диапазона изменения индексов, например:
Dim A(imin To imax) As Single,
где imin и imax – числа или объявленные константы, например:
Dim Z(5 To 9) As Single
В тех случаях, когда первоначально размер массива неизвестен или меняется в разных местах программы, используют динамический массив. Тогда массив сначала объявляется без верхней границы, например:
Dim x() As Single, n As Integer
а затем в нужном месте программы указывается его размер:
n = 6
ReDim x(n) 'Задаем (изменяем) размер массива
При использовании оператора ReDim размер массива n может быть как переменной, так и константой.
Команда ReDim не только изменяет размер массива, но и удаляет из него старые значения. Чтобы их сохранить, используют ключевое слово Preserve:
ReDim Preserve x(n)
При этом следует иметь в виду, что если новый размер массива будет меньше предыдущего, то часть старых значений все равно окажется утраченной.
Работа с элементом массива xi может включать в себя любые операции с ним: ввод, вывод, расчет, проверку выполнения какого-либо условия и др. Обычно работа с элементами массива осуществляется в цикле.
Графическая схема алгоритма обработки массива в общем виде приведена на рис. 37. При этом использованы следующие обозначения:
i – индекс элемента массива;
ni – начальное значение индекса;
ki – конечное значение индекса;
∆i – шаг изменения индекса;
xi – значение i-го элемента массива x.
Т
ретий
способ.
Запишем решение примера ОМ1 с использованием
массива. ГСА приведена на рис. 38. Текст
программы (подчеркнутым шрифтом отмечены
отличия от второго способа решения
задачи):
Sub Пример_ОМ1_способ3()
Dim a(6) As Single, i As Byte, s As Single
s
= 0
For i = 1 To 6
a(i) = Val(InputBox("Введите a" & i))
s = s + a(i)
Next i
Debug.Print "Сумма ="; s
End Sub
В этом примере ввод элементов массива выполняется с помощью функции InputBox. Однако такой способ ввода используется в редких случаях, поскольку при каждом запуске программы все значения приходится вводить заново. Поэтому чаще ввод элементов массива осуществляют другими способами.
