Область видимости переменных
Как вы знаете, в 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, назвав её
Популярное: Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1298)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |