Ввод и вывод двумерных массивов

 

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

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

При вводе по строкам параметром внешнего цикла является индексная переменная, обозначающая номер строки, параметром внутреннего – индексная переменная, обозначающая номер столбца.

Пример 25: ввод матрицы А, содержащей n строк и m столбцов. Переменной i обозначим строки матрицы, переменной j – столбцы.

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next j

Next i

 

В этой программе для одного фиксированного значения номера строки i, осуществляется перебор всех значений индекса j, т.е. вводится строка. По окончании внутреннего цикла (по j) номер строки i увеличивается на 1 и ввод элементов производится с начального, нулевого столбца j.

В программе вместо оператора InputBox можно использовать оператор Cells. В этом случае элементы матрицы должны быть записаны по строкам в рабочем листе Excel. Возможен способ ввода, когда элемент массива вычисляется по какой-либо формуле, где в качестве ее параметров могут присутствовать номера строк и номера столбцов.

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = Cells (i,j)

Next j

Next i

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = ...

Next j

Next i

 

При вводе элементов двумерного массива по столбцам параметром внешнего цикла выбирается номер столбца j, параметром внутреннего – строки i.

 

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For j = 1 To m

For i = 1 To n

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next i

Next j

 

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

Алгоритмы вывода матрицы на печать аналогичны приведенным выше.

 

str_msg = ""

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) 'перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg, , " Вывод ранее введенного массива"

 

По этой программе элементы каждой строки будут выведены в диалоговое окно. Строка

str_msg = str_msg & Chr(13)

подготавливает печать каждой новой строки матрицы на очередной строчке диалогового окна (выполняет функцию "перевода каретки" как только напечатается очередная строка).

 

Пример 26. Ввод-вывод двумерного массива

 

Sub DemoStatArray()

Dim str_msg As String

Dim n As Integer, m As Integer

Dim i As Integer, j As Integer

Dim Int_Array() As Integer

n = InputBox("Введите количество строк массива")

m = InputBox("Введите количество столбцов массива")

ReDim Int_Array(n, m)

For i = 1 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите значение для " & "элемента_ (" & i & "," & j & ") ", "Ввод элементов массива; строка " & i)

Next j

Next i

str_msg = ""

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) 'перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg, , "Вывод ранее введенного массива "

End Sub

 

 

 

 

 

9.12.8. Использование ReDim с динамическими массивами

 

Иногда могут сложиться обстоятельства, при которых точно неизвестно, сколько элементов потребуется в массиве. В VBA имеется возможность переопределять размерность массивов, а во время объявления не указывать размерность. Используя динамический массив, можно создавать массив такой большой или такой маленький, какой необходимо. Динамические массивы создаются с помощью оператора Dim, затем их размер устанавливается с помощью оператора ReDimво время выполнения процедуры.

Оператор ReDimимеет следующий синтаксис:

 

ReDim [Preserve] varname (subscripts) [As type] [varname_

(subscripts) [As type]]

 

Необязательное ключевое слово Preserve указывает VBA сохранять данные в имеющемся массиве, когда изменяется размер массива с помощью ReDim; varname – имя массива; subscripts – это новый размер массива; type – тип элементов массива. Необходимо использовать отдельный оператор As type для каждого массива, который определяется.

 

Dim aMonth() As String ReDim aMonth(1 To 30) ReDim aMonth(31) ReDim Preserve aMonth(1 To 31)   Dim Table()As Integer ReDim Table (3, 15) ReDim Table(4, 20) ReDim Preserve Table(4, 25) Dim Mas as Variant ReDim Mas(20) As Integer 'объявляет динамический массив aMonth 'изменяет размер массива до 30 элементов 'изменяет размер массива до 31 элемента 'изменяет размер массива до 31 элемента, сохраняя содержимое массива 'объявляет динамический массив 'делает массив двумерным 'изменяет размер двумерного массива 'только изменяет последний размер массива 'объявляет переменную типа Variant 'создает массив 20 целых в Variant

 

