ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Функции, определяемые пользователем

 

Функция-процедура (или функция) – это особый вид процедуры VBA, возвращающей результат. Создание новой функции состоит из написания программных операторов, которые определяют:

· аргументы, используемые функцией;

· действия, выполняемые функцией;

· значение, возвращаемое функцией.

 

Функция-процедура имеет следующий синтаксис:

[Private | Public] [Static] Function Name([Arglist]) [As Type]

'комментарий, описывающий функцию

[Инструкции]

[Name = expression]

[Exit Function]

[Инструкции]

[Name = expression]

End Function

 

Public – Указывает, что процедура Function доступна для всех других процедур во всех модулях;

Private – Указывает, что процедура Function доступна для других процедур только того модуля, в котором она описана;

Static – Указывает, что локальные переменные процедуры Function сохраняются в промежутках времени между вызовами этой процедуры

Name – имя, выбранное для этой функции. При написании имен функций необходимо соблюдать те же правила, что и при написании имен других идентификаторов в VBA: они должны начинаться с буквы, не могут содержать пробелов или каких-либо символов арифметических, логических операторов или операторов отношения и не могут дублировать ключевые слова VBA.

Arglist –список ее аргументов функции (является необязательным).

Туре – любой тип возвращаемого значения функции. Тип данных результата функции следует задавать для: ускорения выполнения кода, более эффективного использования памяти, получения более легкого и понятного кода.

Name = expressionпредставляет присваивание функции, которое указывает VBA, какое значение должна возвращать функция.

Exit Function приводит к немедленному выходы из функции

 

Функция может иметь аргументы, а может не иметь. Все зависит от конкретной ситуации. Если функция не имеет аргументов в объявлении функции необходимо использовать круглые скобки. Например, можно написать функцию-процедуру, возвращающую имя файла, содержащего текущую рабочую книгу, так, чтобы можно было вставлять имя файла в ячейку рабочего листа. Такой функции не нужны аргументы, ей не требуется никакая внешняя информация для выполнения работы, и она будет иметь подобное объявление:

 

Function ThisBookName()

 

При объявлении функции-процедуры необходимо указывать имя каждого аргумента, передаваемого функции; имена аргументов в списке следует отделять друг от друга запятой и писать в соответствии с правилами, применяемыми к любому идентификатору VBA. Имена, предоставляемые пользователем в списке аргументов, подобны переменным: они ссылаются на значение. Имена аргументов имеют ту же область действия, что и переменные, объявляемые локально в функции-процедуре, то есть недоступны вне функции-процедуры, в списке аргументов которой они объявляются.

Строка Name = expression представляет присваивание функции. Присваивание функции указывает VBA, какое значение будет возвращать функция. Присваивание функции использует имя функции-процедуры и присваивает ему значение, как если бы это была переменная. Функции-процедуры могут не иметь совсем или иметь один или несколько различных операторов присваивания функции.

Подпрограммы

 

Подпрограмма – представляет собой определенный набор операторов, составленный пользователем и расположенный отдельно от основной программы. Подпрограмма имеет следующий синтаксис:

 

[Private | Public] [Static] Sub Name([Arglist]) [As Type]

'комментарий, описывающий функцию

[Инструкции]

[Exit Sub]

[Инструкции]

End Sub

 

Использование функций-процедур и подпрограмм в VBA

 

Использовать собственные функции-процедуры в операторах VBA надо так же, как любые встроенные функции. Все правила и условия по использованию встроенных функций применимы к пользовательским функциям-процедурам. При вызове функции необходимо включать список аргументов в круглых скобках.

Если нужно использовать именованные аргументы функциях-процедурах, надо использовать имена из списка аргументов в объявлении функции-процедуры. Например, чтобы использовать именованный аргумент в вызове функции LenTrim, надо использовать оператор, подобный следующему:

AnyStr = SLen(tStr:=MyString)

Для вызова процедуры Sub используется следующие способы:

ИмяПроцедуры СписокФактическихПараметров

Call ИмяПроцедуры (СписокФактическихПараметров)

 

Передача аргументов по ссылке и по значению

 

Существуют два способа, которыми VBA передает информацию в функцию-процедуру: по ссылке и по значению.

По умолчанию VBA передает все аргументы по ссылке. При передаче данных функции посредством аргумента по ссылке VBA, на самом деле, передает только адрес памяти, который ссылается на исходные данные, определенные в списке аргументов функции во время вызова функции. Это означает, что если функция изменяет значения в любом из аргументов, исходные данные, переданные функции посредством этого аргумента, также изменяются.

При передаче аргумента по значению VBA создает копию исходных данных и передает эту копию функции. Если функция изменяет значение в аргументе, передаваемом по значению, изменяется только копия данных; исходные данные не изменяются. Передача по ссылке позволяет с помощью функции изменять исходные данные, передаваемые функции посредством аргумента; передача же по значению не позволяет изменять значение исходных данных.

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

 

Использование процедур

 

