Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Номер первого элемента и границы массиваСодержание книги
Поиск на нашем сайте
До сих пор во всех примерах массивов мы начинали нумерацию элементов с 1. Как уже упоминалось, можно начинать ее с 0, 1 или любого другого числа. Правил здесь не существует: одни разработчики предпочитают 0, другие — 1. В VBA для выбора между 0 и 1 используется инструкция Option Base, которую помещают начало модуля VBA. Если этой инструкции нет, VBA по умолчанию использует в качестве первого номера 0. Чтобы начать нумерацию массива с другого числа, Вы должны в его объявлении указать верхнюю и нижнюю границы. Как это сделать, мы продемонстрируем в следующем примере. Sub НомерПервогоЭлемента() Dim Data4(4 To 5) As Integer Data4(4) = lnt(100 * Rnd()) Data4(5) = Int(100 * Rnd()) MsgBox " Выиграли лотерейные номера: " & Data4(4) & ", " & Data4(5) End Sub Здесь описан одномерный 2-элементный массив Data4. Числа, заключенные в круглые скобки после имени массива, задают его нижнюю и верхнюю границы. В данном случае номера двух элементов массива будут равны 4 и 5. Динамические массивы Кроме описанных массивов фиксированного размера в VBA есть массивы еще одного вида – динамические. До сих пор мы всегда явно указывали размерность массива в инструкции. При описании динамического массива его размер не указывается. Он определяется позже, при выполнении кода. Динамический массив удобен, если Вы предполагаете, что в ходе выполнения программы его размер может измениться. В этой ситуации можно сэкономить память: сделайте так, чтобы размеры массивов точно соответствовали Вашим текущим потребностям. В противном случае Вы рискуете создать массивы, которые только попусту занимают место – а это плохо отразится на производительности. Рассмотрим динамический массив подробнее. В процедуре ДинамическийМассив массив Data5 сначала (с помощью инструкции ReDim) объявлен как одномерный 2-элементный массив, а затем как двухмерный 30-элементный. Sub ДинамическийМассив() Dim Data5() As Variant ReDim Data5(2) Data5(1) = Int(100 * Rnd()) Data5(2) = Int(100 * Rnd()) MsgBox " Выиграли лотерейные номера: " & Data5(1) & ", " _ & Data5(2) ReDim Data5(10,3) Data5(1,1) = "Иванов" Data5(1,2) = #3/21/1947# Data5(1,3) = Year(Date)-Year(Data5(1,2)) MsgBox Data5(1,1) & ", возраст " & Data5(1,3) & _ ", родился " & Data5(1,2) End Sub Сначала в строке 2 мы описали массив Data5 типа Variant, не указывая число измерений и элементов. В этой инструкции определяется динамический массив, но память под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив Data5 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном окне. В 7-й строке инструкция ReDim используется еще раз для описания Data5 как двухмерного массива, содержащего 30 элементов. Хранившиеся в массиве данные пропадают. Затем элементам первой строки этого массива присваиваются значения и выводятся в информационном окне. Так, позволяя поочередно отводить один и тот же массив под разные данные, инструкция ReDim и динамический массив экономят память при выполнении программы. Кроме того, динамический массив удобен тогда, когда Вы не знаете, сколько записей будет в вашем массиве. Следующий пример демонстрирует эту ситуацию: 1. Пусть имеется база данных (БД) Excel, в которой хранятся сведения о сотрудниках института (Рис. 3‑2). Количество записей в БД может меняться. Рис. 3‑2. Фрагмент БД 2. Требуется сформировать двумерный массив с данными о доцентах, работающих в институте. В массиве должна храниться следующая информация: Кафедра, Ф.И.О., Разряд. Для этого напишем следующий код: Option Base 1 Sub МассивДоценты() Dim Сотрудники() As String Dim КолДоцентов As Integer Dim НомерСтроки As Integer КолДоцентов = 0 НомерСтроки = 3 While Cells(НомерСтроки,2).Value <> “” If Cells(НомерСтроки,3).Value = “Доцент” Then _ КолДоцентов = КолДоцентов + 1 НомерСтроки = НомерСтроки + 1 Wend ReDim Сотрудники(КолДоцентов, 3) For i = 1 To НомерСтроки - 1 If Cells(НомерСтроки,3).Value = “Доцент” Then Сотрудники(i,1) = Cells(НомерСтроки,1).Value Сотрудники(i,2) = Cells(НомерСтроки,2).Value Сотрудники(i,3) = Cells(НомерСтроки,3).Value End If Next MsgBox "Массив сформирован! В нем содержится " _ & КолДоцентов & “ записей.” End Sub Так как количество записей заранее неизвестно, воспользуемся управляющей структурой While- Wend (строки 8 ¸ 12, подробнее см. 8.4). Эта конструкция позволяет выполнять группу инструкций до тех пор, пока соблюдается некоторое условие (в данном примере – вторая ячейка в строке не должна быть пустой[14]). Просматривая БД, считаем количество доцентов и запоминаем его в переменной КолДоцентов. После того как все записи БД «просмотрены», ещё раз объявляем динамический массив как двумерный массив с известным количеством записей (строка 13). Далее заполняем этот массив записями, отвечающими заданному критерию отбора (строки 14 ¸ 20). Сохранение данных в динамическом массиве при изменении В рассмотренном примере наблюдается такая несуразица как двойная проверка условия «Должность = доцент»: первый раз соответствие записи этому критерию осуществлялось при подсчете количества записей, а второй раз – при выборке информации. Возникает вопрос: а возможно ли при нахождении нужной записи сразу добавлять информацию в динамический массив? Оказывается, - да, возможно. Для этого используется ключевое слово 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) недопустима!
|
||||
Последнее изменение этой страницы: 2021-12-15; просмотров: 42; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.32.238 (0.006 с.) |