Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Цель: Научиться использовать массивы для работы с большим объемом однородной информации



 

Иногда требуется обработать большой объем данных определенного типа, например, список имен служащих. Неудобно описывать отдельную переменную для каждой единицы информации, особенно, если число таких единиц велико или заранее неизвестно их количество.

Решение данной проблемы состоит в использовании массивов. Массив - это набор элементов с определенным типом данных, каждый из которых имеет свой порядковый номер. Порядковый номер называют индексом элемента в массиве. Чтобы выделить память для хранения элементов, необходимо описать массив. Единственным отличием от простого описания переменной является использование параметра индекс, указывающего на число элементов в массиве.

Рассмотрим следующее описание:

 

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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.041 с.)
Главная | Случайная страница | Обратная связь