Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Процедуры и функции, их вызов и передача параметров



Основными компонентами программы на VBA являются процедуры и функции. Вот как может выглядеть процедураVBA:

Sub и мяПроцедуры (аргумент1, аргумент2,...)

операторVisualBasic1

о ператорVisualBasic2

...

End Sub

Функция отличается от процедуры тем, что ее имя выступает также в качестве переменной и используется для возвращения значения в точку вызова функции. Вот как может выглядеть функция:

Function имяФункции (аргумент1, аргумент2,...)

операторVisualBasic1

операторVisualBasic2

...

имяФункции = возвращаемоеЗначение

End Function

Для того чтобы использовать написанную вами процедуру или функцию, необходимо вызвать ее. Как же осуществляется вызов процедури функций? Процедуру со списком аргументов можно вызвать только из другой процедуры или функции, использовав ее имя со списком фактических значений аргументов в качестве одного из операторов VBA. Функцию же можно вызвать не только с помощью отдельного оператора VBA, но и поместив ее имя со списком фактических значений аргументовпрямо в формулу или выражение в программе на VBA, или, например, прямо в формулу на рабочем листе Excel. Наконец, процедура с пустым списком аргументов (т.е. командный макрос) может быть вызвана не только из другой процедуры или функции, но и с помощью комбинации клавиш быстрого вызова, команд раскрывающихся меню или кнопок панелей инструментов, а кроме того, она может быть назначена командной кнопке[3], расположенной в диалоговом окне или просто в одном из документов Office, и в этом случае ее вызов может осуществляться щелчком по этой кнопке. Понятно, что функции или процедуры, нуждающиеся в передаче им аргументов, таким способом вызвать нельзя.

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

Вот пример вызова процедуры с передачей ей двух аргументов (константы и выражения):

CrossRC 7, i + 2

или

Call CrossRC(7, i + 2)

А вот пример вызова двух функций — Left и Mid, и использования возвращаемого ими значения в выражении:

yStr = Left(y, 1) & Mid(y, 2, 1)

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

Способ передачи параметров процедуре или функции определяется при описании ее аргументов: имени аргумента может предшествовать явное указание способа передачи параметра. Описатель ByRef задает передачу по ссылке, а ByVal — по значению. Если же явное указание способа передачи параметра отсутствует, то по умолчанию подразумевается передача по ссылке.

Поясним сказанное на примере. Пусть имеются следующие описания двух процедур:

Sub Main()

a = 10

b = 20

c = 30

Call Example1(a, b, c)

Call MsgBox(a)

Call MsgBox(b)

Call MsgBox(c)

End Sub

Sub Example1(x, ByVal y, ByRef z)

x = x + 1

y = y + 1

z = z + 1

Call MsgBox(x)

Call MsgBox(y)

Call MsgBox(z)

End Sub

Вспомогательная процедура Example1 использует в качестве формальных аргументов три переменные, описанные по разному. Далее в теле этой процедуры каждый из формальных аргументов увеличивается на единицу, а затем их значения выводятся на экран с помощью функции MsgBox. Основная процедура Main устанавливает значения переменных a, b и c, а затем передает их в качестве фактических параметров процедуре Example1. При этом первый аргумент передается по ссылке (действует умолчание), второй по значению, а третий снова по ссылке. После возврата из процедуры Example1 основная процедура также выводит на экран значения трех переменных, передававшихся в качестве аргументов. Всего на экран выводится шесть значений: сначала это числа 11, 21 и 31 (все полученные значения увеличены на 1 и выводятся процедурой Example1); затем это числа 11, 20 и 31 (эти значения выводятся процедурой Main: переменные, переданные по ссылке, увеличились, а переменная, переданная по значению — нет).

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

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

имяМодуля. имяПроцедуры

Если при этом имя модуля состоит из нескольких слов, следует заключить это имя в квадратные скобки. Например, если модуль называется "Графические процедуры", а процедура — "Крестик", вызов может выглядеть следующим образом:

[Графические процедуры].Крестик

Можно использовать процедуры, расположенные и в других проектах, хранящихся в других шаблонах или других документах Office. Однако при этом необходимо установить в активном проекте ссылку на другой проект, после чего становятся доступными все имеющиеся в нем модули и процедуры. Вот как устанавливается такая ссылка. Прежде всего, рекомендуется сначала открыть тот шаблон или документ, в котором хранится проект, содержащий модуль. Затем следует вернуться к исходному документу, где содержится процедура, в которой вы хотите использовать ссылку на другой проект, и перейти в окно редактора Visual Basic с помощью команды Ø Сервис Ø Макрос Ø Редактор Visual Basic, а затем в окне редактора выполнить команду Ø Сервис Ø Ссылки. Будет открыто одноименное диалоговое окно, с помощью которого можно установить связь между разными проектами (рис. 6.3-4).

Рис. 6.3-4. Диалоговое окно Ссылки

Если документ, содержащий нужный проект, был заранее открыт, то имя проекта можно найти в списке Доступные ссылки, в котором все проекты, ссылки на которые уже разрешены, помечены флажками. Установите флажок для того проекта, чьи процедуры и функции вы также собираетесь использовать, и нажмите кнопку OK. Если же документ, содержащий проект, не был открыт заранее, нужно сначала нажать кнопку Обзор и открыть его.

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

[ имяПроекта ]. имяМодуля. имяПроцедуры

[ имяПроекта ]. имяПроцедуры





Дата публикования: 2014-12-28; Прочитано: 258 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.01 с)...