Область видимости переменных

Как вы знаете, в VBA переменные имеют три уровня видимости: процедуры, модуля, проекта (или общий уровень), которые в равной степени относятся и к одиночным переменным, и к массивам.

В Модуль5 наберите и протестируйте работу представленных ниже программ.

Переменные уровня процедуры

Следующий пример демонстрирует переменную, объявленную на уровне процедуры – любая попытка использовать переменную Var1 вне этой процедуры приведет к ошибке.

Sub ПеременныеУровняПроцедуры ()

Dim Var1 As Integer

Var1 =55

MsgBox Var1

DisplayMessage

End Sub

Sub DisplayMessage()

MsgBox Var1

End Sub

Чтобы исходное значение Varl (55) было доступно в DisplayMessage, придется либо передать его в качестве аргумента, либо расширить область видимости этой переменной.

Переменные уровня модуля

Переменную уровня модуля можно использовать в любой подпрограмме или функции того модуля, где эта переменная была определена. Чтобы сделать переменную доступной на уровне модуля, объявите её перед любыми подпрограммами и функциями, как показано в примере:

Dim Var2 As String

Sub ПеременнаяУровняМодуля()

Var2 = "Привет!"

DisplayMessage2

End Sub

Sub DisplayMessage2()

MsgBox Var2

End Sub

Переменные уровня проекта

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

Следующие две программы напишите в разных модулях (1-ю – в Модуль2, 2-ю – в Модуль5) и протестируйте их:

Public Var3 As String

Sub ПрисвоениеЗначения()

Var3 = "Эта переменная была объявлена в Модуль2."

End Sub

Sub ПеременнаяУровняПроекта()

ПрисвоениеЗначения

MsgBox Var3

End Sub

Сохраняемые переменные

Определив переменную как Static (сохраняемую), мы продлим время ее жизни до завершения работы всех программ, включая и ту, в которой переменная была описана. Следующую программу выполните в пошаговом режиме, наблюдая за переменными Varl и Var2:

Sub СтатическаяПеременная()

СтатическаяНестатическая

СтатическаяНестатическая

End Sub

Sub СтатическаяНестатическая()

Static Var1 As String

Dim Var2 As String

If Varl = "" Then

Var1 = "Var1: Статическая переменная"

Var2 = "Var2: Нестатическая переменная "

End If

MsgBox Varl

MsgBox Var2

End Sub

Область видимости подпрограмм и функций

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

Чтобы перевести подпрограмму или функцию на уровень модуля, объявите ее с ключевым словом Private. Помните, что такие программы не могут запускаться сами по себе. Их можно только вызывать из других программ. Наберите следующий код и протестируйте выполнение следующей программы:

Sub ВызовПрограммыУровняМодуля()

Var1 = GetRand

ПрограммаУровняМодуля Var1

End Sub

Private Sub ПрограммаУровняМодуля (ByVal Var1)

MsgBox Var1 * GetRand

End Sub

Private Function GetRand()

GetRand = Int(100 * Rnd())

End Function

Сохраняемые подпрограммы и функции

Употребив ключевое слово Static,подпрограмму и функцию можно сделать сохраняемыми. Сохраняемыми станут и все объявленные в ней переменные:

Sub ВызовСтатическойПодпрограммы()

СтатическаяПодпрограмма

СтатическаяПодпрограмма

End Sub

Static Sub СтатическаяПодпрограмма()

Dim Var1 As String

If Var1 = "" Then

Var1 = "Var1 ещё не статическая переменная "

Else

Var1 = " Var1 – статическая переменная."

End If

MsgBox Var1

End Sub

Управляющие структуры: If-Then-Else, Select Case, For-Next, While-Wend, Do-Loop, For-Each-Next

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

§ перехода и выбора (GoTo, If-Then-Else, Select Case)

§ повтора (For-Next, While-Wend, Do-Loop, For-Each-Next)

Посмотрим на них в действии ещё раз, поместив их в Модуль6 в книге Мои программы.xls и протестировав их.

1. Пример условного перехода If-Then-Else, когда, в зависимости от выпавшего номера, программа сообщает о выигрыше или о проигрыше:

Sub IfThenElse()

Dim Num1 As Integer

Num1 = GetRandomNumber

If Num1 = 7 Then

MsgBox "Поздравляю! вы выиграли! Выпало число " &

Num1 & "."

Else

MsgBox "Сожалею, но вы проиграли. Выпало число " & _

Num1 & "."

End If

End Sub

Function GetRandomNumber()

GetRandomNumber = Int(10 * Rnd())

End Function

2. Пример проверки нескольких условий с предоставлением пользователю различных прав доступа:

Sub IfThenElseIf()

Dim Password As String

Password = GetPassword

If Password = "level1" Then

For Each Sheet In ActiveWorkbook.Sheets

Sheet.Visible = True

Sheet.Unprotect

Next

MsgBox "У Вас есть неограниченный доступ ко всем листам данной рабочей книги."

Elself Password = "level2" Then

ActiveWorkbook.Worksheets(l).Visible = True

