Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
3.91 Mб
Скачать

5.2. Передача данных при вызове программы

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

Sub ПередачаАргумента()

Dim Range1 As Range

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

Range1.Value = 500

DisplayMessage2 Rangel.Value

End Sub

Sub DisplayMessage2(Value1)

MsgBox "Было введено число " & Value1

End Sub

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

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

Выбор способа передачи осуществляется ключевыми словами ByRef и ByVal, которые в круглых скобках указываются в описании вызываемой подпрограммы.

ПРИМЕЧАНИЕ. При отсутствии в описании аргументов ключевых слов ByRef и ByVal передача осуществляется по ссылке.

В программе ПередачаАргументаПоСылке переменная UserName передается в подпрограмму ChangeName по ссылке:

Sub ПередачаАргументаПоСылке ()

Dim UserName As String

UserName = "Иван"

ChangeName UserName

MsgBox UserName

End Sub

Sub ChangeName (ByRef UserName)

UserName = "Петр"

End Sub

В первой строке подпрограммы ChangeName в круглых скобках набраны ключевое слово ByRef и имя переменной UserName, указывающие, что аргумент UserName будет передан в подпрограмму по ссылке. Это означает, что в подпрограмме используется сама переданная в нее переменная. В частности, в ChangeName переменной UserName присваивается новое значение Петр, которое затем возвращается в процедуру ПередачаАргументаПоСылке и выводится на экран. Обратите внимание, что в программах ПередачаАргументаПоСылке и в ChangeName использовано одно и то же имя переменной – UserName. Но делать так вовсе необязательно. Дальше мы показываем, что к тем же результатам приводит применение разных имен:

Sub ПередачаАргументаПоСсылке_РазныеПеременные ()

Dim UserName As String

UserName = "Иван"

ChangeName2 UserName

MsgBox UserName

End Sub

Sub ChangeName2(ByRef NewName)

NewName = "Петр"

End Sub

Такая конструкция используется в том случае, когда одна и та же подпрограмма вызывается для разных переменных.

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

Sub ПередачаАргументаПоЗначению ()

Dim UserName As String

UserName = "Иван"

ChangeName3 UserName

MsgBox "В исход. прог-ме имя осталось прежним " _

& UserName

End Sub

Sub ChangeName3(ByVal UserName)

MsgBox "Сначала был " & UserName & "."

UserName = "Петр"

MsgBox "В вызванной подпрограмме имя стало " & _

UserName

End Sub

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]