Инструкция Option Base
Объявление массива
Вот пример описания одномерного массива для данных типа Integer.
Dim ЧисловойМассив(10) As Integer
Оно ничем не отличается от описания переменной, которое обсуждалось ранее, за единственным исключением — после имени переменной вводится число в круглых скобках, указывающее VBA, что Вы объявляете не одиночную переменную, а массив, и определяющее его структуру. Здесь мы задали только одно число, значит, будет создан одномерный массив ЧисловойМассив, предназначенный для хранения 10 целых чисел. В действительности число 10 определяет верхнюю границу индексов массива. Если Вы указываете, что массив должен содержать 10 элементов, VBA по умолчанию полагает, что номер первого элемента — 1.
Объявление двухмерного массива выглядит так:
Dim ДвухмерныйМассив (10,20) As String
Таблица ДвухмерныйМассив состоит из 10 строк и 20 столбцов и содержит до 200 строковых переменных.
И еще один пример — описание трехмерного массива типаVariant:
Dim ТрехмерныйМассив(5,50,100) As Variant
Массив ТрехмерныйМассив состоит из пяти таблиц, каждая из которых содержит по 50 строк и 100 столбцов. Он может содержать до 25 000 элементов.
Как видите, при увеличении размерности быстро возрастают и требования к объему памяти. При определении массива VBA выделяет достаточно места для всех его элементов. Точный объем выделяемой памяти зависит от размера массива и типа данных в нем. Например, для целочисленного массива, содержащего 10 элементов, требуется 20 байт, поскольку каждое целое число занимает 2 байта. Трехмерный массив ТрехмерныйМассив, описанный выше и состоящий из значений типа Variant, займет не менее 400 000 байт (25 000 раз по 16 байт). Имейте в виду, что массивы с большим числом измерений займут много памяти и сильно снизят производительность. При попытке объявить массив с объемом, превышающим доступную память компьютера, Вы увидите на экране сообщение «Недостаточно памяти» (Out of Memory).
Нумерация массивов VBA может начинаться с 0 или 1. Конкретный способ указан в инструкции Option Base в начале модуля. Так, Option Base 0 задает нумерацию всех массивов по умолчанию с 0, a Option Base 1 — с 1. В отсутствие инструкции Option Base нумерация массивов по умолчанию начинается с 0. Но в следующих примерах мы для простоты считаем, что она начинается с 1.
Option base 1 в vba что это
Применяется на уровне модуля для задания нижней границы индексов массива, используемой по умолчанию.
Замечания
Поскольку по умолчанию используется значение 0, инструкция Option Base никогда не является обязательной. Однако если она используется, эта инструкция должна появляться в модуле перед любой процедурой. Инструкция Option Base может задаваться в модуле только один раз и должна предшествовать описаниям массивов, включающих размерности.
Предложение To в инструкциях Dim, Private, Public, ReDim и Static предоставляет более гибкий способ управления диапазоном индексов массива. Однако если нижняя граница индексов не задается явно в предложении To, можно воспользоваться инструкцией Option Base, чтобы установить используемую по умолчанию нижнюю границу индексов, равную 1. Нижняя граница значений индексов массивов, создаваемых с помощью функции Array, всегда равняется нулю; вне зависимости от инструкции Option Base.
Инструкция Option Base действует на нижнюю границу индексов массивов только того модуля, в котором расположена сама эта инструкция.
Пример
В данном примере инструкция Option Base используется для изменения нижней границы индексов массива, по умолчанию равной 0. Функция LBound возвращает минимальный доступный индекс указанной размерности массива. Инструкция Option Base используется только на уровне модуля.
Оператор Option Base
Используется на уровне модуля для объявления нижней границы по умолчанию для подскрипников массива.
Синтаксис
Примечания
Поскольку база по умолчанию равна 0, оператор Option Base никогда не требуется. Если используется, оператор должен находиться в модуле до всех процедур. Оператор Option Base может указываться в модуле только один раз и должен предшествовать объявлениям массивов, включающим размерности.
Пункт To в тусклом, частном, публичном, reDim и static заявлениях обеспечивает более гибкий способ управления диапазоном подзаписей массива. Однако, если вы явно не установите нижнюю границу с пунктом To, вы можете использовать базу опций для изменения нижней границы по умолчанию на 1. База массива, созданного с ключевым словом ParamArray, ноль; База опций не влияет на ParamArray (или функцию Array, если она имеет имя библиотеки типов, например VBA. Array).
Оператор Option Base влияет только на нижнюю границу массивов в модуле, где находится данный оператор.
Пример
В этом примере оператор Option Base используется для переопределения значения базового индекса массива, равного 0. Функция LBound возвращает наименьший доступный подскрипник для указанных размеров массива. Оператор Option Base используется только на уровне модуля.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Option base 1 в vba что это
Что такое массив
Типы массивов
Массивы в VBA и во многих других языках программирования делятся на 2 класса:
Объявление массивов
Объявление фиксированных массивов
Рекомендация : при объявлении массивов VBA я советую вам давать всем именам префикс » arr «. Я сторонник венгерской нотации.
Помимо вышеуказанного вы вправе использовать следующий синтаксис, который НЕ зависит от option base <0|1>:
таким образом вы в явном виде указываете и нижнюю, и верхнюю границы. Как видите, нижняя граница совершенно не обязательно должна начинаться с 0 или 1. Более того, индексы границ могут принимать и отрицательные значения, главное чтобы нижняя была меньше верхней.
Помимо одномерных массивов, можно объявлять и массивы с размерностью больше единицы.
Объявление динамических массивов
Динамические массивы объявляться так:
Однако, использовать их после такого объявления пока ещё нельзя. Необходимо выделить память под массив. Особенность работы с динамическим массивом как раз состоит в том, что программист отвечает за его своевременное расширение (усечение) в памяти. Для этого существует специальный оператор, который имеет следующий синтаксис:
ReDim [Preserve] varname(subscripts) [As Type]
После этого оператора, вы можете использовать элементы массива arrOpen с 0-го по 5-й. Всё, что мы говорили про оператор option base и нижнюю границу, верно и для динамических массивов. Предположим, что вы сохранили информацию в элементах 0-5 и у вас поспела новая порция информации для элементов 6-11. Чтобы разместить в данном массиве новые элементы и не потерять старые, вы должны сделать следующее:
Изменение элементов массива
Как и с обычными переменными запись информации в элемент массива происходит через оператор присваивания (=), но указанием индекса элемента массива.
Чтение элементов массива
Определение границ массива
LBound( array [, dimension])
UBound( array [, dimension])
Если вы ошибётесь с указанием правильного индекса массива, то возникнет ошибка периода исполнения с кодом 9. Эта же ошибка возникнет, если вы в функции LBound / UBound укажете несуществующую размерность массива (например, 3 для двумерного массива).
Перебор элементов массива
Собственно массивы нужны для того, чтобы хранить в них однотипную информацию и перебирать их в цикле. Как правило, алгоритм делает что-то полезное с одним элементом массива, а цикл повторяет эти типовые действия для всех элементов массива.
так же есть способ не заботиться об определении нижней и верхней границ, если алгоритм не требует от нас знания текущего индекса массива:
Передача массивов в подпрограммы
Массив с элементами типа массив
Продемонстрируем, как можно хранить в качестве элементов массива другие массивы.
Результат отладочной печати:
Функция Array
Array( arglist )
Функция Split
Split возвращает одномерный массив, содержащий подстроки, из строкового выражении с учётом указанного разделителя
Split(expression[, delimiter[, limit[, compare]]])
Результат выглядит так:
Нюансы работы с динамическими массивами
Неинициализированный массив
У динамического массива есть такое промежуточное состояние, когда он уже объявлен, но ещё не содержит никаких элементов.
То есть у переменной динамического массива есть такое состояние, когда мы не можем воспользоваться вспомогательными функциями LBound / UBound для определения его (массива) статуса. Это особенно надо учитывать, когда вы пишите подпрограммы, работающие с массивами. Прежде чем работать (перебирать) массив необходимо убедиться, что он проинициализирован, в противном случае программа вылетит с ошибкой 9.
Для этого я предлагаю пользоваться функцией подобной нижеописанной IsNotEmptyArray :
Расширение массива
Как правило, расширять динамический массив приходится в цикле. Возможны 2 стратегии: расширение на 1 элемент, как только в этом есть необходимость (назовём это эластичным расширением), и расширение авансом, когда вы увеличиваете верхнюю границу скачками, скажем сразу на 100 элементов. Реализовав оба варианта, я для себя сделал вывод, что авансовое расширение получилось и компактнее, и работает быстрее, так как операция расширения, вообще говоря, затратна и, чем реже вызывается, тем лучше.
Авансовый метод вышел даже компактнее
Удаление массива
Получение массива на основе диапазона Excel
Дополнительные источники
В качестве источника дополнительной информации по массивам я могу порекомендовать замечательный, исчерпывающий ресурс Чарльза Пирсона (Charles H. Pearson). Его сайт следует штудировать всем, кто серьёзно осваивает VBA. Конкретно по массивам там огромное количество готовых подпрограмм для работы с ними, исходные коды, снабженные подробнейшими комментариями, продвинутые объяснения для копающих в глубину. Без преувеличения великолепный ресурс!
Option Base statement
Used at the module level to declare the default lower bound for array subscripts.
Syntax
Remarks
Because the default base is 0, the Option Base statement is never required. If used, the statement must appear in a module before any procedures. Option Base can appear only once in a module and must precede array declarations that include dimensions.
The To clause in the Dim, Private, Public, ReDim, and Static statements provides a more flexible way to control the range of an array’s subscripts. However, if you don’t explicitly set the lower bound with a To clause, you can use Option Base to change the default lower bound to 1. The base of an array created with the ParamArray keyword is zero; Option Base does not affect ParamArray (or the Array function, when qualified with the name of its type library, for example VBA.Array).
The Option Base statement only affects the lower bound of arrays in the module where the statement is located.
Example
This example uses the Option Base statement to override the default base array subscript value of 0. The LBound function returns the smallest available subscript for the indicated dimension of an array. The Option Base statement is used at the module level only.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.