ActiveWorkbook.Worksheets(1).Unprotect

MsgBox "У Вас есть доступ только к первому листу рабочей книги."

Elself Password = "level3" Then

ActiveWorkbook.Worksheets(l).Visible = True

MsgBox "вам доступен для чтения первый лист."

Else

MsgBox "Пароль введен неверно. Пожалуйста, попробуйте ещё раз!"

End If

End Sub

Function GetPassword()

GetPassword = LCase(InputBox("Введите пароль:", "Password"))

End Function

3. Предыдущий пример, написанный с помощью Select Case:

Sub SelectCase()

Dim Password As String

Dim Sheet As Object

Password = GetPassword

Select Case Password

Case "level1"

For Each Sheet In ActiveWorkbook.Sheets

Sheet.Visible = True

Sheet.Unprotect

Next

MsgBox "У Вас неограниченный доступ ко всем листам рабочей книги."

Case"Ievel2"

ActiveWorkbook.Worksheets(1).Visible = True

ActiveWorkbook.Worksheets(1).Unprotect

MsgBox "У Вас есть доступ только к первому листу рабочей книги."

Case"Ievel3"

ActiveWorkbook.Worksheets(l).Visible = True

MsgBox "Вам доступен для чтения первый лист."

CaseElse

MsgBox "Пароль введен неверно. Попробуйте ещё раз."

End Select

End Sub

4. Пример использования инструкции For-Next при подсчете суммы четных неотрицательных чисел от 0 до n:

Sub ForNext[СЮМ4] ()

Dim Сумма As Integer

Dim ВерхняяГраница As Integer

ВерхняяГраница = Int(InputBox("Введите верхнюю границу:"))

Сумма = 0

For i = 0 To ВерхняяГраница Step 2

Сумма = Сумма + i

Next

MsgBox "Сумма четных чисел до " & ВерхняяГраница & " = " _

& Сумма

End Sub

5. Пример использования инструкции While-Wend.

Sub WhileWend()

Dim LotteryEntry As Integer

LotteryEntry = 0

While LotteryEntry <> 7

LotteryEntry = Int(10 * Rnd())

Beep

Wend

MsgBox "Выпал номер " & LotteryEntry & ". вы выиграли!!"

End Sub

6. Пример использования инструкции Do-While-Loop.

Sub DoWhileLoop()

Dim LotteryEntry As Integer

LotteryEntry = 0

Do While LotteryEntry <> 7

LotteryEntry = Int(10 * Rnd())

Beep

Loop

MsgBox "Выпал номер " & LotteryEntry & ". вы выиграли!!"

End Sub

7. Пример использования инструкции Do-Until-Loop.

Sub DoUntilLoop()

Dim LotteryEntry и

LotteryEntry = 0

Do Until LotteryEntry = 7

LotteryEntry = Int(10 * Rnd())

Beep

Loop

MsgBox "Выпал номер " & LotteryEntry & ". вы выиграли!!"

End Sub

8. Пример использования инструкции For-Each-Next с массивами.

Option Base 1

Sub ForEachNext()

Dim Студенты(5) As String

Dim Студент As Variant

Студенты(1) = "Абрикосов"

Студенты(2) = "Богданов"

Студенты(3) = "Кузнецова"

Студенты(4) = "Милютин"

Студенты(5) ="Романова"

For Each СтудентIn Студенты

MsgBox Студент

Next

End Sub

9. Пример использования инструкции For-Each-Next с семействами.

9.1. Следующая программа проверяет, имеется ли в активной книге лист с именем Случ. числа:

Sub ForEachNextWorksheet()

Dim SheetVar As Worksheet

For Each SheetVar In ActiveWorkbook.Worksheets

If SheetVar.Name = “Случ. числа” Then

MsgBox “В текущей книге искомый лист имеется!”

Exit Sub

End If

Next

MsgBox “Лист Случ. Числа не найден!”

End Sub

9.2. Процедура ForEachNextWorkbook закрывает все книги, оставляя лишь одну, в которой размещена сама процедура.

Sub ForEachNextWorkbook()

Dim Book As Workbook

For Each Book In Workbooks

If Book.Name <> ThisWorkbook.Name Then

Book.Close

End If

Next

End Sub

Инструкция With

Как мы уже говорили, данная инструкция избавляет нас от утомительной обязанности использовать большое количество повторений имени одного и того же объекта. С инструкцией With мы уже сталкивались при написании программ , связанных с оформлением таблиц. В следующем примере обратите внимание на использование вложенных операторов With:

Sub Пример_с_With()

With ActiveWorkbook.Worksheets(1)

.Select

.Unprotect

With .Range("A1")

MsgBox .Value

.Value = 200

.RowHeight =60

.ColumnWidth = 20

.Font.Size = 20

.Interior.ColorIndex = 3

End With

End With

End Sub

Задание:

1. Наберите текст этой программы в Модуль6 и протестируйте её.

2. Перепишите это программу без использования оператора With, назвав её
Пример_без_With. Протестируйте её выполнение.

Наши рекомендации