Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Цель: Научиться использовать массивы для работы с большим объемом однородной информации
Иногда требуется обработать большой объем данных определенного типа, например, список имен служащих. Неудобно описывать отдельную переменную для каждой единицы информации, особенно, если число таких единиц велико или заранее неизвестно их количество. Решение данной проблемы состоит в использовании массивов. Массив - это набор элементов с определенным типом данных, каждый из которых имеет свой порядковый номер. Порядковый номер называют индексом элемента в массиве. Чтобы выделить память для хранения элементов, необходимо описать массив. Единственным отличием от простого описания переменной является использование параметра индекс, указывающего на число элементов в массиве. Рассмотрим следующее описание:
Dim EmployeeNames (4) As String
Число элементов в описанном массиве равно 5, т. к. если иное специально не оговаривается, то первый элемент массива имеет нулевой индекс. Таким образом, число элементов массива на единицу больше максимального индекса. Описав массив, можно присвоить значения его элементам:
EmployeeNames (0) = " Иван Петров" EmployeeNames (1) = " Сергей Власенко" EmployeeNames (2) = " Андрей Куцко" EmployeeNames (3) = " Елена Барыкина" EmployeeNames (4) = " Дмитрий Лившиц"
Присвоив значения элементам массива, можно использовать их. Попробуйте, например, выполнить следующую программу:
Sub Массив() Dim EmployeeNames(4) As String EmployeeNames(0) = " Иван Петров" EmployeeNames(1) = " Сергей Власенко" EmployeeNames(2) = " Андрей Куцко" EmployeeNames(3) = " Елена Барыкина" EmployeeNames(4) = " Дмитрий Лившиц" For Number = 0 To 4 MsgBox (" Доброе утро, " & EmployeeNames(Number)) Next Number End Sub Многомерные массивы В VBA можно создавать многомерные массивы. Чтобы описать, например, двумерный массив, необходимо задать в инструкции Dim два параметра индекс. Приведем инструкцию, которая описывает таблицу из 10 строк и 15 столбцов:
Dim Location (9, 14) As Integer
Более того, имеется возможность создать массив с очень большой размерностью, указав в описании требуемое число индексов. Однако необходимо учитывать, что затраты памяти увеличиваются очень быстро по мере задания новых индексов. Элементы многомерных массивов получают значения и используются практически так же, как элементы одномерных:
Location (8, 7) = 259 Amount = Location (8, 7) MsgBox (Amount)
Задание собственных типов данных Инструкция Type позволяет описать собственные типы данных, созданные на основе стандартных. С помощью определенных пользователем типов можно объявить переменные, которые содержат включающую несколько разнородных элементов информацию. Синтаксис инструкции Type выглядит следующим образом:
[Private | Public] Type имяПеременной имяЭлемента [([индексы])] As тип [имяЭлемента [([индексы])] As тип] … End Type
Параметр имяПеременной - имя, которое требуется присвоить определяемому типу. В описании можно указать произвольное число элементов любого типа данных, необязательно одинакового, включая массивы и другие заданные пользователем типы. Предположим, например, что требуется описать переменную, в которой хранится информация о некотором служащем. Конечно, для этого можно использовать и несколько переменных. Однако создавая собственный тип данных, можно хранить разрозненные данные в одной переменной:
Type Employee FirstName As String * 15 LastName As String *15 Phone As String * 13 Salary As Single DateHired As Date End Type После описания нового типа требуется явно объявить одну или несколько переменных этого типа. Чтобы описать переменную, подставьте в инструкции Dim имя заданного типа в качестве параметра тип, например:
Dim NewEmployee As Employee
Теперь после описания переменной можно присвоить значения ее элементам и использовать эти значения. Для доступа к значениям требуется указать название переменной, точку, а затем имя элемента, например:
NewEmployee.FirstName = " Иван" NewEmployee.LastName = " Петров" NewEmployee.Phone = " (212)555-1232" NewEmployee.Salary = 350 NewEmployee.DateHired = Date
Для использования переменной NewEmployee: FullName = NewEmployee.FirstName & " " & _ NewEmployee.LastName Теперь объединим приведенные примеры:
Type Employee FirstName As String * 15 LastName As String *15 Phone As String * 13 Salary As Single DateHired As Date End Type Sub Sample NewEmployee.FirstName = " Иван" NewEmployee.LastName = " Петров" NewEmployee.Phone = " (212)555-1232" NewEmployee.Salary = 350 NewEmployee.DateHired = Date FullName = NewEmployee.FirstName & " " & _ NewEmployee.LastName End Sub
Кроме того, можно создать массив, содержащий элементы собственного типа. Рассмотрим пример, в котором описывается массив из 10 служащих и заносятся данные в его первый элемент:
Dim AllEmployees (9) As Employee
AllEmployees (0).FirstName = " Иван" AllEmployees (0).LastName = " Петров"
Область определения и время жизни переменных
Область определения и время жизни переменных - два важных понятия, которые используются при работе с переменными. Они определяют, как и где применяются переменные. Область определения переменной определяет, где можно использовать переменную. В VBA имеется три уровня области определения: 1. Переменные уровня процедуры (личные переменные) используются только в процедуре, в которой они описаны. 2. Переменные уровня модуля используются только в процедурах модуля, в котором они описаны, но не в других модулях проекта. 3. Общие переменные используются во всех процедурах любого модуля данного проекта. Область определения переменной определяется тем, где и как описать переменную: · Личная переменная описывается с помощью инструкции Dim, размещенной в процедуре. · Переменная уровня модуля описывается с помощью инструкции Dim, размещенной в разделе описаний модуля. · Общая переменная описывается с помощью инструкции Public, а не инструкции Dim, в разделе описаний модуля: Public UserName As String
Личная переменная сохраняет свое значение только при выполнении процедуры, в которой она определена. При выходе из этой процедуры значение теряется, а при повторном запуске необходимо снова инициализировать переменную. Иногда удобнее использовать переменную, которая не теряет свое значения при выходе из процедуры, в которой она описывается. Для этого используется инструкция Static, которая имеет тот же синтаксис, что и инструкция Dim.
Static Counter As Integer
В этом случае переменная Counter сохраняет свое значение, пока выполняются другие процедуры. Проиллюстрируем сказанное на примерах процедур. Введите нижеприведенный код в окне модуля и запустите на выполнение процедуру CallingMacro.
Dim Counter As Integer Sub CallingMacro() CounterMacro BadCounterMacro Debug.Print " Counter = " & Counter End Sub
Sub CounterMacro() Static MyCounter As Integer Counter = Counter + 1 MyCounter = MyCounter + 1 Debug.Print " CounterMacro: Counter = " & Counter Debug.Print " CounterMacro: MyCounter = " & MyCounter End Sub
Sub BadCounterMacro() Dim MyCounter As Integer Counter = Counter + 1 MyCounter = MyCounter + 1 Debug.Print " BadCounterMacro: Counter = " & Counter Debug.Print " BadCounterMacro: MyCounter = " & MyCounter End Sub
В приведенных процедурах имеются три переменных: - переменная Counter - переменная уровня модуля, поэтому она доступна во всех процедурах модуля. При каждом вызове процедуры CounterMacro или BadCounterMacro переменная Counter увеличивается на единицу. - переменная MyCounter описана с помощью инструкции Static в процедуре CounterMacro, поэтому она используется только в этой процедуре и не доступна в других. Переменная сохраняет свое значение при выходе из процедуры и каждый раз увеличивается на единицу при входе в нее. Прежде чем вызвать процедуру в первый раз, переменная MyCounter инициализируется значением 0. - другая переменная с именем MyCounter описана как личная переменная процедуры BadCounterMacro, без использования инструкции Static. Поэтому она повторно инициализируется значением 0 при каждом вызове процедуры. Теперь посмотрим на результаты выполнения макроса CallingMacro в окне отладки ( Вид/Окно отладки ), если запустить его дважды:
CounterMacro: Counter = 1 CounterMacro: MyCounter = 1 BadCounterMacro: Counter = 2 BadCounterMacro: MyCounter = 1 Counter = 2 CounterMacro: Counter = 3 CounterMacro: MyCounter = 2 BadCounterMacro: Counter = 4 BadCounterMacro: MyCounter = 1 Counter = 4
Очевидно, что переменная уровня модуля Counter увеличивается на единицу при вызове каждой из процедур. Переменная MyCounter процедуры CounterMacro также непрерывно увеличивается на единицу при входе в процедуру, а переменная MyCounter процедуры BadCounterMacro каждый раз инициализируется значением 0 и увеличивается только до 1. Практическое упражнение Напишем программу, которая осуществляет заполнение массива с помощью оператора цикла, а затем - поиск записи в этом массиве по заданному критерию. Элементом массива является запись, содержащая информацию о фамилии абонента и номере его телефона. После ввода исходной информации, мы переходим в режим поиска, когда по введенной фамилии находится соответствующий номер телефона. Для выхода из этого режима необходимо будет ввести ключевое слово " exit". Программа выглядит следующим образом:
Type Record Fio As String Telephone As String End Type
Public Sub Номер_телефона() Dim People(20) As Record Do num = InputBox(" Введите количество записей в массиве" ) If num > 20 Then MsgBox (" Слишком большое число" ) Loop Until num < = 20 For i = 1 To num People(i).Fio = InputBox(" Фамилия, Имя, Отчество" ) People(i).Telephone = InputBox(" Номер телефона " & People(i).Fio) Next i Do Fio = InputBox(" Введите Ф.И.О. по которому необходимо определить номер телефона, для выхода - exit" ) For i = 1 To num If People(i).Fio = Fio Then MsgBox (Fio & ": " & People(i).Telephone) Next i Loop While Fio < > " exit" End Sub
Следует обратить внимание на то, что задание собственных типов данных производится не в области описания процедуры, а в области описания модуля.
Контрольные вопросы 1. Понятие массива. Индекс массива. 2. Описание массива. Многомерные массивы. 3. Задание собственных типов данных при помощи инструкции Type. 4. Область определения и время жизни переменных. ¨ Личная переменная; ¨ Переменная уровня модуля; ¨ Общая переменная. 5. Статитеческая переменная. |
Последнее изменение этой страницы: 2017-05-05; Просмотров: 420; Нарушение авторского права страницы