МАССИВЫ Массивы Массив — упорядоченная














![Функции для работы с массивами Функция LBound(Array. Name[, Dimension]) Функция LBound (Lower Bound) служит Функции для работы с массивами Функция LBound(Array. Name[, Dimension]) Функция LBound (Lower Bound) служит](https://present5.com/presentation/3/41393827_237472440.pdf-img/41393827_237472440.pdf-15.jpg)
![Функции для работы с массивами Функция UBound(Array. Name[, Dimension]) Функция UBound (Upper Bound) служит Функции для работы с массивами Функция UBound(Array. Name[, Dimension]) Функция UBound (Upper Bound) служит](https://present5.com/presentation/3/41393827_237472440.pdf-img/41393827_237472440.pdf-16.jpg)














![Динамические массивы Синтаксис Re. Dim: Re. Dim [Preserve] varname(subscripts) [As Type] [, Динамические массивы Синтаксис Re. Dim: Re. Dim [Preserve] varname(subscripts) [As Type] [,](https://present5.com/presentation/3/41393827_237472440.pdf-img/41393827_237472440.pdf-32.jpg)






МАССИВЫ
Массивы Массив - упорядоченная совокупность однотипных переменных. Массив (array) — это набор переменных, которые имеют общие имя и базовый тип. Массив позволяет сохранять и манипулировать многими элементами данных посредством единственной переменной. Кроме уменьшения общего числа различных имен переменных, которые необходимо отслеживать, другим основным преимуществом использования массивов является то, что можно использовать циклы для легкой обработки различных элементов массивов.
Размерность массива В языках программирования обычно используются одномерные и многомерные массивы, одни из которых описывают относительно простые, а другие — более сложные объекты. Наименее сложный массив — это просто список элементов данных; такого рода массив называется одномерным массивом. Каждый элемент данных, хранимых в массиве, называется элементом массива. Для доступа к данным, хранящимся в определенном элементе массива, следует указывать имя массива с последующим числом, называемым индексом элемента. Индекс всегда заключается в круглые скобки. Можно использовать элемент массива в любом выражении VBA — точно так же, как используется значение константы или переменной в каком-либо выражении.
Размерность массива Часто бывает необходимо представить таблицы данных в программах с организацией данных в формате строк и столбцов, подобно ячейкам в рабочих листах Excel. Для этого необходимо использовать многомерные массивы. Адрес каждого элемента двумерного состоит из двух чисел (измерений), одно из которых (номер строки) является первым индексом, а второе (номер столбца) — вторым индексом массива. VBA позволяет создавать массивы, имеющие до 60 измерений. Чаще всего в программировании используются одно — и двумерные массивы.
Объявление массива Прежде чем использовать массив его необходимо описать. Объявление массива с использованием оператора Dim имеет следующий синтаксис: Dim Var. Name([Subscripts]) [As Type] Var. Name - любое имя массива, использующее допустимый идентификатор имени; Subscripts - измерение массива. Если размерность массива больше единицы, то Subscripts разделяются запятыми. Оператор Subscripts имеет следующий синтаксис: [lower To] upper [, [lower To] upper]. . lower - определяет нижний диапазон допустимых индексов для массива (необязательный аргумент); upper - определяет верхний предел для индексов массива (обязательный аргумент).
Примеры объявления массива Dim Mass(1 To 12) As Integer Dim Spis(2000 To 2013) As String Dim T(1 To 12, 1 To 31) As Single Dim Dec(20 To 30) As Integer
Примеры объявления массива Dim My. Array(10) As Integer Dim Table(3, 5) As Single Обычно в VBA используются массивы с нулевой базой. В системе нумерации с нулевой базой индекс для первого элемента в любом измерении массива является равным 0; массив My. Array с 10 элементами имеет индексы от 0 до 9.
Оператор Option Base VBA позволяет задавать начальное число для элементов массива c помощью директивы компилятора Option Base. Директива компилятора Option Base имеет следующий синтаксис: Option Base 0 | 1 Оператор Option Base позволяет задавать 0 или 1 как начальное число по умолчанию для индексов массива. Если оператор Option Base не используется, VBA начинает нумерацию индексов массива с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлениями любых переменных, констант или процедур. Можно иметь только один оператор Option Base в модуле. Оператор Option Base влияет на все массивы, объявляемые в модуле, независимо от того, являются ли они локальными в процедуре или объявляются на модульном уровне.
Использование массивов После объявления массива использовать его в коде VBA довольно просто. Для доступа к элементу массива необходимо указать имя массива, за которым следует значение индекса, заключенное в круглые скобки. Обращение к элементу массива имеет следующий синтаксис: array. Name(valid. Index 1, [validlndex 2]…) здесь array. Name — имя массива; validlndexl — допустимое значение индекса для первого измерения массива; validlndex 2 — допустимое значение индекса для второго измерения массива, если таковое имеется. Необходимо предоставлять значение индекса для каждого измерения массива при каждом обращении к какому-либо элементу в массиве. Допустимым индексом является любая переменная VBA или выражение, имеющее результатом целое число в диапазоне объявленных измерений массива.
Использование массивов Получить одномерный массив из 100 случайных целых чисел от 1 до 100. Числа в массиве не повторяются.
Код задачи Option Base 1 Sub генерация() Dim mas(100) As Integer, n As Integer Dim flag As Boolean Randomize k=1 mas(1) = Int(Rnd(1) * 100) + 1 Do While k < 100 n = Int(Rnd(1) * 100) + 1 flag = False
Код задачи For i = 1 To k If n = mas(i) Then flag = True Next If flag = False Then k=k+1 mas(k) = n End If Loop For i = 1 To 100 Cells(i, 1). Value = mas(i) Next End Sub
Использование массивов
Функции для работы с массивами Функция Array(Param. Array) Функция Array служит для обработки массивов. Функция объявляет переменную типа Variant, присваиваемую массиву, а значения аргумента означают размерность массива Параметры Param. Array. Обязательный аргумент представляет собой разделенный запятыми список значений, присеваемых массиву типа Variant, которые представляют собой значения элементов массива. Если аргумент Param. Array не указывается Array() то создается массив нулевой длины Примечание Первый элемент массива начинается с 0. Если хотите начать отчет с 1, используйте Option Base 1 Dim Сезон=Array(“Зима”, ”Весна”, ”Лето”, ”Осень”)
Функции для работы с массивами Функция LBound(Array. Name[, Dimension]) Функция LBound (Lower Bound) служит для определения нижней границы (индекса самого первого элемента) массива по заданному измерению Возвращаемое значение Возвращает значение типа Long, содержащее наименьший возможный нижний индекс для указанного измерения массива Параметры Array. Name (Обязательный) Имя переменной массива, соответствующее стандартным соглашениям о наименовании переменных. При задании в качестве аргумента переменной, не являющейся массивом, генерируется ошибка времени исполнения Dimension (Необязательный) Значение типа Variant(Long). Целое число, указывающее, для какого из измерений возвращается нижняя граница. Первому измерению соответствует 1, второму – 2 и т. д. Если параметр Dimension опущен, предполагается значение равное 1 Нижняя граница для любого из измерений массива равна по умолчанию 0 или 1, в зависимости от установки оператора Option Base.
Функции для работы с массивами Функция UBound(Array. Name[, Dimension]) Функция UBound (Upper Bound) служит для определения верхней границы (индекса самого последнего элемента) массива по заданному измерению Возвращаемое значение Возвращает значение типа Long, содержащее наибольший возможный верхний индекс для указанного измерения массива Параметры Array. Name (Обязательный) Имя переменной массива, соответствующее стандартным соглашениям о наименовании переменных. При задании в качестве аргумента переменной, не являющейся массивом, генерируется ошибка времени исполнения Dimension (Необязательный) Значение типа Variant(Long). Целое число, указывающее, для какого из измерений возвращается верхняя граница. Первому измерению соответствует 1, второму – 2 и т. д. Если параметр Dimension опущен, предполагается значение равное 1
Использование массивов Для введенной даты вывести название для недели Function день_недели(дата As Date) As String Dim d, n As Integer d = Array("Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресение") If Weekday(дата) = 1 Then n=7 Else n = Weekday(дата) – 1 End. If день_недели = d(n) End Function
Использование массивов Создать функцию перевод, которая записывает любое целое число в виде числительного. Замечание Число описывается как Long, а значит лежит в диапазоне от 1 до 2147483647.
Function перевод 2(число As Long) As String Dim ed, k As Integer, res As String Dim n As Integer res = "" ed = Array("", " тыс. ", " млн. ", " млрд. ") k=1 Do n = число Mod 1000 If n <> 0 Then p = ЧИСЛИТЕЛЬНОЕ(n) + ed(k) Else p = "" End If res = p + " " + res k=k+1 число = число 1000 Loop While число > 0 перевод 2 = res End Function
Пример
Function перевод 1(число As Long) As String Dim ed, k As Integer, res As String Dim n As Integer res = "" ed = Array("", " тыс. ", " млн. ", " млрд. ") k=1 Do n = число Mod 1000 If n <> 0 Then p = ЧИСЛИТЕЛЬНОЕ(n) + ed(k) Else p = "" End If
If k = 2 Then p = Replace(p, "один", "одна") p = Replace(p, "два", "две") End If res = p + " " + res k=k+1 число = число 1000 Loop While число > 0 перевод 1 = res End Function
Пример
Function перевод(число As Long) As String Dim ed, k As Integer, res As String Dim n As Integer, c As Integer, ok As String res = "" ed = Array("", " тысяч", " миллион", " миллиард") k=1 Do n = число Mod 1000 If n <> 0 Then p = ЧИСЛИТЕЛЬНОЕ(n) + ed(k) + окончание(n, k) Else p = "" End If
If k = 2 Then p = Replace(p, "один", "одна") p = Replace(p, "два", "две") End If res = p + " " + res k=k+1 число = число 1000 Loop While число > 0 перевод = res End Function
0 1 2 3 4 5 6 7 8 9 Тысяч а и и и Миллион ов а а а ов ов ов ов Миллиард ов а а а ов ов ов ов
Function окончание(n As Integer, k As Integer) As String окончание = "" n 2 = n Mod 100 n 1 = n Mod 10 If k = 2 Then If n 2 < 5 Or n 2 > 20 Then окончание = Choose(n 1 + 1, "", "а", "и", "", "", "") End If If k > 2 Then If n 2 >= 10 And n 2 <= 20 Then окончание = "ов" Else окончание = Choose(n 1 + 1, "ов", "а", "ов", "ов") End If End Function
Статические и динамические массивы Массивы, не меняющие число своих элементов, называются статическими массивами. Примером такого массива может служить вышеприведенный массив My_Array, содержащий 10 элементов. Однако бывают ситуации, когда изначально неизвестно количество элементов в массиве, или же, в процессе работы это количество может изменяться. Такие массивы называются динамическими массивами. Динамический массив может увеличиваться или сжиматься, чтобы вмещать точно необходимое число элементов без напрасного расходования памяти.
Динамические массивы При объявлении (описании) динамического массива его размер не указывается. В процессе выполнения программы его размер может изменяться, причём неоднократно. Поэтому динамический массив применяют, если предполагается, что размер массива не будет постоянным. Dim Din_Array() As Integer
Динамические массивы Dim Din_Array() As Integer VBA имеется возможность при помощи оператора Re. Dim переопределять размерность массива, а во время объявления не указывать его размерность.
Динамические массивы Синтаксис Re. Dim: Re. Dim [Preserve] varname(subscripts) [As Type] [, varname(subscripts) [As Type]] varname - имя существующего массива; subscripts - размерность существующего массива; Type - любой тип VBA. Необходимо использовать отдельный оператор As Type для каждого массива, который определяется; Preserve - необязательный аргумент. Его использование приводит к тому, что данные уже имеющиеся в массиве, сохраняются после изменения его размерности.
Примеры правильного использования оператора Re. Dim: Dim Array_Month() As String - одномерный строковый динамический массив Re. Dim Array_Month(29) - устанавливет размерность динамического массива равную 29 элементам Re. Dim Array_Month(1 To 30) - изменяет размер массива до 30 элемента Re. Dim Preserve Array_Month(1 To 31) - изменяет размер массива до 31 элемента, сохраняя содержимое Dim Array_DBL() As Single - объявляет динамический массив Re. Dim Array_DBL(2, 9) - делает массив двумерным Re. Dim Array_DBL(3, 7) - изменяет размер двумерного массива Re. Dim Preserve Array_DBL(1 To 3, 1 To 5) - изменяет последний размер массива, сохраняя содержимое
Пример Имеется список участников кастинга с указанием полученных баллов. Получить список допущенных к конкурсу. Это участники набравшие баллы, больше среднего арифметического от всех баллов. Fio. X, Ball. X – массивы фамилий и баллов участников кастинга. Fio. Y, Ball. Y – массивы фамилий и баллов допущенных к конкурсу
Sub конкурс() Dim Fio. X() As String, Ball. X() As Integer Dim Fio. Y() As String, Ball. Y() As Integer Dim n As Integer, i As Integer, k As Integer Dim s As Integer, sr As Single i=1 Do While Cells(i, 1). Text <> "" i=i+1 Loop n=i-2 Re. Dim Fio. X(n), Ball. X(n) For i = 1 To n Fio. X(i) = Cells(i + 1, 1). Value Ball. X(i) = Cells(i + 1, 2). Value Next
s=0 For i = 1 To n s = s + Ball. X(i) Next sr = s / n k=0 For i = 1 To n If Ball. X(i) > sr Then k=k+1 Re. Dim Preserve Fio. Y(k) Re. Dim Preserve Ball. Y(k) Fio. Y(k) = Fio. X(i) Ball. Y(k) = Ball. X(i) End If Next
k = UBound(Fio. Y) For i = 1 To k Cells(i + 1, 4). Value = Fio. Y(i) Cells(i + 1, 5). Value = Ball. Y(i) Next End Sub
Коллекции В любом языке программирования массивы и коллекции занимают большое место. При этом именно понятие коллекция принимает широкое распространение. При программировании на VBA понятие коллекции приобретает большой смысл. Коллекции встречаются на каждом шагу. Обычно коллекции имеют 4 метода: Add Remove Count Item

