Метод. по подпрограммам (vba) (811586), страница 2
Текст из файла (страница 2)
листинг к примеру 2.По мнению авторов, данная форма вызова процедуры менее предпочтительна, чем первая, так как в ней отсутствует оператор вызоваи между именем функции и её аргументами нет разделителя (скобок), что затрудняет читаемость программного кода.Аргументом процедуры, как уже было отмечено, может бытьи массив. Рассмотрим примеры с использованием массивов.12Пример 2. Заданы два массива А(5) и В(3).
Написать программу для определения суммы и количества нулевых элементов,имеющихся в заданных массивов.Листинг программы к примеру 2 представлен на рис.5.Рисунок 5.- Листинг программы к примеру 2.Пояснения к программе.Вызывающая, основная процедура имеет имя MACCИВ см.рис.5. Все используемые в процедуре имена массивов должны бытьзаписаны через запятые после оператора Dim, который отводитпамять под заданные массивы, в соответствии с их максимальнойразмерностью указанной в круглых скобках массивов.
KOL - имя13процедуры типа Function, X и N – её формальные входные аргументы. При передачи на их места фактических аргументов в видемассивов с именами А и В после имени массива можно ставитькруглые скобки – А(), а можно и не ставить их – В, см. приведённый листинг к рассматриваемому примеру 2 на рис.5.Задание типа формальных и фактических аргументовТип формальных аргументов можно не задавать, как в приведённых выше примерах, и тогда считается, что они имеют тип данных Variant [1].Объявление каждого формального аргумента имеет следующий синтаксис:Имя аргумента As тип данныхтип данных – тип данных, определенный пользователем.При задании формальному аргументу определённого типаданных, например Integer, соответствующему фактическому аргументу должен быть определён тот же тип данных, в данном случаеInteger, с помощью оператора Dim, как в примере 3, см. рис.
6.Пример 3.Рисунок 6.- Задание типа формальных и фактических аргументов.14В примере 3 формальному аргументу N задан тип данных Integer,а соответствующему фактическому аргументу К, с помощью оператора Dim, определён тот же тип данных- Integer.1.2.2. ПРОЦЕДУРА ТИПА SUBПроцедура типа Sub (подпрограмма) — универсальная процедура для выполнения каких-либо действий при программировании.Зачем же тогда нужны функции? Функцию в основном используюттогда, когда её значение требуется вставлять практически в любоеместо программного кода, часто в громоздкие арифметические выражения.
В этом случае использование функции гораздо проще,чем процедуры.Процедурой типа Sub формально называется фрагмент текстана языке VBA (программный код), заключенный между ключевымисловами Sub и End Sub, которые определяют начало и конец процедуры.Для объявления процедуры типа Sub используется следующий синтаксис.Sub Имя (список формальных аргументов)( операторы)End SubКлючевое слово Sub определяет процедуру типа Sub (подпрограмма),указывает на начало процедуры.Далее задаётсяИмя_процедуры. Имя должно быть уникальным, и задано согласноправилам задания имён переменных в языке VBA.В круглых скобках указывается список формальных аргументов. Это то- же самое понятие, что и для функций, и правила их задания и использования те же, включая и задание их типа. В случаеесли список формальных аргументов отсутствует, то скобки остаются.15Вызов процедуры типа SubВызов процедуры типа Sub осуществляется с помощью оператора Call (вызвать).
Синтаксис такого вызова следующий.Call Имя (список фактические аргументы)После имени вызываемой процедуры в круглых скобках указывается список фактических аргументов. Это то - же самое понятие, что и для функции. Правила их задания и использования теже,включая и задание их типа. В случае если список формальных аргументов отсутствует, то скобки остаются.Пример 4. Заданы два массива А(5) и В(3). Написать программу определения для каждого из заданных массивов суммы иколичества положительных элементов.
Вычислить общее среднееарифметическое значение положительных элементов для указанных массивов.Листинг программы к примеру 4 представлен на рис. 7.Пояснения к программе.Процедура с именем СУМКОЛ определяет для массива сумму и количество элементов больших нуля. В результате двукратного обращения к подпрограмме определяются сумма SA и количество KA элементов больших нуля для массива А и соответственноSB и KB для массива В. В основной, вызывающей процедуре (программе) с именем Сред_знач вычисляется SR – среднее арифметическое значение всех элементов больших нуля, находящихся в массивах А и В.
Ввод данных в массивы А и В организован с помощьюфункции InputBox.16Рисунок 7.- Листинг программы к примеру 4.Ввод массивов можно организовать с таблицы EXCEL, а также и вывод в неё результатов, см. следующий код, для примера 4представленный на рис. 8.17Рисунок 8.- Листинг программы к примеру 4,с вводом - выводом в таблицу EXCEL.Ввод данных для кода, представленного на рис.
8 может бытьвыполнен в таблице EXCEL следующим образом см. рис. 9.18Рисунок 9.- Ввод данных в таблице EXCEL.После запуска кода и завершения его работы в таблице EXCEL будет распечатан результат в виде представленном на рис. 10.Рисунок 10.- Результат работы программы в таблице EXCEL.Рассмотренный вариант ввода-вывода в таблице EXCEL удобен при отладке программ.Есть еще одна форма ввода массивов удобная, в частности,для отладки процедур.
При работе с массивами бывает полезноприменять следующую функцию.имя массива Array (список параметров)Эта функция создает массив типа Variant. Аргумент в скобках представляет разделенный запятыми список значений, присваиваемых элементам массива.В представленном на рис. 11 примере с помощью функцииArray вводиться массив А(5) с численными значениями его элементов -2, 4, 3, 8, 10. Процедура с именем М1 подсчитывает суммуS задаваемого количества N элементов. При первом обращении кпроцедуре М1 подсчитывается сумма четырёх элементов массива А19при втором – двух, результаты выводятся с помощью функцииMsgBox соответственно в переменные SYM4 и SYM2 см .
рис. 11.Рисунок 11.- Процедура с использование функции Array.1.3. СПОСОБЫ ПЕРЕДАЧИ АРГУМЕНТОВ В ПРОЦЕДУРЫСуществуют два способа передачи аргументов в процедуры:по ссылке (по умолчанию) и по значению.При передаче аргументов по ссылке передается только адреспамяти. Это означает, что если процедура изменяет значение в любом из аргументов, то исходные данные также изменяются. Этотспособ работает по умолчанию, и он реализован во всех приведённых выше примерах. Рассмотрим пример передачи аргументов поссылке, см. рис.
12. Здесь в вызывающей процедуре переменной Nприсваивается значение 10. Затем вызывается процедура с именемССЫЛКА, причём переменная N передаётся в неё в качестве входного фактического аргумента. В процедуре с именем ССЫЛКАпереданный фактический аргумент N занимает место формальногоаргумента Х и увеличивается на значение 20, т.е. становиться рав-20ным 30-ти и с этим значение переменная N возвращается уже в качестве выходного фактического аргумента в вызывающую процедуру и выводится в окно функции MsgBox с численным значениемравным 30.Рисунок 12.- Процедура с передачей в неё аргументов по ссылке.При передаче аргумента по значению VBA делает копию передаваемого аргумента и передает эту копию процедуре. Если процедура изменяет значение в аргументе, передаваемом по значению,то изменяется только его копия, а исходное значение аргумента неизменяется.
Для организации передачи аргумента по значению используется ключевое слово ByVal, которое ставиться перед именемформального аргумента при объявлении процедуры.Рассмотрим предыдущий пример см. рис. 12 с использованиемв нём способа передачи аргумента по значению, см. рис. 13.
В результате выполнения кода представленного на рис. 13 значение переменной N, в вызывающей процедуре MAIL, не изменяется, остаётся равным исходному значению 10.21Рисунок 13.- Процедура с передачей в неё аргументов по значению.Если в качестве аргумента используется переменная, тип данных которой определил программист, то такой аргумент можно передавать только по ссылке.Следует заметить, что чаще используется способ передачи аргументов по ссылке, который, как уже было сказано, в VBA используется по умолчанию, хотя, если есть желание, можно задать иявно используя ключевое слово ByRef, аналогично использованию– ByVal.Переменное число аргументов в процедуреПроцедура может иметь и переменное число аргументов. Длясоздания таких процедур используется ключевое словоParamArray, которое определяет массив, содержащий необходимое количество значений аргументов.
Ключевое слово ParamArrayв списке процедуры указывается только один раз и обязательно вконце списка. При этом тип массива не указывается, так как типвсегда должен быть – Variant, а этот тип устанавливается по умол-22чанию. На рис. 14 представлен пример использования процедуры спеременным числом аргументов.Рисунок 14.- Процедура с использованиепеременного числа аргументов.Обязательные и необязательные аргументы процедурАргументы процедур могут быть обязательными и необязательными аргументы.
Допускается, что все аргументы являютсянеобязательными. Необязательные аргументы можно передаватьпри вызове процедур, а можно и опускать. Для необязательных аргументов, его значение принимается по умолчанию. Оно передаетсяв процедуру, даже если при вызове процедуры данный аргументбыл опущен. Для указания того, что данный аргумент является необязательным, используется ключевое слово Otional.Otional Аргумент As Type = defaultvalueЗдесь defaultvalue – значение данного аргумента, которое будет использоваться по умолчанию.
Все необязательные элементыуказываются после обязательных в конце списка аргументов. Следует обратить внимание на то, что ключевые слова ParamArray и23Otional являются взаимоисключающими, в списке параметров может присутствовать только одно и них. Использование необязательного аргумента понятно из следующего примера, см. рис. 15.Рисунок 15.- Процедура с использованиенеобязательного аргумента.1.4.