Вопрос № 20. Процедуры и функции VBA. Параметры формальные и фактические. Локальные и глобальные переменные. Привести примеры.
Модуль VBA — это лист с текстом программы, вставленный в рабочую книгу.
Модуль включает в свой состав функции и процедуры. Важное отличие функции от процедуры заключается в том, что функция возвращает результат вычисления. При этом в теле функции необходимо предусмотреть оператор, который присваивает результат вычисления ячейке памяти, имя которой совладает с именем функции.
При вызове процедуры или функции передают в них некоторые переменные путем замены формальных параметров на фактические. (Фактические параметры берутся при вызове ф-ции. Формальные параметры берутся из задач.) Внутри процедуры этим переменным может быть присвоено какое-нибудь новое значение, которое сохранится в переменной и после возврата из процедуры.
Если объявить переменные внутри процедуры, то оперировать этими переменными можно только внутри процедуры. Такие переменные называются локальными, т.е. область видимости локальных переменных - это код процедуры.
Если объявить переменн ые в начале программного модуля, то эти переменные будут видимы во всех процедурах модуля. Такие переменные называются глобальными, и в указанном случае область видимости глобальных переменных - это весь модуль.
Подпрограммы. В языке VBA подпрограммы делятся на два вида: подпрограммы-функции и подпрограммы—процедуры, которые подразделяются на две группы: встроенные и определяемые пользователем.
Функции Многократно повторяющуюся часть программы можно оформить подпрограммой - функцией. Функция состоит из описания и ее вызова.
Описание функции.
Общий вид функции пользователя:
Function Имя_Функции(список формальных параметров) As Тип описания функции
Раздел операторов
End Function
Имя функции - это любой идентификатор, определяемый пользователем.
Тело функции представляет собой раздел операторов, где должен находиться хотя бы один оператор, который присваивает имени функции одно значение.
Список формальных операторов с их типом описания заключается в круглые скобки и отделяется друг от друга запятыми.
Если тип описания формальных операторов не указывать (по умолчанию будет тип Variant).
Вызов функции. Общий вид вызова функции:
переменная = Имя Функции (фактические параметры)
Фактические параметры указываются через запятую круглых скобках.
Фактические параметры должны быть объявлены как формальные и количество фактических параметров должно быть равно количеству формальных.
Между формальными и фактическими параметрами должно быть полное соответствие, т.е. формальных и фактических параметров должно быть одинаковое количество; порядок следования фактических и формальных параметров должен быть один и тот же; тип каждого фактического параметра должен совпадать с типом соответствующего ему формального параметра
Фактические параметры бывают параметры - значения и параметры - переменные.
Подпрограммы — процедуры. Кроме функций пользователя, на листе модуля можно записывать процедуры. Процедура, как и функция, состоит из двух частей: описания и вызова функции.
Описание процедуры. Синтаксическая структура описания имеет следующий вид:
Sub Имя_Процедуры (список формальных параметров)
Тело процедуры
End Sub
Sub — ключевое слово (процедура)
End Sub - ключевое слово (конец процедуры)
Процедура начинается с заголовка процедуры Sub
Имя процедуры — это любой идентификатор, который выбирает сам пользователь.
Тело процедуры - это раздел операторов, которые размещаются между заголовком и концом процедуры.
Описание процедуры должно быть правильно синтаксически оформлено. Работать процедура начинает при ее вызове главной программы.
Вызов процедуры.
Имя_Процедуры_Список фактических параметров
Список фактических параметров от имени_Процедуры записывается через пробел, и отделяются друг от друга запятой, в круглые скобки не заключаются. В отличие от функций пользователя, процедуры нельзя вызывать из ячеек рабочего листа.
Функция передаёт в главную программу при её вызове только одно значение, а процедура может передавать одно или несколько значений при её вызове.
Option Explicit
Dim x As Integer, y As Integer, p As Integer
Function F(x As Integer) As Single
F = 4*x / (3-2*2)
End Function
Sub My_pr()
Cells(1,1) = “ТАБЛИЦА”
Cells(2,1) = “x”
Cells(2,1) = ”y”
p = 3
For x = 0 To 12
If 3 – 2*x = 0 Then GoTo M
y = F(x)
Cells(p, 1) = x
Cells(p, 2) = y
p = p + 1
M: Next x
End Sub