ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.05.2021
Просмотров: 1338
Скачиваний: 3
№10 Встроенное
диалоговое окно ввода. Пример функции
InputBox.
Существует
несколько типов диалоговых окон, которые
необходимы для поддержания в программе
интерактивного режима работы конечного
пользователя (вывод сообщений пользователю,
прием и интерпритация указаний, введенных
пользователем и т.д.). Окно ввода информации
InputBox требуется только как функция. Часто
необходимо осуществить не только набор
действия, но и ввести определенную
информацию, которая будет восприниматься
программой. Для этого используется
функция InputBox. Синтаксис: InputBox (ptomt,
[title], [default], [xpos,ypos], [helpfile], context])
Promt
– обязательная строка, которая выдается
в окне сообщения, 1024 символа Title –
необязательный, заголовок окна сообщения
Default - строка в текстовом поле, если его
нет, то строка пуста Xpos,Ypos- позиция левого
верхнего угла ввода на экран Helpfile- ссылка
на файл справочной информации. В этом
окне всегда стоят по умолчанию две
кнопки: ОК и Саncel. Пример:
InputBox("Введите
цену для сравнения", "окно для ввода
критерия")
Окно
для ввода критерия
Введите
цену для сравнения.
№11
Основные
свойства и методы объектов Application,
Workbook, Worksheet.
Application
является средой, в которой выполняется
приложение VBA. У Application 120 свойств и 40
методов. На рабочем листе Excel из ячеек
можно вызывать свыше 400 встроенных
функций.
Основные свойства
Caption.
Application.caption = “Ипотека”
DisplayAlerts (true или false) – управляет выводом на экран встроенных предупреждений Excel
WindowState (xlMaximized, xlMinimized, xlNormal)
Основные методы.
Calculate – вызывает пересчет всех формул на всех рабочих листах, книгах
Quit – закрытие приложения
Run – запускает программу в VBA
Wait – приостанавливает выполнение приложения VBA.
№12Правила пользования объектов exel в програмном коде. Примеры прогр-х кодов с исп-ем этих св-в и методов.
№13 Основные
свойства и методы объекта Range. Примеры
программных кодов.
Объект
Range одновременно является и объектом и
коллекцией. Рассмотрим наиболее важные
свойства и методы объекта Range.
Свойства:
1. Свойство Address –
возвращает адрес диапазона в виде
строки. «В2:Р4» А=Range(“Sales”).Address “В2:Р4”
2.
Свойство Cells – возвращает ссылку на
объект Range и обычно используется к
определенной ячейке диапазона. Указывает
на конкретную ячейку внутри диапазона.
Range
(“A1:A10”).Cells(3) ‘A3
Range
(“A1:D10”).Cells(3, 4) ‘D3
3.
Свойство Offset – возвращает ссылку
относительно диапазона (в этом случае
представляется единственной ячейкой).
Range
(“A1”). Offset(3, 4) – E4
4.
Font – выступает как в роли объекта, так
и в роли свойства. В данный момент
выступает как свойство, а как объект
имеет свойства: Size, Name, Bold, Italic.
5.
Horizontal Alignment – горизонтальное выравнивание
ячеек в диапазоне. Свойства: xlCenter – по
центру; xlLigh – по правому краю; xlLeft – по
левому краю.
6.
Interior – возвращает ссылку на заливку в
ячейке. Range (“A1”).ColorInterior=3
7.
Name – возвращает имя диапазона. Это
свойство позволяет задать имя диапазона
в программном коде.
Range
(“A1:D10”).Name=”Sales”
8.
Value – возвращает значение в ячейку
диапазона(используется относительно
только одной ячейки диапазона).
Range
(“A5”). Value=«Отчет о командировке»
Методы
диапазона:
Clear – удаляет содержимое и форматирование
диапазона ячеек. ClearContents – удаляет
только содержимое. Copy – копирует
содержимое одного диапазона в другой.
В этом случае он используется с
единственным аргументом CopyDestination. C его
помощью указывается, куда вы
копируете.
Range(“B4:G25”).
CopyDestination:=Range(“E4:F25”). Копируются формулы
и содержимое. В случае, когда надо
скопировать только числовые значения,
а не формулы, используется метод
PastSpecial. Сначала вы копируете в буфер
обмена, затем переносите в диапазон.
1)Range(“B4:G25”).Copy
2)Range(“E4:F25”).PastSpecial Paste:=xlPasteValueSelect
– выделение
диапазона. Sort
– Применяется для сортировки диапазона
ячеек. Key1 – по какому столбцу будет
сортировка в диапазоне. Order1 – порядок
сортировки(по возрастанию, по убыванию).
Header – «да», «нет» (Если «да», то заголовок
в сортировке участия не принимает, если
«нет», участвует).
Range(“A1:F25”).SortKey1:=Range(“C2”)Order1:=xlAscendingHeader:=xlYes
№14 Способы
указания диапазонов в VBA. Примеры
программных кодов с указанием диапазонов.
В
процессе составления программного кода
нужно уметь правильно использовать
ссылку на диапазон. Рассмотрим следующие
способы: 1. Использование адреса
Range(“A1:B4”). 2. Применение имени диапазона
Range(“Sales”). 3. Назначение переменной с
именем диапазона NSales=Range(“Информация
о продажах”).Name. 4.Использование свойства
Cells Range(“A1:A10”).Cells(3) – A3
Range(“A1:D10”).Cells(3,
4) – D3
5.Настройка
свойства Offset. Свойство имеет 2 аргумента.
Когда указывается Offset для диапазона,
то в роли диапазона выступает адрес
только одной ячейки. Range(“A5”).Offset(3, 4) –
E8
6.
Указание левого верхнего и нижнего
правого угла диапазона. Range(Range(“C1”),
Range(“D10”)).
7.Применение
свойства End. Для выделения диапазона
относительно которого известен только
левый верхний угол, можно воспользоваться
свойством End. Оно
указывает
на
нижний
правый
угол
диапазона.With
Range(“A1”)Range(.Cells(1,
1),.End(xlRight).End(xlDown)).SelectEnd
WithПример:With
Range(“A1”)Range(.Offset(1,
1),.End(xlRight)).Name=”Sales”Range(.Offset(2,
1),.End(xlDown)).Name=”Region”Range(.Offset(2,
2),.End(xlRight)).End(xlDown).Name=”NameSales”End
With
№15
Работа
с массивами. Оператор Option Base. Динамическая
модель индексации и оператор ReDim. Примеры
использования этих операторов. Функция
управления массивами Array. Пример
использования.
По
аналогии с работой с информацией в
списках Excel, массивы тоже представляют
собой списки, в которых каждый элемент
имеет свой индекс. Элементы массива
воспринимаются программой в виде обычных
переменных, но представленных в виде
индексированного списка. В VBA массивы
используются для обработки списков,
поскольку массивами управлять в
программном режиме гораздо проще, чем
списками. Правила работы с массивами.
Option Base – определяет нижнюю границу
изменения индекса в массиве. Например,
Option Base1 – нижняя граница – 1. Эту строку
в программном коде пишут в общей области
модуля следом за оператором Option
Explicit.
В
большинстве экономических задач при
написании программного кода невозможно
заранее узнать количество элементов.
Для этого существует возможность вначале
программного кода не указывать при
объявлении массива точного размера.
(Dim ProdCode () As Integer, NProducts As
Integer.)
Затем в теле процедуры, когда уже известно
необходимое количество элементов
массива, можно воспользоваться оператором
ReDim, который выделяет для массива строго
необходимый объем памяти. With
ActiveWorkBook.WorkShits(«Продажи»).Range(“A3”) NProducts=Range(.Offset(1,0),.End(xlDown)).ReDim
ProdCode(NProducts),UnitPrise(NProducts)For
i=1 to
NProductsProdCode(i)=.Offset(i,0)UnitPrise(i)=.Offset(i,1)Next
iEnd
WithОператор
ReDim относительно
конкретного
массива
может
использоваться
в
программном
коде
столько
раз,
сколько
необходимо.
Единственной
проблемой является то, что при таком
использовании массива, все, что было в
массиве, теряется. Чтобы этого избежать,
нужно в записи оператора записать
ключевое слово Preserve. (ReDim Preserve Sum(NS)).
Обычно продолжением данного программного
кода является размещение данных, взятых
из ст. А и В списка в массивах ProdCode и
UnitPrice. Для переноса данных из столбцов
списка в массив, нужно организовать
цикл. Если нужно перенести данные в
столбцы списка, размещенного на рабочем
листе:
(NFound
– количество найденных записей)
For
i=1 to NFound
With
Range(“E3”)
.Offset(j,
0)=ProdCodeFound(j) ‘код товара
.Offset(j,
1)=Quontity(j) 'количество товаров
.Offset(j,
2)=DollarsTotal(j) ‘стоимость продукции
End
With
End
Sub
Рассмотрим
конструкцию Array. Рассмотрим работу этой
функции на примере. Данная функция
используется для заполнения массива.
Ее применении е рассмотрим в программе
«Ипотечный кредит».
Option
Base1
Sub
Array Function ()
Dim
Days As Variant
Days=Array(«Пн»,
«Вт», «Ср», «Чт», «Пт», «Сб», «Вс»)
MsgBox
“Первый день недели: ” & Days(1)
End
Sub
Ключевое
слово Array, после которого указывается
список в скоках, используется для
заполнения значениями переменной Days.
Эта переменная – обычный массив, но в
операторе Dim она указывается как обычная
переменная типа Variant, а VBA самостоятельно
с использованием функции Array определяет
эту переменную как массив.
№16
Модульная
структура приложения на примере
программного кода задачи, определяющий
оптимальный маршрут перемещения
дистрибьютора фирмы. Пример использования
переменных уровня модуля.
При
создании больших процедур возникают
такие сложности, как сложность изучения,
отладки, повторного использования.
Намного предпочтительнее создавать
модульные приложения, которые представляют
собой набор относительно небольших
процедур, каждая из которых выполняет
небольшую подзадачу. Создается главная
процедура MainProcedure, а из нее с помощью
оператора Call вызываются другие
процедуры.
Sub
MainProcedure()
Call
Procedure1
Call
Procedure2
End
Sub
В
качестве примера рассмотрим программный
код задачи, определяющий оптимальный
маршрут перемещения.
Dim
Ncities As Integer, Visited() As Boolean, Route() As Integer, TotDist
As IntegerSub
GenDistances()Dim
I As Integer, j As Integer, Ncities As IntegerRandomizeWith
Range("DistMatrix")Ncities
= .Rows.CountFor
I = 1 To Ncities - 1For
j = I + 1 To Ncities.Cells(I,
j) = Int(Rnd * 100) + 1Next
jNext
IFor
I = 2 To NcitiesFor
j = 1 To I - 1.Cells(I,
j) = .Cells(j, I)Next
jNext
IEnd
WithEnd
SubSub
MainProcedure()Call
GetProblemSizeCall
InitializeCall
PerformHeuristicCall
DisplayResultsExit
SubEnd
SubSub
GetProblemSize()Ncities
= Range("DistMatrix").Rows.CountReDim
Visited(Ncities)ReDim
Route(Ncities + 1)End
SubSub
Initialize()Dim
I As IntegerRoute(1)
= 1Route(Ncities
+ 1) = 1Visited(1)
= TrueFor
I = 2 To NcitiesVisited(I)
= FalseNextTotDist
= 0End
SubSub
PerformHeuristic()Dim
Step As Integer, I As Integer, NowAt As Integer, NextAt As Integer,
MinDist As IntegerNowAt
= 1For
Step = 2 To NcitiesMinDist
= 10000For
I = 2 To NcitiesIf
I <> NowAt And Visited(I) = False ThenIf
Range("DistMatrix").Cells(NowAt, I) < MinDist
ThenNextAt
= IMinDist
= Range("DistMatrix").Cells(NowAt, NextAt)End
IfEnd
IfNext
IRoute(Step)
= NextAtVisited(NextAt)
= TrueTotDist
= TotDist + MinDistNowAt
= NextAtNext
StepTotDist
= TotDist + Range("DistMatrix"). Cells(NowAt, 1)End
SubSub
DisplayResults()Dim
Step As IntegerFor
Step = 1 To Ncities + 1Range("B19").Offset(Step,
0) = Route(Step)Next
StepMsgBox
"Общее
растояние:"
& TotDist, vbInformation, "общее
расстояние"End
SubИспользование
переменных
уровня
модуля.
Рассмотрим
программу, которая иллюстрирует
использование переменных уровня
модуля.
На
рабочем листе Excel создадим список и
дадим ему имя – Name.
А
В
С1
Фамилия
Имя,
Отчество2
… …
…
… …
Dim
FirstName As String, LastName As StringSub
Main ()Dim
I As IntegerFor
i=1 to 50FirstName=Range(“Name”).Cells(i,
1)LastName=Range(“Name”).Cells(i,
2)Call
DisplayNameNext
iEnd
SubSub
DisplayName ()Dim
FullName As StringFullName=FirstName+LastNameMsgBox
“Полное
имя
сотрудника:
” & FullNameEnd
Sub
№17
Разработка
пользовательского интерфейса: форма
как пользовательское окно диалога.
Разработка формы на примере формы
«Сведения о товарах». Отображение
пользовательской формы.
Пользовательское
окно диалога – это форма, содержащая
элементы управления, включая командные
кнопки, переключатели, текстовые поля
и другие. Оно обеспечивает пользователю
ввод информации, требуемой для работы
приложения. Рассмотрим типичный пример
формы, которая часто встречается в
приложениях.
В
форме присутствуют 3
обработчика событий:
1.
UserForm_Initialize
2.
OkButton_Click
3.
CanselButton_Click
1
разработчик определяет внешний вид
формы при открытии, а остальные
обеспечивают реакцию на щелчок по кн.
«Ок» и «Отмена».
Код
обработчика UserForm_Initialize.
В
этом приложении при открытии формы
нужно добиться следующего поведения:
переключатели Москва и Поезд должны
быть активны, флажок Скоропортящийся
установлен, а Хрупкий – сброшен, список
CostumerList должен быть заполнен исходными
данными. При работе со списком, его можно
заполнить разными способами. Например,
заполнить его данными, расположенными
в ячейках рабочего листа. Для этого
зоздать диапазон на рабочем листе, дать
ему имя(Name - Costumer). При заполнении списка
воспользоваться AddItem. Перед тем, как
писать код для события Initialize, рассмотрим
свойства
элементов управления:
пользовательская форма – Ипотека;
текстовое поле – ProductBox; переключатели
– MoscowOption, VoronegOption, TrainOption, TruckOption; флажки
– PerishBox, FragilBox; список – CostumersList.
Private
Sub UserForm_Initialize()Dim
cell As VariantProductBox
= " "MoscowOptions.Value
= TrueTrainOptions.Value
= TruePerishBox
= TrueFragilBox
= FalseFor
Each cell In Range("Customers")CustomersList.AddItem
cell.ValueNext
cellEnd
SubСуществует
другой
способ
заполнения
списка.
Свойство
RowSource, откроется окно, из которого
поочереди надо внести элементы.
Отображение
формы. В отличии от VB в VBA форма в момент
запуска приложения автоматически на
экране не появляется. Для вызова формы
на рабочий лист нужно применить метод
Show. Для этого на рабочем листе создать
кнопку, которая выводит форму на рабочий
лист, и написать код:
Sub
Кнопка1_Щелкнуть ()
Ипотека.
Show
End
Sub
№18 Обработка
событий формы: создание кода обработки
событий UserForm_Initialize, CanselButton_Click на примере
обработки этих событий для пользовательской
формы «Сведения о товарах».
Событие
представляет собой действие, распознаваемое
объектом, для которого можно
запрограммировать отклик.
Рассмотрим
форму «Сведения о товарах». В ней
присутствуют 3 обработчика событий:
1.
UserForm_Initialize
2.
OkButton_Click
3.
CanselButton_Click
1
разработчик определяет внешний вид
формы при открытии, а остальные
обеспечивают реакцию на щелчок по кн.
«Ок» и «Отмена».
Код
обработчика UserForm_Initialize.
В
этом приложении при открытии формы
нужно добиться следующего поведения:
переключатели Москва и Поезд должны
быть активны, флажок Скоропортящийся
установлен, а Хрупкий – сброшен, список
CostumersList должен быть заполнен исходными
данными. Для заполнения списка на рабочем
листе создадим диапазон и дадим ему имя
Costumers. В программном коде воспользуемся
методом AddItem. Перед тем, как писать код
для события Initialize, рассмотрим некоторые
свойства элементов управления:
пользовательская форма – Ипотека;
текстовое поле – ProductBox; переключатели
– MoscowOption, VoronegOption, TrainOption, TruckOption; флажки
– PerishBox, FragilBox; список – CostumersList.
Private
Sub UserForm_Initialize()Dim
cell As VariantProductBox
= " "MoscowOptions.Value
= TrueTrainOptions.Value
= TruePerishBox
= TrueFragilBox
= FalseFor
Each cell In Range("Customers")CustomersList.AddItem
cell.ValueNext
cellEnd
SubДля
кнопки
«отмена»
запишем
следующий
код:Private
Sub CanselButton_Click ()Unload.MeEndEnd
SubUnload.Me
– этот
метод
выгружает
форму
из
оперативной
памяти
и
убирает
ее
с
экрана.
№19
Событие представляет собой действие,
распознаваемое объектом, для которого
можно запрограммировать отклик.
Рассмотрим
форму «Сведения о товарах». В ней
присутствуют 3 обработчика событий:
1.
UserForm_Initialize
2.
OkButton_Click
3.
CanselButton_Click
1
разработчик определяет внешний вид
формы при открытии, а остальные
обеспечивают реакцию на щелчок по кн.
«Ок» и «Отмена».
Код
процедуры OkButton_Click. Обычно данный
обработчик событий используется для
сохранения данный, введенных в элементы
управления. Как правило, введенная
информация в элементы управления
заносится в общедоступные переменные,
которые определены в модуле, далее эти
переменные используются в программных
кодах модуля. ProductСode – код, введенный
в поле; Region – пункт отправления; Shipping –
транспорт; IsPerish – скоропортящийся;
IsFragil – хрупкий; Customers – смисок.
Dim
ProductCode As Integer, Region As String, Shipping As String,
IsPerish As Boolean, IsFragile As Boolean, Customers As
StringPrivate
Sub OkButton_Click()With
ProductBoxIf
.Value = " " or not IsNewmeric(.Value) ThenMsgBox
"Код
товара
не
введен
или
не
числовой".SetFocusExit
SubEnd
IfProductCode=ProductBox.
ValueIf
ProductCode < 1 Or ProductCode > 1000 ThenMsgBox
"Код
товара
должен
быть
в
диапазоне
от
1 до
1000".SetFocus
‘ставит
курсор
в
полеExit
Sub ‘выход
из
процедурыEnd
IfIf
TrainOption.Value = True ThenShipping
= "Poezd"ElseShipping
= "Gruzovik"End
IfIf
MoscowOption.Value = True ThenRegion
= "Moscow"ElseRegion
= "Voroneg"End
IfIsPerish
= PerishBox.ValueIsFragile
= FragilBox.ValueWith
CostomerList ‘работа
со
спискомIf
.ListIndex <> -1 ThenCustomers
= CustomersList.ValueElseMsgBox
"Элемент
в
списке
не
выбран".SetFocusExit
SubEnd
IfEnd
WithEnd
Sub
№20
Управляющие
структуры: структура принятия решения
If-Then-Else. Пример пользования этой структурой
в програмном коде, выводящем окна
сообщения о стоимости товара, если он
найден в списке или об его отсутствии
в зависимости от значения логической
переменной Found.
Условный
оператор If-Then-Else изменяет порядок
выполнения программы в зависимости от
результатов проверки некоторого
условия.
Sub
LookUpPrice()Dim
ProdCode() As String, UnitPrice() As Currency, ReguestedPrice As
Currency, Nproducts As Integer, i As Integer, Found As Boolean,
ReguestedCode As StringWith
ActiveWorkbook.Worksheets("Коды
товаров”).Range("A3")Nproducts
= Range(.Offset(1, 0), .End(xlDown)).Rows.CountReDim
ProdCode(Nproducts)ReDim
UnitPrice(Nproducts)For
i = 1 To NproductsProdCode(i)
= .Offset(i, 0)UnitPrice(i)
= .Offset(i, 1)Next
iEnd
WithReguestedCode
= InputBox("Введите
код
товара
(большая
латинская
буква
и
4 цифры)")Found
= FalseFor
i = 1 To NproductsIf
ProdCode(i) = ReguestedCode ThenFound
= TrueReguestedPrice
= UnitPrice(i)Exit
ForEnd
IfNext
iIf
Found ThenMsgBox
"Товар
с
кодом"
& ReguestedCode & " стоит
" & Format(ReguestedPrice, "0,00р."),
vbInformation, "Товар
не
найден"ElseMsgBox
"Товара
с
кодом
" & ReguestedCode & " нет
в
списке
", vbInformation, "Товар
не
найден” End
IfEnd
Sub
№21
Управляющие структуры: Дополнительное
условие ElseIf. Пример использования этого
условия в коде процедуры для ввода
пороля.
Средствами
структуры принятия решенья If-Then-Else можно
организовать выполнение операторов в
зависимости от соблюдения определенного
условия. Рассмотрим другой вариант ее
использования, на этот раз с ключевым
словом ElseIf. Программа Proc31 отображает
запрос на ввод пароля. Если пароль введен
правильно, программа предоставляет
пользователю определенные возможности
работы с рабочей книгой и сообщает ему
об этом.
Sub
Proc31_IfThenElseIf ( )Dim
Password As String, ws As WorkSheetPassword
= GetPasswordIf
Password = “level1” ThenFor
Each ws In ActiveWorkbook.WorkSheetsws.Visible
= Truews.
Unprotect
Next
MsgBox
“Вы получили доступ ко всем листам
книги.”
ElseIf
Password = “level2” ThenActiveWorkbook.Worksneets
(1). Visible = TrueActiveWorkbook.Worksneets
(1). Unprotect
MsgBox
“Вы получили доступ только к первому
листу рабочей книги.”
ElseIf
Password = “level3” Then
ActiveWorkbook.Worksneets
(1). Visible = True
MsgBox
“Вы получили доступ только для чтения
содержимого первого листа рабочей
книги.”
Else
MsgBox
“Пароль не корректен. Повторите ввод
пароля.”
End
If
End
Sub
Function
GetPassword ( )
GetPassword
= Lcase (InputBox(“Enter Password:”.” Password”))
End
Function
В
Proc31 ключевое слово Elself с последующим
условием используется дважды. Новое
условие вносит в порядок выполнения
команд дополнительные изменения, если
проверка первого условия закончилась
неуда-чей. В Proc31 первое условие указано
сразу за ключевым словом If. В нем
проверяется равенство переменной
Password строке ”levell”. Если переменная не
равна строке, VBA переходит к первому
ключевому слову Elself, где проверяет
следующее условие – равенство переменной
Password строке “level2”. Начиная с этого
момента, программа использует только
новое условие, “забывая” о старом. Если
равенства опять нет, управление переходит
к следующему ключевому слову Elself и т.
д.
В
строке 3 процедуры Proc31 вызывается функция
GetPassword, в которой использованы новые
элементы. Обратимся
к
ней
еще
раз.Function
GetPassword ( )GetPassword
= Lcase (InputBox(“Enter Password:”.” Password”))
End
Function
Здесь
во второй строке заданы обращения к
двум встроенным функциям VBA-Lcase и InputBox.
Первая преобразует все буквы переданной
в нее строки в строчные. Вторая выводит
на экран диалоговое окно с запросом на
ввод данных пользователем. У этой функции
есть несколько необязательных аргументов,
из которых нас интересуют только первые
два. Один из них – строка, отображаемая
в окне над полем для ввода. Второй
содержит строку заголовка диалогового
окна. При вызове функции InputBox на экране
появляется диалоговое окно с заданными
заголовком и текстом приглашением,
кроме того оно содержит пустое поле, в
котором пользователь может ввести
данные. Значение, возвращаемое InputBox,
зависит от того, какую кнопку щелкнет
пользователь. Если это – ОК, возвращается
введенная строка, если – Отмена (Cancel),
то пустая. В нашем примере буквы этой
строки передаются в функцию Lcase, которая
преобразует их в строчные. В блоке,
начинающемся сразу за ключевым словом
If, помещен цикл For-Each-Next (он подробно
описан ниже в разделе "Управляющая
структура For-Each-Next”). В этом цикле
перебираются все листы активной рабочей
книги, с каждым из которых выполняются
два действия – свойству Visible присваивается
значение True и вызывается метод Unprotect.
Первое действие позволяет пользователю
видеть лист, второе – снимает с листа
защиту паролем. У метода Unprotect есть один
аргумент – строка с паролем. Но в данном
случае пароль для защиты листов мы не
использовали, поэтому Unprotect вызван без
аргументов. В других блоках программы
свойство Visible и метод Unprotect вызываются
выборочно, в зависимости от введенного
пароля.