- •Лабораторная работа №1 Анализ предметной области при разработке предметно ориентированного программного обеспечения
- •1. Цель работы
- •2. Методические указания
- •3. Содержание работы
- •Лабораторная работа № 2 Принципы проектирования пользовательского интерфейса
- •1. Цель работы:
- •2. Методические указания
- •3. Содержание работы
- •4. Контрольные вопросы
- •Лабораторная работа №3. Vba. Элементы управления
- •Оператор присвоения
- •Лабораторная работа № 4. Vba. Линейная программа на основе создания собственных диалоговых окон
- •Лабораторная работа № 5. Алгоритмы и программы разветвляющейся структуры
- •Лабораторная работа № 6. Vba. Цикл с параметром (For…Next)
- •Лабораторная работа № 7 Операторы цикла с предусловием и постусловием
- •Лабораторная работа № 8. Vba. Переключатели
- •Лабораторная работа №9. Vba: Списки
- •Лабораторная работа № 10. Подпрограммы и их применение
Лабораторная работа № 10. Подпрограммы и их применение
Теоретические сведения
Подпрограмма — программа, реализующая вспомогательный алгоритм. Основная программа — программа, реализующая основной алгоритм решения задачи и содержащая в себе обращения к подпрограммам. В VBA существуют два типа подпрограмм:
- подпрограммы-функции
- подпрограммы-процедуры.
Отличие функции от процедуры заключается в том, что результатом исполнения операторов, образующих тело функции, всегда является некоторое единственное значение, поэтому обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами.
Таблица 15
|
Подпрограмма-процедура |
Подпрограмма-функция |
Описание |
Sub <имя процедуры> ([<список параметров>]) <операторы> [Exit Sub] <операторы> End Sub |
Function <имя функции> [(<список параметров>]) [As <тип функции>] <операторы> [Exit Function] <операторы> <имя функции> = <выражение> End Function |
Вызов в основной программе |
<имя процедуры> <список аргументов>; Call <имя процедуры> [(<список аргументов>)]
|
<имя функции> (<список аргументов>)
|
Sub, End Sub – служебные слова VBA;
<имя процедуры> – имя процедуры, удовлетворяющее стандартным правилам именования;
<список аргументов> – список переменных, представляющих аргументы, которые передаются в процедуру Sub при её вызове. Имена переменных разделяются запятой;
<Инструкции> – любой набор команд VBA;
Exit Sub – инструкция, выполнение которой приводит к выходу из процедуры.
Синтаксис элемента <список аргументов>:
[ByVal | ByRef] <Имя переменной> [As <Тип>]
ByVal – ключевое слово, указывающее, что аргумент передается по значению;
ByRef – ключевое слово, указывающее, что аргумент передается по ссылке.
Описание ByRef используется в VBA по умолчанию;
<Имя переменной> – имя переменной, удовлетворяющее стандартным правилам именования переменных;
<Тип> – тип данных аргумента, переданного в процедуру;
В качестве результата процедура может возвращать в вызывающую программу множество простых или структурированных величин или не возвращать никаких значений. Среди параметров процедуры указываются как аргументы, так и результаты.
Обращение к процедуре — отдельный оператор.
Обращение к функции является операндом в выражении. Подпрограмма-функция вызывается в выражении по своему имени, за которым следует вписок аргументов в скобках.
При обращении к подпрограмме происходит передача ей аргументов по ссылке (если формальный параметр является параметром-переменной, описан как ByRef) или по значению (является параметром-значением, описан как ByVal).
Для того, чтобы понять, в каких случаях использовать тот или иной тип передачи аргументов, рассмотрим, как осуществляется замена формальных параметров на фактические в момент обращения к подпрограмме.
Если параметр определен как параметр-значение (с помощью ключевого слова ByVal), то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается подпрограмме. Важно учесть, что даже если в качестве фактического параметра указано простейшее выражение в виде переменной или константы, все равно подпрограмме будет передана лишь копия переменной (константы). Любые возможные изменения в подпрограмме параметра-значения никак не воспринимаются вызывающей подпрограммой, так как в этом случае изменяется копия фактического параметра.
Если параметр определен как параметр-переменная (по умолчанию или с помощью ключевого слова ByRef), то при вызове подпрограммы передается сама переменная, а не ее копия. Изменение параметра-переменной приводит к изменению самого фактического параметра в вызывающей подпрограмме.
Если в качестве фактического параметра используется константа, транслятор блокирует любые присваивания константе нового значения в теле подпрограммы.
Пример. Построить график функции на отрезке [a;b] с шагом h. Построение графика организовать процедурой.
Public Sub prog7() Dim a As Double, b As Double Dim h As Double Worksheets(1).Range("A:B").Select
Selection.Clear Worksheets(1).ChartObjects.Delete a = CDbl (InputBox("Введите a")) b = CDbl (InputBox("Введите b")) h = CDbl (InputBox("Введите h")) j = 1 For i = a To b Step h Worksheets(1).Range("A" & j) = i Worksheets(1).Range("B" & j) = Sin(i) / (i ^ 2 + 1) j = j + 1 Next i график End Sub
Sub график() n=Application.CountA(Worksheets (1).Range("A:A")) Range("A1:B" & CStr(n)).Select Charts.Add ActiveChart.ChartType = xlXYScatterSmoothNoMarkers ActiveChart.SetSourceData Source:=Sheets("Лист1").Range("A1:B" & CStr(n)), PlotBy:= xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="Лист1" End Sub |
Выделение двух столбцов (А и В) первого листа Очистка от данных выделенного диапазона Удаление с листа имеющихся диаграмм
j используется для задания номера строки при выводе данных В цикле For…Next выводятся на лист Excel данных для построения диаграммы (в столбец А – значения аргумента, в столбец В – значения функции для соответствующего аргумента)
Вызывается процедура график
При создании процедуры график() вначале был создан макрос в Excel, а затем полученный макрос отредактирован. В частности, первая команда в данной процедуре определяет количество заполненных строк на листе в столбце А и это значение присваивается переменной n.
|
Рисунок 13 - Блок-схема программы prog7
Блок-схема макроса не изображается.
Пример. Вычислить сумму членов ряда , где i! – факториал числа i (произведение натуральных чисел от 1 до i).
Public Sub prog6() Dim i As Integer, n As Integer Dim s As Double n = CInt(InputBox("Введите n")) For i = 1 To n s = s + 1 / faktor(i) Next MsgBox s End Sub
Public Function faktor(x As Integer) As Long faktor = 1 For i = 1 To x faktor = faktor * i Next i End Function |
При вычислении искомой суммы производится вызов функции factor и передается ее аргумент i
При описании функции типу ее результата присваивается тип длинный целый (Long), т.к., например, 10!=40320, что выходит за диапазон типа Integer. При выполнении функции результат присваивается ее имени |
Рисунок 12 - Блок-схема программы prog6 (а) и подпрограммы Faktor (б)