
- •1.Программирование в vba. Объекты Application, Workbook, Worksheet и Range
- •2.Редактор Visual Basic
- •2.1.Запуск программы
- •2.1.1.Панель инструментов Стандарт
- •2.2.Отладка программ
- •2.2.1.Ошибки при написании программ
- •2.2.1.1.Ошибки компиляции
- •2.2.1.2.Ошибки выполнения
- •2.2.2.Инструкция Option Explicit
- •2.2.3.Пошаговое выполнение программ
- •2.2.4.Точка останова (Toggle Breakpoint)
- •2.2.5.Отслеживание значений свойств и переменных
- •3.Объекты Application, Workbook, Worksheet и Range. Встроенные функции Dir, MkDir, MsgBox, InputBox
- •3.1.Программа СлучайныеЧисла
- •3.2.Программа УдалениеКниги
- •3.3.Программа СлучайныеЧислаОформление
- •4.Переменные
- •4.1.Объектные переменные
- •4.2.Пользовательский тип данных
- •5.Массивы
- •5.1.1.Функция Erase
- •5.1.2.Функции lBound и uBound
- •6.Подпрограммы. Функции. Область видимости переменных, подпрограмм и функций.
- •6.1.Вызов подпрограммы
- •6.2.Передача данных при вызове программы
- •6.2.1.Передача по ссылке и по значению
- •6.3.Функции
- •6.4.Область видимости переменных
- •6.4.1.Переменные уровня процедуры
- •6.4.2.Переменные уровня модуля
- •6.4.3.Переменные уровня проекта
- •6.4.4.Сохраняемые переменные
- •6.4.5.Область видимости подпрограмм и функций
- •6.4.6.Сохраняемые подпрограммы и функции
- •7.Управляющие структуры: If-Then-Else, Select Case, For-Next, While-Wend, Do-Loop, For-Each-Next
- •8.Инструкция With
- •9.Встроенные функции vba
- •9.1.Математические функции
- •9.2.Функции проверки типов
- •9.3.Функции преобразования форматов
- •9.4.Функции обработки строк
- •9.5.Функции времени и даты
- •10.Обработка ошибок: инструкция On Error
- •11.Пользовательский интерфейс
- •11.1.Создание формы (UserForm) и добавление кнопок (СоmmandButton)
- •11.2.Вывод формы на экран (запуск формы)
- •11.3.Поле (TextBox) и надпись (Label).
- •11.4.Список (ListBox) и поле со списком (ComboBox)
- •11.4.1.Список (ListBox)
- •11.4.2.Определение выбранных элементов списка
- •11.4.3.Поле со списком (ComboBox)
- •11.4.4.Определение выбранного элемента
- •11.4.5.Создание взаимосвязанных элементов управления
- •11.5.Флажок (CheckBox)
- •11.6.Выключатель (ToggleButton)
- •11.7.Переключатель (OptionButton)
- •11.8.Счетчик (SpinButton)
- •11.9.Создание нестандартных меню и панелей инструментов.
- •11.9.1.Пример создания/удаления панели инструментов
- •11.9.2.Пример создания/удаления меню
- •12.События объектов Workbook и Worksheet
- •12.1.События объекта Workbook
- •12.2.События объекта Worksheet
- •Домашнее задание №1
- •Домашнее задание №2 и №3. Типовые варианты.
- •Вариант 1. Домашнее задание №2
- •Списочный состав института
- •Домашнее задание №3
- •Вариант 2. Домашнее задание №2
- •Списочный состав института
- •Домашнее задание №3
- •Вариант 3. Домашнее задание №2
- •Домашнее задание №3
- •Вариант 4. Домашнее задание №2
- •Домашнее задание №3
- •Вариант 5. Домашнее задание №2
- •Домашнее задание №3
6.4.3.Переменные уровня проекта
Переменная уровня проекта (или общего уровня) доступна и сохраняет свое значение в любом модуле проекта, содержащего ее описание. Чтобы сделать переменную доступной на уровне проекта, объявите ее с ключевым словом Public перед любыми подпрограммами и функциями.
Следующие две программы напишите в разных модулях (1-ю – в Модуль2, 2-ю – в Модуль5) и протестируйте их:
Public Var3 As String
Sub ПрисвоениеЗначения()
Var3 = "Эта переменная была объявлена в Модуль2."
End Sub
Sub ПеременнаяУровняПроекта()
ПрисвоениеЗначения
MsgBox Var3
End Sub
6.4.4.Сохраняемые переменные
Определив переменную как 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
6.4.5.Область видимости подпрограмм и функций
У подпрограмм и функций только два уровня видимости — модуля и проекта. По умолчанию все программы доступны на уровне проекта, то есть их можно вызывать из любого модуля проекта.
Чтобы перевести подпрограмму или функцию на уровень модуля, объявите ее с ключевым словом 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
6.4.6.Сохраняемые подпрограммы и функции
Употребив ключевое слово Static, подпрограмму и функцию можно сделать сохраняемыми. Сохраняемыми станут и все объявленные в ней переменные:
Sub ВызовСтатическойПодпрограммы()
СтатическаяПодпрограмма
СтатическаяПодпрограмма
End Sub
Static Sub СтатическаяПодпрограмма()
Dim Var1 As String
If Var1 = "" Then
Var1 = "Var1 ещё не статическая переменная "
Else
Var1 = " Var1 – статическая переменная."
End If
MsgBox Var1
End Sub
7.Управляющие структуры: 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 и протестировав их.
Пример условного перехода 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
Пример проверки нескольких условий с предоставлением пользователю различных прав доступа:
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
Предыдущий пример, написанный с помощью 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 "вам доступен для чтения первый лист."
Case Else
MsgBox "Пароль введен неверно. Попробуйте ещё раз."
End Select
End Sub
Пример использования инструкции For-Next при подсчете суммы четных неотрицательных чисел от 0 до n:
Sub ForNext()
Dim Сумма As Integer
Dim ВерхняяГраница As Integer
ВерхняяГраница = Int(InputBox("Введите верхнюю границу:"))
Сумма = 0
For i = 0 To ВерхняяГраница Step 2
Сумма = Сумма + i
Next
MsgBox "Сумма четных чисел до " & ВерхняяГраница & " = " _
& Сумма
End Sub
Пример использования инструкции While-Wend.
Sub WhileWend()
Dim LotteryEntry As Integer
LotteryEntry = 0
While LotteryEntry <> 7
LotteryEntry = Int(10 * Rnd())
Beep
Wend
MsgBox "Выпал номер " & LotteryEntry & ". вы выиграли!!"
End Sub
Пример использования инструкции 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
Пример использования инструкции Do-Until-Loop.
Sub DoUntilLoop()
Dim LotteryEntry и
LotteryEntry = 0
Do Until LotteryEntry = 7
LotteryEntry = Int(10 * Rnd())
Beep
Loop
MsgBox "Выпал номер " & LotteryEntry & ". вы выиграли!!"
End Sub
Пример использования инструкции 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
Пример использования инструкции For-Each-Next с семействами.
Следующая программа проверяет, имеется ли в активной книге лист с именем Случ. числа:
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
Процедура 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