Основы работы в VBA. Массивы

2. Динамические массивы

            Иногда бывает трудно заранее определить, сколько элементов нужно будет поместить в список. Для этого используют динамические массивы.

Динамические массивы используются в том случае, когда количество элементов массива заранее не известно и будет определяться в процессе выполнения программы. Как следствие, после того, как работа с динамическими массивом в программе будет выполнена, можно освободить память, которую он занимает.

            Динамический массив объявляется так же, как и любой другой тип массива – оператором Dim. Единственное отличие состоит в том, что не указывается (в скобках) размер массива. Например: 

Dim A() As Byte

 Этой строкой создается массив, но откладывается решение о том, сколько он будет  иметь элементов. Перед тем, как использовать этот массив, необходимо указать его размер, который во время работы программы можно изменять сколько угодно раз. Это делается с помощью оператора ReDim.

 ReDim A(5)

Следует отметить, что при указании значений для размерностей динамического массива оператором ReDim его тип не может быть изменен.

         При помощи оператора ReDim можно установить любые значения границ и количество размерностей, а также менять любой из установленных параметров как в сторону уменьшения, так и увеличения.

Dim A() As Byte

ReDim A(5)                'Диапазон от 0 до 5

ReDim A(1 To 4)           'Диапазон от 1 до 4

ReDim A(3, 3, 1 To 3)     'Диапазон от 0 до 3,

                                         'от 0 до 3, от 1 до 3

В качестве как верхней, так и нижней границы могут быть использованы не только числа, но и переменные целого типа:

Dim n As Integer

Dim A() As Integer

n = 10

ReDim A(n)

           При каждом выполнении оператора ReDim все значения элементов массива, которые до этого в нем хранились, будут потеряны, так как данный оператор обнуляет все элементы в соответствии с их типом, например числовые массивы принимают значение 0, а символьные "" (пусто). Для того чтобы имеющиеся в массиве значения не пропали при его переопределении, следует использовать служебное слово Preserve:

Пример 1. 

Sub primer_1()

Dim n As Integer

Dim i As Integer

Dim a() As Integer

n = 10

ReDim a(n)

For i = 1 To n

    a(i) = i ^ 2

Next i

ReDim Preserve a(15)

For i = 11 To 15

    a(i) = i ^ 3

Next i

End Sub

 В данной программе требуется заполнить массив из десяти элементов квадратами первых десяти натуральных чисел. Затем следует переопределение размера массива до 15 и заполнение новых элементов (с 11 по 15) кубами следующих натуральных чисел.

Пример 2. Заполнить массив А нечетными членами натурального ряда (1, 3, 5...) до тех пор, пока их произведение не станет  больше произвольного числа М. Найти сумму элементов массива и их число.

Sub primer_2()

Dim a() As Integer

Dim m As Long

m = InputBox("Введите целое положительное число m>>1")

Dim p As Double, z As Integer, n As Integer, s As Integer

'определение размера массива

p = 1: z = 1: n = 0

Do While p <= m

p = p * z

z = z + 2  'рассчитываем значение следующего нечетного числа

n = n + 1  'счетчик количества чисел

Loop

ReDim a(n - 1)

'заполнение массива нечетными числами и вывод на печать

a(1) = 1: Cells(1, 1) = a(1)

For i = 2 To n - 1

a(i) = a(i - 1) + 2

Cells(1, i) = a(i)  

Next i

'определяем сумму элементов и их произведение

s = 0: p = 1

For i = 1 To n - 1

s = s + a(i)

p = p * a(i)

Next i

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Количество элементов  = " & n - 1

End Sub

 

Результат выполнения программы: 


Эту же задачу можно решить несколько иным способом:

 Sub primer_2_1()

Dim a() As Integer

Dim m As Long

m = InputBox("Введите целое положительное число m>>1")

Dim p As Double, n As Integer, s As Integer, i As Integer

'заполнение динамического массива

ReDim a(1)

n = 1: a(n) = 1: p = 1

Do While p <= m

n = n + 1

ReDim Preserve a(n)

a(n) = a(n - 1) + 2

p = p * a(n)

Loop

'отсечение последнего элемента массива

'т.к. сначала ищется произведение, затем сравнивается с m

'затем происходит выход из цикла

ReDim Preserve a(n - 1)

'печать массива

For i = 1 To n - 1

Cells(1, i) = a(i)

Next i

'поиск суммы и произведения элементов массива

p = 1: s = 0

For i = 1 To n - 1

p = p * a(i)

s = s + a(i)

Next i

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Количество элементов  = " & n - 1

End Sub

 

Пример 3. Задать массив А(n) из членов ряда А(i) = \( \sqrt{i} \). Число элементов массива ограничить по условию А(i) ≤ к, где к >> 1. Найти сумму, произведение и среднее значение элементов массива.

 Sub primer_3()

Dim a() As Single

Dim k As Single

k = InputBox("Введите положительное число k > 1")

Dim p As Double, i As Integer, j As Integer, s As Single

'заполнение динамического массива

i = 1

ReDim a(i)

a(i) = Sqr(i)

Do While a(i) <= k

i = i + 1

ReDim Preserve a(i)

a(i) = Sqr(i)

Loop

'отсечение последнего элемента массива

'т.к. сначала ищется элемент, затем сравнивается с k

'затем происходит выход из цикла

ReDim Preserve a(i - 1)

'печать массива

For j = 1 To i - 1

Cells(1, j) = a(j)

Next j

'поиск суммы и произведения элементов массива

p = 1: s = 0

For j = 1 To i - 1

p = p * a(j)

s = s + a(j)

Next j

Cells(2, 1) = "Сумма элементов = " & s

Cells(3, 1) = "Произведение элементов = " & p

Cells(4, 1) = "Среднее значение элементов = " & s / (i - 1)

Cells(5, 1) = "Количество элементов  = " & i - 1

End Sub

 

Результат выполнения программы: