Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22,23,24.docx
Скачиваний:
4
Добавлен:
16.04.2019
Размер:
23.75 Кб
Скачать

22. Обмен данными между подпрограммами (vba) Передача данных при вызове программы

Вызывая подпрограмму, Вы вправе передать в нее переменные или значения. Эта возможность еще более расширяет область применения подпрограмм, позволяя выполнять одни и те же действия с различными исходными данными. Рассмотрим в качестве примера подпрограмму DisplayMessage. Сейчас она выводит сообщение «Data has been entered» (Были введены данные). Предположим, что кроме этого мы хотим знать, какое именно значение было введено, например «Было введено число 500». Проще всего передать в подпрограмму DisplayMessage аргумент (это можно сделать двумя способами; см. следующий пример). Как это сделать, показано в примере 37.

Sub Chap02dProc37_PassArgumentToProc()

Dim Range1 As Range

Set Range1 = Worksheets(1).Range("A1")

Range1.Value = 500

DisplayMessage2 Range1.Value

End Sub

Sub DisplayMessage2(Value1)

MsgBox "The value " & Value1 & " has been entered."

End Sub

Здесь есть два интересных момента. Во-первых, обращение к подпрограмме DisplayMessage2 в Ргос37 содержит аргумент Range1.Value. Во-вторых, в первой строке DisplayMessage2 в круглых скобках задано имя переменной Value1. Она принимает значение аргумента, указанного в вызове подпрограммы DisplayMessage2, и затем используется для вывода соответствующего значения в информационном окне.

Передача данных по ссылке и по значению

Передача аргументов из одной программы в другую осуществляется двумя способами — по ссылке (by reference) и по значению (by value). В первом случае передается сама переменная, поэтому ее значение в подпрограмме можно изменить. Во втором случае — только значение переменной, а не она сама, и изменить ее в вызванной подпрограмме нельзя.       Выбор способа передачи осуществляется ключевыми словами ByRef и ByVal, которые в круглых скобках указываются в описании вызываемой подпрограммы.

      В программе Ргос39 переменная UserName передается в подпрограмму ChangeName по ссылке.

      Sub Chap02dProc39_PassArgumentByReference()       Dim UserName As String       UserName = Jeff       ChangeName UserName       MsgBox UserName       End Sub

      Sub ChangeName(ByRef UserName)       UserName = Dave       End Sub

      В первой строке подпрограммы ChangeName в круглых скобках набраны ключевое слово ByRef и имя переменной UserName, указывая, что аргумент UserName будет передан в подпрограмму по ссылке. Это означает, что в подпрограмме используется сама переданная в нее переменная. В частности, в ChangeName переменной UserName присваивается новое значение "Dave", которое затем возвращается в Ргос39 и выводится на экран.

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

      Sub Chap02dProc41_PassArgumentByValue()       Dim UserName As String       UserName = "Jeff       ChangeName3 UserName       MsgBox Yet remains as " & UserName & " in the original proc."       End Sub

      Sub ChangeName3(ByVal UserName)       MsgBox "The original name is " & UserName & "."       UserName = "Dave"       MsgBox "The name is changed to " & UserName &       " in the called proc."       End Sub

      Исходное значение UserName передано в подпрограмму ChangeName3 и выведено на экран. Затем оно изменяется и снова выводится на экран во втором информационном окне. Поскольку аргумент был передан в ChangeName3 по значению, исходная переменная UserName после возвращения управления в Ргос41 не изменяется, о чем и свидетельствует окно, выводимое на экран в последней строке Ргос41.