Array Dimensions in Visual Basic
Измерение — это направление, в котором можно изменять спецификацию элементов массива. Массив, содержащий общий объем продаж за каждый день месяца, имеет одно измерение (день месяца). Массив, содержащий общий объем продаж по отделам за каждый день месяца, имеет два измерения (номер отдела и день месяца). Число измерений массива называется его рангом.
Можно использовать свойство , Rank чтобы определить, сколько измерений имеет массив.
Работа с измерениями
Элемент массива указывается путем указания индекса или индекса для каждого из его измерений. Элементы смежны вдоль каждого измерения от индекса 0 до самого высокого индекса для этого измерения.
На следующих иллюстрациях показана концептуальная структура массивов с разными рангами. Каждый элемент на иллюстрациях показывает значения индекса, которые обращаются к нему. Например, можно получить доступ к первому элементу второй строки двумерного массива, указав индексы (1, 0) .
Одно измерение
Многие массивы имеют только одно измерение, например количество людей каждого возраста. Единственным требованием для указания элемента является возраст, для которого этот элемент содержит счетчик. Таким образом, такой массив использует только один индекс. В следующем примере объявляется переменная для хранения одномерного массива возрастных счетчиков для возрастов от 0 до 120.
Dim ageCounts(120) As UInteger
Два измерения
Некоторые массивы имеют два измерения, например количество офисов на каждом этаже каждого здания в кампусе. Спецификация элемента требует как номера здания, так и пола, и каждый элемент содержит счетчик для этого сочетания здания и пола. Таким образом, такой массив использует два индекса. В следующем примере объявляется переменная для хранения двумерного массива офисных счетчиков для зданий от 0 до 40 и этажей с 0 по 5.
Dim officeCounts(40, 5) As Byte
Двумерный массив также называется прямоугольным массивом.
Три измерения
Некоторые массивы имеют три измерения, например значения в трехмерном пространстве. Такой массив использует три индекса, которые в данном случае представляют координаты x, y и z физического пространства. В следующем примере объявляется переменная для хранения трехмерного массива температур воздуха в различных точках трехмерного объема.
Dim airTemperatures(99, 99, 24) As Single
Более трех измерений
Хотя массив может иметь до 32 измерений, редко бывает больше трех.
При добавлении измерений в массив общий объем хранилища, необходимый массиву, значительно увеличивается, поэтому используйте многомерные массивы с осторожностью.
Использование различных измерений
Предположим, вы хотите отслеживать объемы продаж за каждый день текущего месяца. Можно объявить одномерный массив с 31 элементом, по одному на каждый день месяца, как показано в следующем примере.
Dim salesAmounts(30) As Double
Теперь предположим, что вы хотите отслеживать одни и те же сведения не только за каждый день месяца, но и за каждый месяц года. Можно объявить двумерный массив с 12 строками (для месяцев) и 31 столбцом (для дней), как показано в следующем примере.
Dim salesAmounts(11, 30) As Double
Теперь предположим, что вы решили хранить данные в массиве более одного года. Если вы хотите отслеживать объемы продаж в течение 5 лет, можно объявить трехмерный массив с 5 слоями, 12 строками и 31 столбцом, как показано в следующем примере.
Dim salesAmounts(4, 11, 30) As Double
Обратите внимание, что так как каждый индекс варьируется от 0 до максимального значения, каждое измерение salesAmounts объявляется как меньше требуемой длины для этого измерения. Обратите внимание, что размер массива увеличивается с каждым новым измерением. Три размера в предыдущих примерах : 31, 372 и 1860 элементов соответственно.
Массив можно создать без использования Dim оператора или New предложения . Например, можно вызвать CreateInstance метод или другой компонент может передать код в массив, созданный таким образом. Такой массив может иметь нижнюю границу, отличаемую от 0. Вы всегда можете проверить нижнюю границу измерения с помощью GetLowerBound метода или LBound функции .
См. также
- Массивы
- Устранение неполадок, связанных с массивами
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Функция UBound
Возвращает значение типа Long, содержащее верхнюю границу размерности для указанного измерения массива.
UBound ( имя_массива [, измерение ] )
Функция UBound имеет следующие аргументы:
имя_массива
Обязательный аргумент. Имя переменной массива; должно удовлетворять стандартным соглашениям об именовании.
измерение
Необязательный аргумент. Variant (Long). Целое число, указывающее, для какого измерения массива должна быть возвращена верхняя граница. Для первого измерения следует задать значение 1, для второго — 2 и т. д. Если аргумент измерение не указан, используется значение 1.
Функция UBound используется в сочетании с функцией LBound для определения размера массива. Функция LBound позволяет определить нижнюю границу измерения массива.
Функция UBound возвращает следующие значения для массива с указанными изменениями:
Dim A(1 To 100, 0 To 3, -3 To 4)
Возвращаемое значение
Пример
Примечание: В примерах ниже показано, как использовать эту функцию в модуле Visual Basic для приложений (VBA). Чтобы получить дополнительные сведения о работе с VBA, выберите Справочник разработчика в раскрывающемся списке рядом с полем Поиск и введите одно или несколько слов в поле поиска.
В этом примере с помощью функции UBound определяется наибольший доступный индекс указанного измерения массива.
Dim Upper
‘ Declare array variables.
Dim MyArray(1 To 10, 5 To 15, 10 To 20)
Dim AnyArray(10)
Upper = UBound(MyArray, 1) ‘ Returns 10.
Upper = UBound(MyArray, 3) ‘ Returns 20.
Upper = UBound(AnyArray) ‘ Returns 10.
Объявление массивов
Массивы объявляются так же, как и другие переменные, при помощи операторов Dim, Static, Private или Public Отличие скалярных переменных (которые не являются массивами) от переменных массивов заключается в том, что для массива, как правило, необходимо указывать размер. Массив с указанным размером является массивом фиксированного размера. Массив, размер которого можно изменить во время выполнения программы, является динамическим массивом.
Индексация массива от 0 или 1 зависит от оператора Option Base. Если не указано Option Base 1, все индексы массива будут начинается с нуля.
Объявление статического массива
В приведенном ниже примере кода массив фиксированного размера объявлен массивом целых переменных (Integer) с 11 строками и 11 столбцами:
Dim MyArray(10, 10) As Integer
Первый аргумент определяет количество строк, второй — столбцов.
Как и в случае объявления любой другой переменной, если для объявленного массива не указать тип данных, его элементам будет присвоен тип данных Variant. Каждый числовой элемент Variant массива использует 16 байтов. Каждый строчный элемент Variant использует 22 байта. Чтобы написать как можно более компактный код, четко объявите для своих массивов тип данных, отличный от Variant.
В приведенном ниже примере кода сравниваются размеры нескольких массивов.
' Integer array uses 22 bytes (11 elements * 2 bytes). ReDim MyIntegerArray(10) As Integer ' Double-precision array uses 88 bytes (11 elements * 8 bytes). ReDim MyDoubleArray(10) As Double ' Variant array uses at least 176 bytes (11 elements * 16 bytes). ReDim MyVariantArray(10) ' Integer array uses 100 * 100 * 2 bytes (20,000 bytes). ReDim MyIntegerArray (99, 99) As Integer ' Double-precision array uses 100 * 100 * 8 bytes (80,000 bytes). ReDim MyDoubleArray (99, 99) As Double ' Variant array uses at least 160,000 bytes (100 * 100 * 16 bytes). ReDim MyVariantArray(99, 99)
Максимальный размер массивов зависит от операционной системы и доступного объема памяти. Использование массивов, размер которых превышает объем доступной оперативной памяти вашего компьютера, приводит к снижению скорости, поскольку системе необходимо выполнять запись данных и чтение с диска.
Объявление динамического массива
Объявив динамический массив, вы сможете менять его размер во время выполнения кода. Используйте операторы Static, Dim, Private или Public, чтобы объявить массив, не указывая значение в скобках, как показано в следующем примере:
Dim sngArray() As Single
Используйте оператор ReDim, чтобы неявно объявить массив в процедуре. Будьте внимательны и вводите имя массива без ошибок при использовании оператора ReDim. Даже если в модуль включен оператор Option Explicit, будет создан второй массив.
В процедуре внутри области массива используйте оператор ReDim, чтобы изменить количество измерений, задать количество элементов и определить нижнюю и верхнюю границы каждого измерения. Используйте оператор ReDim, чтобы изменить динамический массив при необходимости. Однако значения внутри массива при этом не сохраняются. Используйте ReDim Preserve для расширения массива, сохраняя при этом текущие значения.
Например, приведенный ниже оператор увеличивает массив на 10 элементов, сохраняя при этом текущие значения исходных элементов.
ReDim Preserve varArray(UBound(varArray) + 10)
При использовании ключевого словаPreserve с динамическим массивом можно изменить только верхнюю границу последнего измерения, но нельзя изменить количество измерений.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Отправить и просмотреть отзыв по
Как узнать размерность массива vba
Excel и VBA не являются моими коньками, хотя и мой уровень владения ими не ниже среднего. Но прибегаю к ним достаточно редко. Потому и наступаю на грабли. Недавно столкнулся с тем, что в VBA не смог определить размер массива строк после преобразования строки в массив строк функцией Split.
Перевести длинную строчку в массив можно функцией Split.
Dim txt As String txt = "Перевести длинную строчку в массив можно функцией Split" Dim textArray() As String textArray = Split(txt)
Согласно документации, размер массива можно определить функцией Length. Но в случае с массивом, полученным с помощью функции Split, этого сделать нельзя. На строке «textArray.Length» будет сообщение об ошибке «Compile error: Invalid qualifier».

Compile error: Invalid qualifier
Найти длину массива можно через поиск наименьшего и наибольшего доступных индексов для указанного измерения массива: LBound и UBound.
Dim arrayStart As Integer Dim arrayEnd As Integer arrayStart = LBound(textArray) arrayEnd = UBound(textArray) MsgBox (arrayEnd - arrayStart)
Отмечу, что функция Split возвращает массив с нулевым основанием (т.е. первый элемент имеет индекс 0), потому в этом случае можно ограничиться определением только UBound(textArray).