Важные моменты:

1. Можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve;

2. Можно использовать ReDimдля создания типизированного массива внутри переменной типа Variant; так как переменные типа Variantмогут содержать данные любого типа, можно использовать переменную типа Variantдля сохранения динамического массива. (Использование переменной типа Variantдля сохранения динамического массива дает возможность изменять размер массива с помощью ReDimи изменять тип данных массива.)

Обычно оператор ReDimиспользуется для изменения размера динамического массива, который уже был объявлен ранее с помощью операторов Dim. Можно использовать оператор ReDimдля изменения числа элементов и измерений в динамическом массиве столько раз, сколько необходимо. Однако нельзя использовать оператор ReDimдля изменения типа данных массива, если только массив не содержится в переменной типа Variantили сами элементы массива не имеют тип Variant. Если динамический массив сохраняется в переменной типа Variant, можно изменять тип данных, используя оператор As type в операторе ReDim.

Пример 27.Программа заполняет массив до тех пор, пока не будет введена пустая строка. При заполнении массива размерность массива увеличивается. При этом сохраняются предыдущие значения массива и очередному (новому) элементу присваивается введенное значение.

Option Base 1

Sub DemoDinArray()

Dim Int_Array() As Integer

Dim str_msg As String, i As Integer

Dim Num

str_msg = " "

i = 0

Do

i = i + 1

Num = InputBox("Введите целое число для " & i & "-го элемента массива", "Ввод элементов массива")

If Len(Num) = 0 Then Exit Do ' выход из цикла

' изменение размера массива с сохранением элементов

ReDim Preserve Int_Array(i)

'ввод данных в i-й элемент' массива

Int_Array(i) = Num

Loop

For j = 1 To i - 1

str_msg = str_msg & Int_Array(j) & ", "

Next j

MsgBox "Введено: " & str_msg, , "Вывод ра нее введенного массива"

End Sub

 

Пример 28. В первой части процедуры DemoDinArray в динамический массив Int_Array записывается первая строка будущего многомерного массива и определяется его вторая (количество столбцов) размерность. Как только пользователь во время ввода первой строки отказался от ввода, формирование первой строки заканчивается. В этот момент программе известна вторая размерность будущего двумерного массива: m=i-1. Функция MsgBox запрашивает ввести первую размерность массива Int_Array. Далее объявляется этот двумерный массив. Далее данные из одномерного массива Int_Arrayl переписываются в первую строку двумерного массива Int_Array/

 

Option Base 1

Sub DemoDinArray2()

Dim Int_Arrayl() As Integer

Dim str_msg As String

Dim i As Integer, m As Integer, n As Integer

Dim Num

str_msg = ""

i = 0

Do

i = i + 1

Num = InputBox("Введите целое число для " & i & "-го элемента массива", "Ввод элементов массива")

If Len(Num) = 0 Then Exit Do ' выход из цикла

ReDim Preserve Int_Arrayl(i) 'изменение размера массива с сохранением элементов

Int_Arrayl(i) = CStr(Num) 'ввод данных в i-й элемент массива

Loop

m = i - 1 'вторая размерность массива

n = InputBox("Введите количество строк массива ")

ReDim Int_Array(n, m)

' запись в выходной массив уже введенной строки

For j = 1 To m

Int_Array(1, j) = Int_Arrayl(j)

Next j

'теперь работаем с обычным двумерным массивом,

'только первую строку не заполняем:

For i = 2 To n

For j = 1 To m

Int_Array(i, j) = InputBox("Введите целое число для " & " элемента (" & i & "," & j & ")", "Ввод элементов массива; строка " & i)

Next j

Next i

'подготовка строки выдачи

For i = 1 To n

For j = 1 To m

str_msg = str_msg & Int_Array(i, j) & ", "

Next j

str_msg = str_msg & Chr(13) ' перевод строки

Next i

MsgBox "Введено: " & Chr(13) & str_msg, , "Вывод ранее введенного массива"

End Sub