Использование модулей и процедур
Запуск программы Text Box Sub
-
Чтобы запустить программу, щелкните на кнопке Start (Начать) на стандартной панели инструментов.
-
Щелкните на кнопке Добавить имя под текстовым полем Продажи, а затем введите в поле ввода Мария Палермо. (Можете ввести любое другое имя.) Ваше поле ввода должно выглядеть примерно так.
- Чтобы добавить это имя в текстовое поле Продажи, щелкните на кнопке OK. Имя появляется в этом текстовом поле.
-
Щелкните на кнопке Добавить имя под текстовым полем Маркетинг, введите в поле ввода Маркетинг имя Александр Петров, а затем нажмите на (Enter). Имя появляется в этом текстовом поле Маркетинг. Ваш экран должен выглядеть примерно так.
- Введите в каждое из двух текстовых полей еще несколько имен. Это ваш шанс создать собственную команду мечты. Каждое имя должно появляться в отдельной строке текстовых полей. Эти текстовые поля не прокручиваются автоматически, так что вы не увидите всех имен в процессе их ввода, если вы введете больше имен, чем помещается в текстовом поле. Для доступа к тем именам, которые не видны, используйте полосы прокрутки.
- Когда закончите, щелкните на кнопке Выход, чтобы остановить программу.
Следующий шаг: передача аргументов по значению и по ссылке
При обсуждении подпрограмм Function и Sub вы узнали, что аргументы передаются в процедуры по значению или по ссылке. Использование ключевого слова ByVal указывает, что переменные должны быть переданы в процедуру по значению (тип передачи по умолчанию). Все изменения, сделанные в переменной, переданной по значению, не передаются обратно в вызывающую процедуру. Однако, как вы узнали при написании программы Text Box Sub, использование ключевого слова ByRef указывает, что переменные должны быть переданы в процедуру по ссылке, что означает, что все изменения, сделанные в переменной в рамках процедуры, будут переданы обратно в вызывающий код. Передача по ссылке может дать значительные преимущества, если вы позаботитесь о том, чтобы случайно не изменить переменную в процедуре. Рассмотрим объявление и вызов следующей процедуры Sub:
Sub CostPlusInterest(ByRef Cost As Single, ByRef Total As Single) Cost = Cost * 1.05 'добавляем 5% к цене: Total = Int(Cost) 'переводим в целое и возвращаем End Sub . . . Dim Price, TotalPrice As Single Price = 100 TotalPrice = 0 CostPlusInterest(Price, TotalPrice) MsgBox(Price & " плюс 5% получится " & TotalPrice)
В этом примере программист передает в процедуру CostPlusInterest по ссылке две переменные одинарной точности: Price и TotalPrice. Программист планирует использовать обновленную переменную TotalPrice в последующем вызове MsgBox, но, к сожалению, забыл, что переменная Price в процедуре CostPlusInterest на одном из промежуточных шагов также обновляется. (Так как Price была передана по ссылке, изменения в Cost автоматически приводят к изменениям в Price.) При запуске программы это приводит к следующему некорректному результату.
Вероятно, программист хотел отобразить следующее сообщение.
Что использовать: ByVal или ByRef?
Как же следует исправить показанную выше ошибку в процедуре CostPlusInterest? Простейшим способом является объявление аргумента Cost с помощью ключевого слова ByVal, как показано в следующем операторе программы:
Sub CostPlusInterest(ByVal Cost As Single, ByRef Total As Single)
Объявление Cost с использованием ByVal позволяет безопасно изменять в процедуре CostPlusInterest параметр Cost, не передавая эти изменения обратно в вызывающую процедуру. Сохранение объявления Total с помощью ByRef позволяет изменять передаваемую переменную, и в вызывающую процедуру будут переданы только эти изменения. В общем, если вы используете ByRef только тогда, когда это необходимо, в ваших программах будет меньше ошибок.
Вот некоторые рекомендации о том, когда следует использовать ByVal, а когда - ByRef.
- Используйте ByVal, когда вы не хотите, чтобы процедура изменяла передаваемую в нее через аргумент переменную.
- Используйте ByRef, когда хотите позволить процедуре изменять передаваемую в нее переменную.
- Когда сомневаетесь, используйте ключевое слово ByVal.