10.8. Статические и динамические массивы
Язык VBA поддерживает два типа массивов — статические и динамические.
Статическими называют такие массивы, размерность которых была указана непосредственно при их объявлении.
В этом случае размер массива остается ф и к с и р о в а н н ы м на протяжении в с е г о в ы п о л н е н и я программы. Для объявления массивов используются те же самые операторы Dim и Public, что и при объявлении обычной переменной, причем с теми же правилами определения его области действия. Объявить массив фиксированного размера можно, указав в скобках после его имени конкретные значения для каждого его измерения. Например,
'Одномерный массив из 51 элемента
Dim Ml(50) As Integer
'Двухмерный массив из 11 строк по 21 элементу
Dim M2(10,20) As Integer
В этом примере первый оператор объявляет одномерный массив Ml из 51 целого числа. Как уже говорилось, в языке VBA по умолчанию принято нумерацию индексов начинать с нуля. Поэтому элементы массива М1будут пронумерованы от 0 до 50. Используя этот же принцип, аналогично, второй оператор объявляет двухмерный массив М2, который будет содержать 11 строк по 21 целому числу.
Итак, доступ к элементам объявленного массива осуществляется с помощью указания его индекса(ов) - целых чисел. Индекс может быть литералом, значением целочисленной переменной или же значением указанного элемента массива целых чисел. Самое важное в том, чтобы указанная величина в данный момент была целым числом - индексом нужного нам элемента массива.
Например, чтобы присвоить значение 215 тридцать девятому элементу массива Ml можно воспользоваться любым из трех указанных ниже способов:
Ml (38) = 215
или
х = 38
М1(х) = 215
или
х = 38
М1(0) = х
М1(М1(0)) = 215
Для того чтобы сослаться на элемент двухмерного массива, необходимо указать два индекса: М2 (9, 12). В этом примере мы обращаемся к 13 элементу 10-й строки.
Если вариант нумерации элементов в массиве, начиная от нуля, почему-либо не подходит, можно поместить в начало модуля оператор Option Base 1, указывающий, что нумерация индексов массивов должна начинаться с 1. Но надо учитывать, что действие этого оператора распространяется только на те массивы, которые находятся в н у т р и данного модуля.
Такого же эффекта в нумерации индексов можно достичь с помощью ключевого слова То (см. пример в пункте "Многомерные массивы"). Он более универсален и позволяет задавать любое начальное значение индексам массива:
Dim Stroka(10 То 25, 30 То 40) As String
Здесь происходит объявление двухмерного массива строковых переменных с именем Stroka, в котором по первому измерению имеется 16 позиций (от 10-й по 25-ю), а по второму измерению — 11 позиций (от 30-й по 40-ю), т.е. всего 176 строковых переменных.
В отличие от статических массивов, динамические массивы имеют п е р е м е н н о е количество элементов, т.е., динамические массивы могут увеличиваться или сокращаться в зависимости от того, какое число элементов нужно в заданный момент исполнения участка программы. Объявлять динамический массив целесообразно в следующих случаях:
1) когда требуемый размер массива неизвестен заранее, до выполнения программы;
2) если наоборот - заранее известно, что по ходу исполнения программы размер массива должен меняться;
3) если после завершения использования массива в программе нужно освободить занимаемую им память.
При объявлении динамического массива его размерность (индексы) в скобках после имени массива не указываются.
Dim D1( ) As String
Прежде чем использовать динамический массив в какой-то процедуре, обязательно нужно поместить в нее же оператор ReDim (переопределение массива), который бы задавал действительную размерность этого массива.
Оператор ReDim может быть указан для одного и того же массива сколько угодно раз, всякий раз задавая для него новую размерность и число элементов.
Dim Ml ()
Dim M2 ()
Dim M3()
. . . . . . . .
ReDim Ml (5) '1 измерение, 6 элементов
ReDim M2 (5 То 11) '1 измерение, 7 элементов
ReDim М3 (1 То 6, 1 То 10) '2 измерения, 60 элементов
При о б ы ч н о м переопределении массива его содержимое полностью у н и ч т о ж а е т с я.
Если же при этом необходимо сохранить уже существующие в нем данные, надо ввести необязательное ключевое слово Preserve.
Dim M() As Single
ReDim M (l To 10, 1 To 20) j
ReDim Preserve M (l To 10, 1 To 50)
Здесь сначала объявляется динамический массив М, затем он переопределяется как двухмерный массив заданного размера. Затем его размер увеличивается по второму измерению с сохранением уже имевшихся к этому моменту в нём данных.
Надо учитывать, однако, что использование ключевого слова Preserve не всегда "спасает положение":
-
при сокращении размеров массива д а н н ы е, оказавшиеся з а п р е д е л а м и его новых размеров, будут п о т е р я н ы.
-
р а з м е р н о с т ь массива (количество измерений) н е л ь з я и з м е н и т ь.
-
в м н о г о м е р н ы х массивах можно менять размер только п о с л е д н е г о измерения.
В VBA можно также передавать значения элементов одного массива другому. Для этого надо применить простой оператор присваивания, указав в нем в качестве операндов имена этих массивов:
МассивДанных = МассивИсходныхДанных
Но для того, чтобы не было "неожиданных эффектов", нужно
-
либо совпадение типов и количества элементов в обоих массивах,
-
либо массив, которому присваиваются значения (слева от знака равенства), должен быть динамическим, и сохраняемые в нем данные должны иметь тип данных исходного массива.
В противном случае компилятор VBA автоматически заменит тип данных, размер и размерность результирующего массива на соответствующие характеристики исходного массива.
Для очистки и удаления массивов в языке VBA применяется оператор Erase. После заполнения элементов массива данные в них хранятся до тех пор, пока программа не присвоит им новые значения или пока VBA не удалит этот массив из памяти.
Оператор Erase позволяет очистить все элементы массива при применении его к статическому массиву. В случае динамического массива оператор Erase удаляет из памяти сам массив, освобождая при этом ту область памяти, которая ранее использовалась этим массивом.
Чтобы вновь использовать удаленный динамический массив, его следует переопределить с помощью оператора ReDim.
-
Что касается статических массивов, то действие оператора Erase зависит от конкретного типа элементов данного массива:
-
для любого ч и с л о в о г о типа оператор Erase записывает во все элементы массива значение н у л ь;
-
для с т р о к о в о г о типа с переменной длиной строки оператор Erase помещает во все элементы массива строку нулевой длины, а строки фиксированной длины полностью заполняются символами пробелов;
-
для типа Variant оператор Erase устанавливает все элементы массива на Empty (пусто);
-
для типа Object оператор Erase устанавливает элементы массива на Nothing (ничто, ничего);
-
для пользовательского типа оператор Erase устанавливает числовые типы на 0, строковые — на строки нулевой длины, Variant — на Empty, a Object — на Nothing.
- Теоретические разделы курса “информатика”
- Введение
- Раздел 1. Базовые понятия курса “информатика” Глава 1. Введение в экономическую информатику
- Информационные процессы в экономике. Основные понятия информатики и информатизации
- Информация и данные
- Экономическая информация и ее свойства
- Классификация экономической информации
- Структура экономической информации
- Оценка экономической информации
- Вопросы для самоконтроля
- Контрольные тесты
- Глава 2. Программные средства реализации информационных процессов
- 2.1. Назначение и классификация программного обеспечения
- 2.2.1. Базовое программное обеспечение
- 2.2.2. Классификация операционных систем
- 2.2.3. Сервисное программное обеспечение
- 2.3. Инструментарий технологии программирования
- 2.4. Состав и назначение прикладного программного обеспечения
- 2.4.2. Методо-ориентированные пакеты прикладных программ
- 2.4.3. Пакеты прикладных программ общего назначения
- Вопросы для самоконтроля
- Контрольные тесты
- Глава 3. Технические средства реализации информационных процессов
- 3.1. Техническая основа реализации информационных процессов
- Эволюция компьютерных информационных технологий
- Арифметико-логическое устройство
- Устройство управления и интерфейс
- Процессорная память
- 3.2. Поколения электронных вычислительных машин
- 3.3. Классификация технических средств обработки информации
- 3.4. Персональные компьютеры
- 3.5. Структурная схема персонального компьютера
- Системная шина
- Контроллеры Системная плата
- 3.6. Принципы функционирования персонального компьютера
- Установка адреса начальной команды
- 3.7. Основные архитектурные схемы вычислительных систем
- Память команд
- Память команд
- Память команд
- Память данных
- Память команд
- 3.8. Режимы работы компьютеров
- 3.9. Информация в технических устройствах
- Единицы измерения памяти
- Вопросы для самоконтроля
- Контрольные тесты
- Глав 4. Способы представления информации в компьютерах
- 4.1. Системы счисления
- 4.1.1. Позиционные системы счисления
- Системы счисления
- 4.1.2. Перевод чисел из одной системы счисления в другую
- 4.1.3. Двоичная, восьмеричная и шестнадцатеричная системы счисления
- Представление чисел в двоичной, восьмеричной и шестнадцатеричной системах счисления
- 4.1.4. Выполнение арифметических операций в двоичной, восьмеричной и шестнадцатеричной системах счисления
- Сложение в двоичной системе
- Сложение в восьмеричной системе
- Сложение в шестнадцатеричной системе
- 4.2. Представление числовой информации. Прямой, обратный и дополнительный коды числа
- Диапазон значений целых чисел без знака
- Диапазон значений целых чисел со знаком
- 4.3. Представление символьной информации
- 4.4. Представление графической информации
- Вопросы для самоконтроля
- Контрольные тесты
- Глава 5. Логические основы построения персональных компьютеров
- 5.1. Аппарат алгебры логики
- Базовые логические операции
- 5.2. Основные аксиомы и законы алгебры логики
- 5.3. Логические элементы персональных компьютеров
- 5.4. Логические устройства с памятью
- Вопросы для самоконтроля
- Контрольные тесты
- Раздел 2. Основы алгоритмизации и программирования
- Глава 6. Понятие алгоритма и его основные формы
- 6.1. Алгоритм и его свойства
- 6.2. Формы представления алгоритма
- 1. Начало
- 8. Конец
- 6.3. Базовые алгоритмические структуры
- 6.3.2. Ветвящаяся (разветвлённая) структура
- Опер-р 1
- Опер-р 2
- Опер-р 20
- I нач.Знач.
- 6.4. Этапы развития программирования
- Глава 7. Объектно-ориентированное программирование в среде vba (Visual Basic for Application).
- 7.1. Что такое vba?
- 7.2. Основные понятия и элементы языка vba: объекты, свойства, методы, события, классы объектов
- 1. Объекты
- 3. Классы объектов
- Суперкласс
- Глава 8. Макросы в приложениях ms Office
- 8.1. Понятие макроса
- 8.2. Процесс создания макроса
- 8.3. Запуск макроса на исполнение
- АкБарсБанк
- 8.4. Код (текст) программы макроса и пояснения к нему
- 8.5. Корректировка макросов
- 8.6. Сохранение макросов в виде модулей
- Глава 9. Создание и выполнение vba – программ
- 9.1. Понятие об общем цикле создания vba – программы
- 9.2. Общие принципы построения vba-программы
- 9.3. Написание новых макросов и процедур
- 9.4. Выполнение vba-программы
- 9.5. Обработка ошибок
- Глава 10. Основные элементы языка программирования vba
- 10.1 Типы данных в vba.
- 10.2. Переменные vba.
- 10.3. Объявление переменных
- 10.4. Область действия переменной
- 10.5. Присвоение значения переменной
- 10.6. Константы
- 10.7. Массивы
- 10.7.1. Одномерные массивы
- 10.7.2. Многомерные массивы
- 10.8. Статические и динамические массивы
- 10.9. Структура текста программы и комментарии
- Глава 11. Примеры реализации различных макросов и фрагментов программ
- 11.1. Варианты реализации макросов
- 11.1.1. Порядок создания макросов в Excel
- 11.1.2. Задания на создание макросов в Excel
- 11.2. Варианты реализации разветвляющихся алгоритмов
- 11.3. Варианты реализации циклических алгоритмов
- 11.4. Вариант реализации смешанного алгоритма
- Раздел 3. Основы информационной безопасности
- Глава 12. Введение в информационную безопасность
- 12.1. Понятие информационной безопасности
- 12.2. Угрозы безопасности информации
- 12.3. Объекты и элементы защиты информации в компьютерных системах обработки данных
- Глава 13. Методы и средства защиты информации
- 13.1. Механизмы, методы и средства защиты информации
- 13.2. Средства опознания и разграничения доступа к информации
- 13.3. Криптографические методы защиты информации
- 13.3.1. Основные понятия криптографии
- 13.3.2. Криптографические ключи и методы защитных преобразований
- 13.3.3. Криптографические системы
- 13.4. Электронная цифровая подпись
- Глава 14. Компьютерные вирусы и спам
- 14.1. Понятие вредоносных программ
- 14.2. Понятие компьютерного вируса
- 14.3. Классификация компьютерных вирусов
- 14.4. Программы борьбы с компьютерными вирусами
- 14.5. Меры и средства защиты от компьютерных вирусов
- 14.6. Защита от спама
- Глава 15. Защита информации в корпоративных системах
- 15.1. Цели и задачи корпоративной системы информационной безопасности
- 15.2. Политики информационной безопасности
- 15.2.1. Основные понятия политик безопасности
- 15.2.2. Основные причины создания политик безопасности
- 15.2.3. Разработка политик безопасности
- 15.2.4. Пример постановки задачи разработки политики информационной безопасности предприятия
- 15.2.5. Особенности разработки политик безопасности в России
- 15.3. Аудит безопасности корпоративных систем Интенет/Интранет
- 15.3.1. Понятие аудита безопасности
- 15.3.2. Аудит безопасности для корпоративных пользователей
- 15.3.3. Возможности аудита безопасности
- 15.3.4. Практические шаги аудита безопасности
- 15.4. Проектирование системы обеспечения информационной безопасности предприятия
- Список литературы
- Содержание