Выбрать главу

Привлекательные аргументы

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

Рассмотрим снова процедуру ДеФункция:

Public Function ДеФункция(х As Integer, y As Integer )

Dim Z AS Integer

z = x + у

ДеФункция = x ́ z

End Function

У этой процедуры два аргумента - х и у. Как видно из программного кода, аргументы процедуры являются частью ее объявления. Аргументы размещаются в скобках сразу после имени процедуры в списке аргументов, где для каждого из аргументов задается имя и тип данных (подробности - ниже, в разделе Создание процедур с аргументами).

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

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

Полезные аргументы

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

Пришло время рассмотреть пару примеров для сравнения. Сначала рассмотрим процедуры, использующие аргументы Модель и ГодВылуска для передачи значений:

Public Sub ВызывающаяПроцедура()

ДоходОтСтаройМашины = ПродажаСтаройМашины[Rambler _

Classic,1962)

End Sub

Public Function ПродажаСтаройМашины(Модель As String, _

ГодВыпуска As Integer)

Dim ВозрастнойФактор As Integer

Dim ЦеновойФактор As Single

ВозрастнойФактор = ГодВыпуска - 1900

If Модель = Rambler Classic Then

ЦеновойФактор = .001

Else If Модель = Dodge Dart Then

ЦеновойФактор = .005

Else If ...

(другие операторы)

End If

ПродажаСтаройМашины = ВозрастнойФактор * _

ЦеновойФактор * 1000

End Function

Здесь процедура с именем ВызывающаяПроцедура использует процедуру типа Function с именем ПродажаСтаройМашины для вычисления результата с именем

ДоходСтСтаройМашины. Раз процедура типа Function использует аргументы, вы можете сообщить ей непосредственно, какую машину вы продаете и какого она года выпуска.

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

Dim Модель As String

Dim ГодВыпуска As Integer

Public Sub ВызывающаяПроцедура2()

Модель = Dodge Dart

ГодВыпуска = 1963

ДоходОтСтаройМашины = ПродажаСтаройМашины2()

End Sub

Public function ПродажаСтаройМашины 2()

Dim ВозрастнойФактор As Integer

Dim ЦеновойФактор As Single

If Модель = Rambler Classic Then

ЦеновойФактор = .001

Else If Модель = Dodge Dart Then

ЦеновойФактор = .005

Else If ...

(другие операторы)

End If

ПродажаСтаройМашины = ВозрастнойФактор * _

ЦеновойФактор * 1000

End Function

Так зачем же возражать?

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

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

* При создании программного кода аргументы помогают уменьшить число переменных, которые требуется создать (вне всех процедур в разделе объявлений модуля).

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

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

Создание процедур с аргументами

Чтобы создать процедуру с аргументами, поместите аргументы в скобки после имени процедуры в ее объявлении. Например:

Романист(Заглавие As String, Страницы Аз Integer, _

СрокЗавершения As Date)

Отсюда видно, что тип каждого из аргументов задается следующим за именем аргумента сочетанием As тип, где тип может быть любым допустимым в VBA типом данных или классом объекта. Если указать только имя аргумента и не указать тип, то VBA припишет такому аргументу тип Variant. (Да знаю я, знаю, что еще не обсуждал типы данных и классы объектов, но вы можете найти все о них в главах 7 и 12 соответственно.)

Вызов процедур с аргументами

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

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

Скобки для аргументов обязательны при вызове процедуры типа Function для получения возвращаемого значения.

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

Организация процедур

Любую VBA-программу, независимо от ее длины, можно оформить в виде одной единственной процедуры. Так зачем же создавать себе лишние заботы, разбивая программу на процедуры? Главная причина в том, что это существенно упрощает контроль над выполняемой работой по программированию.

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

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

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