Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
3.91 Mб
Скачать

3.6. Сохранение данных в динамическом массиве при изменении последней размерности

В рассмотренном примере наблюдается такая несуразица, как двойная проверка условия «Должность = Доцент»: первый раз соответствие записи этому критерию осуществлялось при подсчете количества записей, а второй раз – при выборке информации. Возникает вопрос: а возможно ли при нахождении нужной записи сразу добавлять информацию в динамический массив? Оказывается, да, возможно. Для этого используется ключевое слово Preserve (сохранить). Следующий код демонстрирует эту возможность:

Sub МассивДоценты_СохранениеДанных()

Dim Сотрудники() As String

Dim КолДоцентов As Integer

Dim НомерСтроки As Integer

КолДоцентов = 0

НомерСтроки = 3

While Cells(НомерСтроки,2).Value <> ""

If Cells(НомерСтроки,3).Value = "Доцент" _

Then КолДоцентов = КолДоцентов + 1

ReDim Preserve Сотрудники(3,КолДоцентов)

Сотрудники(1,КолДоцентов) = _

Cells(НомерСтроки,1).Value

Сотрудники(2,КолДоцентов) = _

Cells(НомерСтроки,2).Value

Сотрудники(3,КолДоцентов) = _

Cells(НомерСтроки,3).Value

End If

НомерСтроки = НомерСтроки + 1

Wend

MsgBox "Массив сформирован! В нем содержится " _

& КолДоцентов & " записей."

End Sub

В строке 9 этого кода при выполнении критерия отбора счетчик увеличивается на 1 и (строка 10) в оперативной памяти выделяется место для следующей записи. При этом предыдущие записи сохраняются. При отсутствии ключевого слова Preserve при повторном определении динамического массива память выделяется заново, при этом все данные уничтожаются.

ОБРАТИТЕ ВНИМАНИЕ: при использовании ключевого слова Preserve, изменяемая размерность должна быть последней. Это значит, что команда:

ReDim Preserve Сотрудники(КолДоцентов, 3)

недопустима!

3.7. Пять функций для работы с массивами

С массивами VBA чаще всего используют пять функций: Array, Erase, IsArray, LBound и UBound. Кратко расскажем о каждой из них.

Функция Array позволяет создавать массив в ходе выполнения программы, без предварительного описания:

Sub МассивБезОписания()

Data6 = Array("Иванов", 60, #3/21/1947#)

MsgBox Data6(1) & ", возраст " & Data6(2) _

& " родился " & Data6(3)

End Sub

Во второй строке программа МассивБезОписания функцией Array создается одномерный 3-элементный массив типа Variant фиксированного размера. Помните, что функция Array всегда возвращает массив Variant и использует нумерацию, заданную инструкцией Option Base.

Функция Erase используется для удаления данных, хранимых в элементах массива. Если это массив фиксированного размера, функция Erase лишь очищает его, а память, выделенная массиву, остается за ним. Динамический массив уничтожается функцией Erase полностью. Программа ФункцияErase демонстрирует удаление всех значений, записанных в массив фиксированного размера.

Sub ФункцияErase()

Dim Data7(2) As Integer

Data7(1) = Int(100 * Rnd())

Data7(2) = Int(100 * Rnd())

MsgBox "Лотерейные номера: " & Data7(1) & _

", " & Data7(2)

Erase Data7

MsgBox "Лотерейные номера: " & Data7(1) & _

", " & Data7(2)

End Sub

Здесь элементам массива присваиваются значения и выводятся в информационном окне. Затем для удаления содержимого массива вызывается функция Erase. Второй вызов функции MsgBox свидетельствует, что во всех элементах Data7 содержатся нули. В следующем примере показан вызов функции Erase для динамического массива.

Sub EraseДинамичМассив()

Dim Data8() As Integer

ReDim Data8(2)

Data8(1) = Int(100 * Rnd())

Data8(2) = Int(100 * Rnd())

MsgBox " Лотерейные номера: " & Data8(1) & _

", " & Data8(2)

Erase Data8

MsgBox " Лотерейные номера: " & Data8(1) & _

", " & Data8(2)

End Sub

Выполнение программы EraseДинамичМассив приводит к ошибке в строке 8, потому что функция Erase в предыдущей строке освободила всю память, занятую динамическим массивом. После этого VBA уже не может работать с индексами Data8 и обращение к этому массиву вызывает ошибку.

Функция IsArray – это встроенная функция VBA, которая позволяет проверить, является ли некоторая переменная массивом. IsArray принимает один аргумент и возвращает True (если переменная является массивом) или False (если переменная не является массивом). Такая операция полезна, например, когда вы вызываете функцию, возвращающую массив, но не уверены, что она действительно вернет его, а не обычную переменную. Действие IsArray продемонстрировано ниже:

Sub ФункцияIsArray ()

Dim Data9(2) As Integer

Dim ArrayBool As Boolean

ArrayBool = IsArray(Data9)

If ArrayBool = True Then

MsgBox "Data9 является массивом."

End If

End Sub

Конечно, этот пример не имеет практического смысла, но действие IsArray показано в нем ясно. Во второй строке объявлен массив, в третьей – логическая переменная ArrayBool. Далее этой переменной присваивается значение, возвращенное функцией IsArray (True или False). Инструкция If использована для проверки результата IsArray и вывода сообщения, если значение переменной ArrayBool равно True. Подробно эта инструкция описана в разделе «Управляющая инструкция If-Then-Else» на стр. 82.

Функции LBound и UBound помогут вам определить верхнюю и нижнюю границы индексов массива, как показано в следующем примере:

Sub Lbound_UBound()

Dim Data10(4 To 15) As Integer

MsgBox "Нижняя граница массива" & LBound(Datal0) & "."

MsgBox "Верхняя граница массива " & _

UBound(Datal0) & "."

End Sub

ЗАМЕЧАНИЕ. Применение этих функций к обычной переменной или динамическому массиву, не описанному инструкцией ReDim, вызывает ошибку при выполнении программы. Чтобы избежать этого, перед вызовом функций LBound и UBound проверьте переменную функцией IsArray.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]