Встроенные функции обработки массивов

Функция Возвращаемое выражение
Array Создается статический массив с элементами типа Variant Синтаксис: Array(список), где список представляет собой разделенный запятыми список значений, присваиваемых элементам массива. Например: Dim A AsVariant A = Array(-12, 34, 89, 90, -45, 7.9) – создан массив вещественных чисел; DimДниНеделиAsVariant ДниНедели = Array(" понедельник ", " вторник ", " среда ", " четверг ", " пятница ", " суббота ", " воскресенье ") – получен одномерный массив, составленный из названий дней недели.
IsArray Проверяет значение переменных типа Variant на предмет содержания элементов массива. Функция возвращает значение True, если переменная действительно содержит ряд значений и значение False, если массивом значений не является. Синтаксис: IsArray(переменная), где переменная представляет имя переменной типа Variant Например: Dim X As Variant If IsArray(X) Then MsgBox “X - являетсямассивом.”
Lbound Ubound Возвращают минимальное и максимальное допустимые значения указанной размерности. Используются для контроля за размерами как статического, так и динамического массивов VBA. Они освобождают пользователя от необходимости отслеживать нижнюю и верхнюю границы индекса массива. Синтаксис: Lbound( имяМассива [ , размерность]) Ubound( имяМассива [ , размерность]), где ИмяМассива – имя переменной массива нижнюю (Lbound) или верхнюю (Ubound) границу которого нужно определить; размерность – целое число, указывающее размерность, нижнюю или верхнюю границу которой возвращает функция. Для первой размерности следует указывать 1, для второй 2 и т. д. Если аргумент размерность опущен, подразумевается 1. Например: Dim матрица As Range Dim x( ) Set матрица = Sheets(" Лист 1 ").Range(" a2 ").CurrentRegion x = матрица MsgBox " строк = " &UBound(x, 1) MsgBox " столбцов = " &UBound(x, 2)

ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ

Пример 9.На рабочем листе задана целочисленная матрица. Просуммировать элементы матрицы по строкам, суммы поместить в одномерный массив и на тот же рабочий лист.

Sub Пример_1( )

Dim x As Range, A( ) As Integer, S( ) As Integer

Set x = Range(" A1 ").CurrentRegion

A = Range(x.Address)

ReDimS(LBound(A, 1) To UBound(A, 1))

For i = LBound(A, 1) To UBound(A, 1)

S(i) = 0

For j = LBound(A, 2) To UBound(A, 2)

S(i) = S(i) + A(i, j)

Next j

Cells(i, UBound(A, 2) + 2) = S(i)

Next i

EndSub

Пояснение: Инструкцией Set переменной объектного типа x присваиваем значение диапазона рабочего листа, которое занимает исходная числовая матрица. Свойство Address объекта Range выдает абсолютную ссылку на диапазон. Инструкцией ReDim резервируем оперативную память ПК под вектор S. Функции Lbound( ) и Ubound( ) автоматически определяют нижнюю и верхнюю границы первой координаты заданной матрицы. Число компонент вектора равно количеству строк исходной матрицы. Суммирование элементов текущей строки матрицы выполняется во внутреннем цикле по j, Переход по строкам матрицы ведется во внешнем цикле по i.

Пример 10. В заданном целочисленном массиве сдвинуть в начало его все отрицательные элементы, не изменяя их порядка. Использование дополнительного массива недопустимо.

Sub Пример_2( )

Dim x AsVariant

Dim i AsByte, j AsByte, d AsInteger

x = Array(-3, 23, 90, 1, -17, 89, -51, -8, 0, 167)

Range(" A1 ") = " до: "

For i = LBound(x) To UBound(x)

Cells(i + 1, 1) = x(i)

Next i

For i = LBound(x) To UBound(x)

For j = LBound(x) To UBound(x) - 1

If x(j) * x(j + 1) < 0 And x(j) >0 Then d = x(j): x(j) = x(j + 1): x(j + 1) = d

Next j

Next i

Range(" B1 ") = " после: "

For i = LBound(x) To UBound(x)

Cells(i + 1, 2) = x(i)

Next i

EndSub

Пояснение: Проверяется условие: произведение соседних элементов массива отрицательно (т.е., они разных знаков), а текущий элемент положителен (?), тогда осуществляется перестановка этих элементов. Используется вложенная структура циклов, которая позволяет переместить отрицательные элементы вверх, сохраняя их порядок.

Наши рекомендации