Решим простую задачу: ввести в ответ на вопросы программы фамилии сотрудников. Если фамилий немного - 5 или 10 - использование переменных, с которыми вы уже знакомы, вполне оправдано. Программа будет состоять из нескольких строк такого вида:
a = InputBox("Введите фамилию сотрудника").
Как быть, если нужно работать со списком из 20 фамилий? А если их будет 50, 1000 или их количество должно быть определено в ходе выполнения программы?
Для обработки больших объемов информации использовать переменные неудобно. Что же делать? Ответ прост: использовать
Массив - это именованный набор индексированных ячеек. Ячейки так же называют элементами или индексированными переменными.
У каждого
Имя - правила именования
Размерность - одномерные
Нумерация элементов подчиняется следующим правилам:
To.Option Base 1.Тип - подчиняется тем же правилам, которые мы ранее рассмотрели для переменных. Если пользователь не указал его явно, массив получит тип по умолчанию - Variant. Это требует больше системных ресурсов, но позволяет обрабатывать значения различных типов.
Не всегда количество элементов и размерность
07-01-Одномерный массив.docm- пример к п. 7.2.
Для объявления Dim. Объявить массив можно двумя способами. Первый заключается в указании общего количества элементов. Например, так:
Dim MyArrayA(30) As Single
Объявленный массив MyArrayА содержит 31 элемент (с индексами от 0 до 30) типа Single. Поскольку нумерация явно не задана, элементы получат индексы по обычным правилам.
Можно объявить массив и другим способом:
Dim MyArrayB(1 To 25)
Массив MyArrayB содержит 25 элементов. Границы нумерации заданы явно - первый элемент получит индекс 1, второй - 2 и т.д. Тип не указан - в
Работа с элементами
Решение задачи приведено в листинге 7.1.
Dim A(2)
A(0) = 5
A(1) = InputBox("Введите значение второго элемента")
A(2) = A(0) * A(1)
MsgBox A(2)
В конце работы программы, если на вопрос о вводе числа мы введем число 2, массив A будет иметь такой вид - табл. 7.1.
| Индекс | 0 | 1 | 2 |
|---|---|---|---|
| Значение | 5 | 2 | 10 |
Как видите, серьезное отличие
Возможно, сейчас вы еще не вполне осознаете полезность
Циклы позволяют выполнять одни и те же команды много раз. В табл. 7.2. собрана информация об основных видах циклов.
| Название цикла | Вид |
|---|---|
For - Next |
С фиксированным количеством повторов. Выполняется заданное количество раз |
While - Wend |
С предусловием. Если не верно условие, заданное на входе в цикл, может не выполниться ни разу |
Do - Loop |
С постусловием. Выполняется по меньшей мере один раз. |
07-02-Цикл For-Next.docm - пример к п. 7.4.
Решим задачу: вывести цифры от 1 до 10 в окнах сообщений. Ее можно решить и без использования циклов, написав 10 строк такого вида: MsgBox ("1"). А вот конструкция For - Next позволяет делать то же самое гораздо изящнее. В листинге 7.2. вы можете найти решение задачи.
For i = 1 To 10
MsgBox (i)
Next i
Ключевое слово For задает начало цикла. После него следует переменная i, которая увеличивается при каждом проходе цикла. В ходе работы конструкции For - Next значение i изменяется от 1 до 10.
Начальное значение счетчика устанавливается при входе в цикл. Мы просто приравниваем i какому-либо числу. Конечное значение переменной задается после ключевого слова To. Переменная i доступна внутри цикла - ведь именно ее мы выводим в окне сообщения.
Ключевое слово Next с указанием переменной, к которой оно относится, закрывает цикл.
В качестве первого и последнего значения счетчика цикла можно использовать какую-нибудь переменную. Она может быть определена в ходе выполнения программы, но до входа в конструкцию For - Next.
Вы могли заметить, что переменная цикла меняется с приращением 1. Это приращение можно задать в явном виде с помощью ключевого слова Step. В листинге 7.3. вы можете видеть пример оператора For - Next, выводящего нечетные числа в диапазоне от 1 до 10.
For i = 1 To 10 Step 2
MsgBox (i)
Next i
С помощью ключевого слова Step можно создать не только возрастающий, но и убывающий счетчик. Для этого в Step надо указать отрицательное число и проследить за тем, чтобы первое значение переменной цикла было больше последнего. Например, так: For i=10 to 1 Step -1. Первое значение переменной в таком цикле будет равняться 10, второе - 9 и т.д. - до 1.
Теперь перейдем к совместному использованию циклов и
Готовая программа приведена в листинге 7.4.
Dim MyArray(9)
For i = 0 To 9
MyArray(i) = InputBox("Введите фамилию №" i + 1)
Next i
For i = 0 To 9 'Начало еще одного цикла
MsgBox ("Фамилия №" (i + 1) " " MyArray(i))
Next i 'Конец цикла
Обсудив цикл типа For-Next, продолжим разговор о
07-03-Многомерные массивы.docm - пример к п. 7.5.
Многомерные
Для того чтобы объявить двумерный массив, нужно воспользоваться командой Dim с указанием размерности каждого из измерений. Остальные правила объявления таких
Dim MyArrayA(10, 1) As Single
Массив MyArrayА содержит 11 строк и 2 столбца типа Single.
Можно в явном виде задать границы размерностей:
Dim MyArrayB(1 To 25, 1 To 5)
Массив MyArrayB содержит 25 строк и 5 столбцов. Границы нумерации заданы явно. Тип не указан - в
В листинге 7.5. приведен пример программы, которая объявляет двумерный массив 5х2 и предлагает ввести в него фамилии и номера телефонов сотрудников.
Dim MyArray(1 To 5, 1 To 2)
For i = 1 To 5
MyArray(i, 1) = InputBox("Введите фамилию №" i)
MyArray(i, 2) = InputBox("Введите Телефон №" i)
Next i
В табл. 7.3. вы можете видеть массив MyArray после заполнения его фамилиями и номерами телефонов. В MyArray (1,1) мы внесли фамилию "Иванов", в MyArray (1,2) - телефон Иванова 898989898 и т.д.
| Индекс | 1 | 2 |
|---|---|---|
| 1 | Иванов | 898989898 |
| 2 | Петров | 343434343 |
| 3 | Сидоров | 565656565 |
| 4 | Александров | 121111212 |
| 5 | Маринин | 545454544 |
Эта программа очень похожа на те, которые мы писали для работы с одномерными
Один цикл неудобно использовать для работы с
07-04-Вложенные циклы.docm - пример к п. 7.6.
Принцип работы вложенных циклов кроется в их названии. Все очень просто - один цикл вкладывается в другой. Например, для заполнения
Dim MyArray(1 To 10, 1 To 10)
For i = 1 To 10
For j = 1 To 10
MyArray(i, j) = Int(Rnd(1) * 10)
Next j
Next i
Внешний цикл ( i ) выполняется один раз, после чего внутренний ( j ) - десять раз. За один проход внешнего цикла внутренний выполняет десять - заполняется первая строка
07-05-Динамические массивы.docm - пример к п. 7.7.
Когда вы используете массив, не всегда известно заранее, сколько элементов он будет иметь. В такой ситуации можно объявить массив, который содержит заведомо больше элементов, чем может понадобиться, но это приведет к нерациональному использованию системных ресурсов. Что же делать? Динамические
Решим задачу. Программа просит пользователя ввести количество сотрудников, которое сохраняет в переменной ArraySize, а потом создает массив, одна из размерностей которого равняется ArraySize.
Чтобы воспользоваться Dim MyArray(), а потом задать размерность ReDim (листинге 7.7.)
Dim MyArray()
ArraySize = InputBox("Введите количество сотрудников")
ReDim MyArray(1 To ArraySize, 1 To 2)
В итоге, если на вопрос программы о количестве сотрудников мы ввели число 15, будет создан двумерный массив размерностью 15х2.
Если в программе возникла ситуация, когда последней размерности объявленного и заполненного ReDim с ключевым словом . Благодаря ему данные, внесенные ранее в массив, будут сохранены. Например, для добавления двух дополнительных столбцов в
ReDim Preserve MyArray(1 To ArraySize, 1 To 4)
07-06-Дополнительные команды.docm - пример к п. 7.8.
Для работы с
Array (MyArray заполняется числами 1, 2, 6, 9 и 19, после чего первый элемент
Dim MyArray MyArray = Array(1, 2, 6, 9, 19) MsgBox MyArray(0)
IsArray (Имя переменной) - возвращает True если переменная является массивом. Например, в листинге 7.9. мы объявляем две переменные - одну из них как массив, вторую - как обычную переменную. Далее мы используем оператор IsArray для проверки того, является ли переменная массивом. После чего программа выводит соответствующее сообщение. Здесь мы использовали оператор сравнения If, подробности о котором мы рассмотрим ниже.
Dim MyArray(10)
Dim MyArr
If IsArray(MyArray) Then _
MsgBox ("Переменная MyArray - массив") _
Else MsgBox ("Переменная MyArray - не массив")
If IsArray(MyArr) Then _
MsgBox ("Переменная MyArr - массив") _
Else MsgBox ("Переменна MyArr - не массив")
LBound (Имя Массива, Размерность) - возвращает нижнюю границу для указанной
UBound (Имя Массива, Размерность) - возвращает верхнюю границу для указанной
Рассмотрим пример. Создадим LBound и UBound узнаем размерности
Dim MyArray()
ReDim MyArray(Int(Rnd * 5 + 5), Int(Rnd * 5 + 5))
MsgBox ("Двумерный массив MyArray:" + Chr(13) + _
"Первая размерность:" + _
Str(LBound(MyArray, 1)) + " -" + _
Str(UBound(MyArray, 1)) + Chr(13) + _
"Вторая размерность:" + _
Str(LBound(MyArray, 2)) + " -" + _
Str(UBound(MyArray, 2)))
For i = LBound(MyArray, 1) To UBound(MyArray, 1)
For j = LBound(MyArray, 2) To UBound(MyArray, 2)
MyArray(i, j) = Int(Rnd * 100)
Next j
Next i
В нашем случае команда LBound для обеих размерностей Ubound возвращает границу каждой из размерностей, которая установлена случайным образом с помощью оператора ReDim. На рис. 7.1. вы можете видеть окно сообщения c информацией о границах
(рис 7.1) Сообщение о размерностях массива Erase Имя_массива - очистить массив. Элементы обычных Erase к Erase к ReDim. Причем, для повторного использования Erase применяется к объектному Nothing, которое означает пустую ссылку на объект.
Теперь, когда мы обсудили циклы For-Next и работу с
07-07-Цикл с предусловием.docm - пример к п. 7.9.
Как вы уже знаете, While - Wend выполняется до тех пор, пока условие, указанное на входе, верно.
В листинге 7.11. представлено решение такой задачи: выводить на экран случайные числа от 0 до 20 до тех пор, пока не будет выведено число больше 10.
А = 1
While А < 10
А = Int(Rnd() * 20)
MsgBox А
Wend
Сначала мы приравниваем переменной А число 1. Проверка при входе в цикл находит, что А меньше 10 и запускает первый проход. Переменной А приравнивается целое случайное число, это число выводится в окне сообщения. Дальше следует новая проверка - если A все еще меньше 10 - все повторяется снова. Если A больше или равно 10 - число не выводится, после чего выполнение цикла прекращается.
Теперь рассмотрим
07-08-Цикл с постусловием.docm - пример к п. 7.10.
Цикл Do-Loop While выполняется до тех пор, пока значение на выходе из цикла не верно. Подобные циклы используют, например, для проверки правильности ввода каких-либо данных пользователем. Если данные введены неверно - цикл выполняется снова.
Аналогично действует цикл Do-Loop Until - он будет выполняться до тех пор, пока условие цикла неверно (то есть равно False ).
В листинге 7.12. вы можете найти пример такого цикла. Здесь пользователю предлагается ввести какое-нибудь число. Если введено не число (то есть функция IsNumeric возвратит False ), программа выведет окно ввода снова.
Dim var_A
Do
var_A = InputBox("Введите число")
Loop Until IsNumeric(var_A)
07-09-If-Then-Else.docm - пример к п. 7.11.
Программы на VBA умеют принимать решения - для этого существуют операторы условного перехода. Они объединены в конструкцию If - Then - Else.
В этой конструкции могут быть использованы следующие операторы сравнения (табл. 7.4.)
| Оператор | Описание |
|---|---|
= |
Равно |
<> |
Не равно |
> |
Больше |
< |
Меньше |
>= |
Больше или равно |
<= |
Меньше или равно |
Like |
Сравнение строки с шаблоном |
Is |
Сравнение объектов |
Напишем простую программу (листинг 7.13.), которая спрашивает у пользователя его возраст. Если введенный возраст меньше 18 - программа должна вывести надпись "Вам менее 18 лет", если больше или равен 18 - надпись "Вам 18 или больше".
a = InputBox("Введите ваш возраст")
If a < 18 Then MsgBox ("Вам меньше 18")
If a >= 18 Then MsgBox ("Вам 18 или больше")
Здесь представлен оператор в простейшем виде - проверка условия и выполнение однострочной команды. А что если нужно выполнить не одну команду, а несколько? Для этого служит команда End If (листинг 7.14.)
a = InputBox("Введите ваш возраст")
If a < 18 Then
MsgBox ("Вам меньше 18")
MsgBox ("Вам не следует смотреть этот фильм")
End If
If a >= 18 Then MsgBox ("Добро пожаловать")
Здесь программа выводит два сообщения, если пользователю меньше 18 лет.
Оператор может иметь вид If - Then - Else (листинг 7.15). Благодаря ему два оператора If - Then из листинга 7.13. можно объединить в один.
a = InputBox("Введите ваш возраст")
If a < 18 Then MsgBox ("Вам меньше 18") _
Else MsgBox ("Вам больше 18")
Применение команды Else так же позволяет исполнять многострочные команды. Например, вот так - листинг 7.16.
a = InputBox("Введите ваш возраст")
If a < 18 Then
MsgBox ("Вам меньше 18")
MsgBox ("Вам не следует смотреть этот фильм")
Else
MsgBox ("Вам больше 18")
MsgBox ("Добро пожаловать")
End If
В операторе If возможно использование сложных условий. Например, вы просите пользователя ввести имя и пароль. Если они соответствуют данным, хранящимся в системе, программа выводит приветствие, иначе - сообщает о том, что пользователь ввел неправильные сведения. Очевидно, что нам нужно проверить два условия, причем важно, чтобы и то и другое выполнялось. Для этого можно воспользоваться And, который трактуется как "И". Конструкция с And выглядит так - листинг 7.17.
UserName = InputBox("Введите имя пользователя")
UserPass = InputBox("Введите ваш пароль")
If UserName = "Александр" And UserPass = "12345" Then
MsgBox ("Добро пожаловать в систему")
Else
MsgBox ("Неверное имя пользователя или пароль")
End If
Словесно вышеприведенную конструкцию можно описать так: " Если имя равно Александр и пароль равен 12345…".
Логический оператор Or (переводится как "Или") позволяет принять положительное решение, если выполняется хотя бы одно из условий. Например, нам нужно узнать имя пользователя, и если оно соответствует одному из имен, зарегистрированных в системе, вывести приветствие, иначе - вывести информацию об отсутствии в системе такого пользователя - листинг. 7.18.
UserName = InputBox("Введите имя пользователя")
If UserName = "Александр" Or UserName = "Сергей" Or _
UserName = "Николай" Then
MsgBox ("Добро пожаловать в систему, " UserName)
Else
MsgBox ("В системе нет такого пользователя!")
End If
And и Or можно использовать вместе. Оператор Not (Не) позволяет задавать условия с отрицанием. Например, вы можете пропустить в систему всех пользователей кроме пользователя с именем "Владимир".
Для проверки дополнительных условий можно использовать оператор If - Then - Else.
Выше, в табл. 7.4., есть пара необычных операторов - Like для сравнения строк с шаблоном, и Is - для сравнения
07-10-Сравнение строк с шаблонами.docm - пример к п. 7.12.
Оператор Like используется для сравнения строк с шаблонами. Шаблон - это особым образом записанная последовательность символов. При построении шаблонов используются специальные символы, приведенные в табл. 7.5.
| Символы | Описание |
|---|---|
| ? | Любой одиночный символ |
* |
Любое количество любых символов |
# |
Любая одиночная цифра |
[список символов] |
Любой одиночный символ, входящий в список символов |
[!список символов] |
Любой одиночный символ, не входящий в список |
После построения шаблона его заключают в кавычки.
Давайте рассмотрим пример, реализующий следующие проверки.
а " и " о "d " и заканчивается тремя буквами " f ", сообщить об этомВ листинге 7.19. вы можете найти решение этой задачи
Dim str_Inp As String
str_Inp = InputBox("Введите строку")
'Есть ли латинские буквы в строке
If str_Inp Like "*[a-z]*" Or _
str_Inp Like "*[A-Z]*" _
Then MsgBox ("В строке есть латинские буквы")
'Состоит ли введенное слово из 4-х символов
If str_Inp Like "????" Then _
MsgBox ("Введенное слово состоит из 4-х символов")
'Состоит ли введенная последовательность
'из 2-х любых символов и 2-х цифр
If str_Inp Like "??##" Then _
MsgBox ("Введены два любых символа и две цифры")
'Проверка на отсутствие букв
'"а", "о"
If str_Inp Like "[!а]" And _
str_Inp Like "[!о]" Then
MsgBox ("В строке нет букв " + Chr(34) + _
"а" + Chr(34) + " и " + Chr(34) + "о" + Chr(34))
End If
'Проверка на наличие в начале
'введенной строки двух букв "d", а в конце
'трех "f"
If str_Inp Like "dd*fff" _
Then MsgBox ("Строка имеет вид: dd*fff")
Как вы можете видеть, шаблон для сравнения с текстом всегда заключается в двойные кавычки. На основе информации об использовании шаблонных символов вы можете самостоятельно построить выражения для проверки различных последовательностей.
Оператор Is используется для работы с Is проверяет, ссылаются ли две объектные переменные на один и тот же объект. Если это так - он возвращает True, если нет - то False.
07-11-Select Case.docm - пример к п. 7.13.
Если вам предстоит проверить данные на множество значений, для каждого из которых надо выполнить какое-то особое действие, можно использовать множество операторов If или один Select Case.
В листинге 7.20. приведен пример использования Select Case - в зависимости от введенного имени программа здоровается с пользователями по-разному.
Dim str_UserName As String
str_UserName = InputBox("Введите имя пользователя")
Select Case str_UserName
Case "Александр"
MsgBox ("Привет")
Case "Сергей"
MsgBox ("Здравствуй")
Case "Николай"
MsgBox ("Добро пожаловать")
Case Else
MsgBox ("Не существует такого пользователя")
End Select
После Select Case указано имя переменной, анализ которой осуществляется. Дальше расположено произвольное количество вариантов - каждый вариант после ключевого слова Case. Если не выполнен ни один из Case - выполняется Case Else. В конце этой конструкции находится оператор End Select.
07-12-GoTo.docm - пример к п. 7.14.
В VBA есть один оператор, которым не рекомендуется пользоваться при написании программ. Это GoTo. Он позволяет передать управление в определенное место программы, заданное номером строки или меткой. Меткой строки может быть любое слово (подчиняющееся правилам
Например,
Dim num_Cycle
num_Cycle = 0
Cycle_Start:
num_Cycle = num_Cycle + 1
MsgBox ("Проход цикла номер: " + Str(num_Cycle))
If num_Cycle < 5 Then GoTo Cycle_Start
Здесь мы создаем метку Cycle_Start, которая означает начало цикла. После этого увеличиваем на единицу переменную, которая является счетчиком GoTo Cycle_Start передает управление на соответствующую метку. В такой простой конструкции, как наша, особенных сложностей в чтении кода не видно. Но стоит программе хотя бы немного увеличиться, несколько подобных циклов (особенно - вложенных, а еще хуже - использующих номер строки для перехода) превратят ее в сложный для чтения и правки текст.
GoTo делает программы трудночитаемыми, его практически всегда можно заменить, используя другие программные конструкции. Единственное место, где GoTo пока незаменим - это использование его при написании обработчиков ошибок времени выполнения. В следующей лекции мы поговорим о таких ошибках и об использовании GoTo для организации подпроцедур в исполняемой процедуре.
07-13-Работа с файлами.docm - пример к п. 7.15.
Программы, написанные на VBA, умеют работать с внешними
Как правило, чтобы открыть Dir. Она возвращает строку, содержащую имя
var_Doc = Dir("C:\*.*")
Do While var_Doc <> ""
MsgBox var_Doc
var_Doc = Dir()
Loop
Сначала мы присваиваем переменной ? - он символизирует один любой символ. Если не указать путь к Dir будет искать их в
Помимо пути и маски при поиске
var_Doc = Dir("C:\*.*", vbDirectory)
Обратите внимание на то, что после пути и маски указан параметр vbDirectory - он указывает функции, что она должна включить в поиск и директории.
После того, как первое найденное имя присвоено переменной, мы запускаем Dir не обнаружил по указанному пути ничего подходящего под заданную маску, он возвратит, пустую строку. Следовательно, цикл в таком случае не выполнится ни разу.
В цикле есть две строки. Первая выводит найденное имя на экран, а вторая - вызывает функцию Dir еще раз - без параметров. Такой вызов возвращает следующее имя Dir шаблон. После этого все повторяется. В реальной программе в такой цикл можно вставить команды для работы с найденными
Помимо Dir полезной может оказаться команда ChDir. Она позволяет перейти в указанную при ее вызове директорию, которая будет использоваться в качестве директории по умолчанию. Такая конструкция, предшествующая циклу из предыдущего примера позволит найти все C:\Документы ":
ChDir ("C:\Документы")
var_doc = Dir("*.*")
Существует множество других функций работы с
В этой лекции мы познакомились с
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.