Одним из хороших принципов программирования является принцип модульности. Процедура не должна содержать бесконечно длинный код, части которого выполняют совершенно не связанные между собой задачи. Следу помещать в каждую процедуру небольшой и функционально законченный код, который легко читать и сопровождать. Например, хорошо понимается код со следующей структурой:

 

Sub ГлавнаяПроцедура()

'Вызов процедуры Процедура1

Call Процедура1

'Вызов процедуры Процедура2

Call Процедура2

'Вызов процедуры Процедура3

Call Процедура3

End Sub

 

Sub Процедура1()

' Код процедуры

End Sub

 

Sub Процедура2()

'Код процедуры

End Sub

 

Sub Процедура3()

'Код процедуры

End Sub

 

Можно также встретить и следующий код:

 

Sub ГлавнаяПроцедура()

'Вызов процедуры Процедура1

Call Процедура1

End Sub

 

Sub Процедура1()

'Вызов процедуры Процедура2

Call Процедура2

End Sub

 

Sub Процедура2()

'Вызов процедуры Процедура3

Call Процедура3

End Sub

 

Sub Процедура3()

'Код процедуры

End Sub

 

В этих фрагментах кода процедуры не воз­вращают никаких результатов свой работы. Это может быть только в случае, когда эти процедуры по очереди обрабатывают какие-то общие данные, выпол­няя над ними определенные действия. Результатами этих действий могут быть либо сами преобразованные данные, либо новые (и тоже общие) данные.

Возможна ситуация, когда обработка данных одной процедурой зависит от результатов обработки этих данных другой процедурой, выполняе­мой раньше. Вполне возможно, что по каким-то причинам (пользователь не­правильно ввел данные или вообще отказался от ввода, неправильно ввел числовые и другие данные) одна из процедур не подготовила данные для обработки следующей процедурой. В этом случае весь процесс обработки дан­ных следует прекратить и в дальнейшем никаких процедур не вызывать. Т.е. просто закончить работу всей программы. При этом даже необязательно воз­вращаться в вызывающую процедуру, особенно если предусмотреть перед каждым выходом из программы вывод окна с сообщением о том, почему и где было прервано выполнение кода.

Для полного завершения выполнения программы с помощью VBA исполь­зуйте ключевое слово End одно в отдельной строке:

End

При выполнении этого оператора VBA прекращает все выполнения операторов процедуры и функции. Любые имеющиеся переменные перестают существовать и их значения теряются.

 

Рекурсия

 

Рекурсивная (recursive) функция или процедура – это функция или процедура, которая вызывает сама себя. Почти во всех случаях, рекурсия является ошибкой программирования и приводит к полному сбою программы. Наиболее общим симптомом возникновения этой проблемы является ошибка из-за нехватки памяти или ошибка из-за нехватки памяти в стеке.

 

Примеры рекурсивных функций

 

Самый простой пример, который может продемонстрировать рекурсивную функцию, это – пример функции возведения числа в степень. Алгоритм рункции Rekurs основан на том факте, что число, возведенное в степень n, равно этому же числу, умноженному само на себя в степени n-1. Например, 23 равно 2х23-1 или 2х22.

Пример 5 содержит код функции Rekurs, возвращающей степень числа. В качестве аргументов функция принимает число и степень, в которую нужно возвести это число.

 

Область действия переменной

 

Область действия переменной задает область, в которой может быть использована переменная. В VB имеется три соответствующих уровня переменных:

1. Процедурный уровень. Переменная, объявленная в процедуре, является доступной только в этой процедуре. Они описываются внутри процедуры при помощи инструкции Dim. Поскольку область действия процедурного уровня ограничивает доступ к переменной процедурой, в которой объявляется эта переменная, можно использовать то же имя переменной в разных процедурах. Но внутри своей области определения имя должно быть уникальным.

2. Модульный уровень. Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim, размещенной в области описания модуля, т. е. перед описанием процедур. Это необходимо когда несколько процедур должны иметь доступ к одной и той же переменной. Обычно эффективнее вычислить один раз какое-либо значение, сохранить его в переменной, а затем использовать эту переменную в не­скольких процедурах, чем вычислять одно и то же значение снова и снова. Имя переменной должно быть уникальным в ее области действия – нельзя объявлять две переменные модульного уровня с одним именем в одном и том же модуле.

3. Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.

Хотя имя переменной должно быть уникальным в области ее действия, можно иметь переменные с одним и тем же именем на разных уровнях области действия. Когда переменные имеют одно имя, но разные области действия, VBA использует переменную с наиболее локальной областью действия. В примере 10 приведен модуль, содержащий три процедуры, каждая из которых используют переменные с одним и тем же именем.

 

Время жизни переменной

 

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

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

Значения переменных, объявляемых на уровне модуля, удерживаются в памяти столь долго, сколько VBA выполняет процедуру в этом модуле.

При выполнении процедуры VBA, фактически, просматривает весь мо­дуль, содержащий эту процедуру, и создает любые переменные модульного уровня. Пока VBA выполняет процедуру в этом модуле, значения переменных модульного уровня сохраняются.

 

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти