ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 19.06.2025
Просмотров: 1435
Скачиваний: 3
15MsgBox "Введено: " & str_msg, , "Вывод ранее введенного массива"
16End Sub
Встроке 2 объявляется одномерный массив Int_Array (размерностью 5 элементов) целых чисел; в строке 3 объявлена рабочая переменная str_msg для завершающего вывода данных из массива в диалоговом окне (строка 16). В первом цикле For…Next (строки 7–10) в массив Int_Array записываются значения из окна ввода. В строках 11–13 располагается второй цикл, который формирует строку из значений элементов массива для выдачи ее в диалоговом окне. Обратите внимание, как формируется значение аргумента Prompt функции
InputBox (рис. 21).
Рис. 21
Задание 2. Напишите процедуру работы с двумерным массивом, которая принимает в диалоговом окне целые числа (для простоты без всякой проверки), заносит их в элементы массива. Затем значения элементов массива заносятся в строку и выводятся на экран в диалоговом окне оператора MsgBox.
Для этого:
ü введите процедуру (листинг 18):
Листинг 18 – Работа со статическим двумерным массивом
1Sub List6_18 ()
2Dim Int_Array(1 To 3, 1 To 4) As Integer
3Dim str_msg As String
4Dim i As Integer
5Dim j As Integer
6
7str_msg = ""
8For i = 1 To 3
9For j = 1 To 4
10 |
Int_Array(i,j) = InputBox("Введите A(" & i & "," & j & ")", _ |
11 |
"Ввод элементов массива") |
12Next j
13Next i
14For i = 1 To 3
15For j = 1 To 4
16 |
str_msg = str_msg & Format(Int_Array(i,j), "@@@@@") |
17Next j
18str_msg = str_msg & Chr(13) 'перевод строки
92
19Next i
20MsgBox "Введено: " & Chr(13) & str_msg, , _
21"Вывод ранее введенного массива"
22End Sub
Для инициализации массива используется вложенный цикл в строках 8–13. Обратите внимание на строки 12, 13. Здесь, как ранее отмечалось, указывается, по какой переменной заканчивается цикл. Это необязательно, но лучше привыкнуть к такому стилю программирования с самого начала. В окне ввода теперь для указания, какой элемент вводится в конкретный момент времени, выводятся оба индекса. После заполнения строки, но перед изменением первого индекса к переменной str_msg добавляется символ перехода на другую строку (строка 18). В строках 14–19 располагается второй цикл, который формирует результат из значений элементов массива для выдачи ее в диалоговом окне (рис. 22).
Рис. 22
Свойства и методы объектов Range и Selection
В VBA объект – это комбинация программного кода и данных, воспринимаемая как некоторая единица, которой можно каким-либо образом манипулировать. Объектами являются само приложение Excel и все ее компоненты: рабочие книги, листы, диапазоны данных, таблицы, графические объекты, диалоговые окна.
Как и объекты реального мира, объекты VBA имеют различные присущие им качества или свойства (properties). Объекты в Excel имеют свойства, определяющие их вид и поведение: текст в Excel может отображаться или не отображаться полужирным шрифтом или курсивом, рабочий лист Excel может быть видимым или нет, строки в рабочем листе или таблице имеют свойство высоты, столбцы имеют свойство ширины и т.д. Чтобы узнать о текущем виде и поведении объекта, необходимо узнать о его свойствах. Некоторые свойства объекта можно изменять, некоторые – нет.
Объекты реального мира почти всегда имеют тот тип присущего им поведения или действия, который они могут выполнить. Объекты VBA также имеют поведение и возможности, называемые методами (methods). Методы изменяют значения свойств объектов; методы выполняют также действия с данными (или над данными), сохраняемыми объектом. Методы во многом похожи на процедуры VBA, с которыми вы уже знакомы, но связаны с объектом; к методам объекта можно обратиться, только используя объект. Это может казаться сложным, но на деле все проще. Для вызова метода объекта (функции обработки данных объекта) указывается не только наименование метода, но и объект (имя),
93
которому принадлежит метод.
Программные объекты группируются в иерархические классы или коллекции объектов, как объекты реального мира вокруг нас. Все объекты в одном и том же классе имеют одни и те же (или подобные) свойства и методы. Каждый класс объектов может содержать один или несколько подклассов. Объекты, принадлежащие к определенному классу объектов, называются членами (members) этого класса.
Прежде чем применять свойства и методы некоторого объекта, их следует сначала определить. В операторах VBA используйте следующий общий синтаксис для определения свойства или метода объекта:
Object.identifier
Object – любая допустимая ссылка на объект. Объектные ссылки создаются
заданием переменной для ссылки на объект или использованием методов или свойств объектов, возвращающих объектную ссылку. Identifier – любое допустимое имя свойства или метода; VBA отображает сообщение о runtime- ошибке при попытке использовать свойства или методы, которые не являются в действительности частью указанного объекта.
Объект Worksheet представляет собой рабочий лист. Объект Worksheet можно получить, используя свойства ActiveSheet или Worksheets объекта Workbook. Класс Worksheets содержит все рабочие листы рабочей книги. Свойство Cells класса Worksheets возвращает объект Range, содержащий все ячейки указанного рабочего листа. Свойство Range класса Worksheets возвращает ссылку на указанный диапазон ячеек. Например, ActiveSheet.Range("B1").
Объект Range представляет собой адресуемую ячейку, строку, столбец или несколько выделенных ячеек. Объект Selection является результатом выбора
ячейки или диапазона с помощью метода Select либо результатом применения свойства Selection. К нему применимы свойства и методы объекта Range.
Объект Range используется для работы с ячейками, строками, столбцами, а также их группами. Для доступа к объекту чаще всего используются свойства Range и Cells, хотя есть и другие возможности.
Если используется свойство Range, то в качестве аргумента указывается любая допустимая в MS Excel ссылка в формате А1. Например:
Worksheets("Лист1").Range("A5") = 15 'Ячейке А5 листа Лист1 'присвоить значение 15
Worksheets("Лист1").Range("A2:C3") = 15 'Ячейкам А2:C3 листа Лист1 'присвоить значение 15
Temp = Worksheets("Лист1").Range("A2") 'Переменной Temp 'присвоить содержимое 'ячейки A2 листа Лист1
Свойство Cells используется для доступа к отдельной ячейке. В качестве аргументов указываются номер строки и столбца. Например:
94
Worksheets("Лист1").Cells(6, 1) = 15 'Ячейке А6 листа Лист1 'присвоить значение 15
Temp = Worksheets("Лист1").Cells(2, 3) 'Переменной Temp 'присвоить содержимое 'ячейки C2 листа Лист1
Можно также использовать свойство Cells для альтернативного указания диапазона. Например, Range("A2:C3") и Range(Cells(2,1), Cells(3,3)) определяют один и тот же диапазон.
Ссылка на объекты с помощью With…End With
Процедуры могут ссылаться на один и тот же объект часто с помощью нескольких операторов в одной строке. Каждый оператор использует свойство или метод объекта, на который ссылается. VBA предоставляет особую структуру
– структуру With…End With, позволяющую ссылаться на свойства или методы, которые принадлежат одному и тому же объекту, без задания всей объектной ссылки каждый раз. Структура With…End With имеет следующий синтаксис:
With Object
'операторы, использующие свойства и методы Object
End With
Object – это любая допустимая объектная ссылка.
Задание 3. Напишите процедуру работы с двумерным массивом, которая принимает из ячеек рабочего листа целые числа (для простоты без всякой проверки), заносит квадраты этих чисел в элементы массива. Затем значения элементов массива выводятся в ячейки рабочего листа Excel.
Для этого:
üвведите в ячейки A1:D4 листа Лист1 целые числа;
üвведите процедуру (листинг 19):
Листинг 19 – Использование свойства Cells и Range
1Sub List6_19 ()
2Dim Int_Array(1 To 3, 1 To 4) As Integer
3Dim i As Integer
4Dim j As Integer
5
6For i = 1 To 3
7For j = 1 To 4
8 |
Int_Array(i,j) = Worksheets("Лист1").Cells(i, j) 'Ввод элементов |
9 |
'массива с листа Лист1 Excel (номера строк – от 1 до 3, |
10 |
'номера столбцов – от 1 до 4) |
11 |
Int_Array(i,j) = (Int_Array(i,j))^2 |
12Next j
13Next i
14Worksheets("Лист1").Range("A5") = "Результат:"
15For i = 1 To 3
95
16 |
For j = 1 To 4 |
17 |
Worksheets("Лист1").Cells(i + 5, j) = Int_Array(i,j) 'Вывод массива |
18 |
'на Лист1 в диапазон A6:D8 |
19Next j
20Next i
21End Sub
Использование ReDim с динамическими массивами
Как упоминалось ранее в этой части, могут сложиться обстоятельства, при которых точно не известно, сколько элементов потребуется в массиве. В VBA имеется возможность переопределять размерность массивов, а во время объявления не указывать размерность. Используя динамический массив, можно создавать массив такой большой или такой маленький, какой необходимо.
Динамические массивы создаются с помощью оператора Dim, затем их размер устанавливается с помощью оператора ReDim во время выполнения процедуры. Оператор ReDim имеет следующий синтаксис:
ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) _ [As type]]
необязательное ключевое слово Preserve, как предполагает его имя, приводит к тому, что VBA сохраняет данные в имеющемся массиве, когда изменяется размер массива с помощью ReDim; varname – имя существующего массива; subscripts – это измерения массива (синтаксис для оператора subscripts в операторе ReDim такой же, как для оператора Dim); type – любой тип VBA или определенный пользователем тип. Необходимо использовать отдельный оператор As type для каждого массива, который вы определяете.
Далее следуют допустимые примеры объявлений динамических массивов и возможные операторы ReDim, используемые с этими динамическими массивами:
Dim aMonth() As String 'объявляет динамический массив aMonth ReDim aMonth(1 To 30) 'изменяет размер массива до 30 элементов ReDim aMonth(31) ' изменяет размер массива до 31 элемента
ReDim Preserve aMonth(1 То 31) 'изменяет размер массива до 31 элемента, 'сохраняя содержимое
Dim Table() As Integer 'объявляет динамический массив ReDim Table(3, 15) 'делает массив двумерным
ReDim Table(4, 20) 'изменяет размер двумерного массива
ReDim Preserve Table(4, 25) 'только изменяет последний размер массива Dim Mas As Variant 'объявляет переменную типа Variant
ReDim Mas(20) As Integer 'создает массив 20 целых в Variant
Предыдущие примеры иллюстрируют некоторые важные моменты, относящиеся к динамическим массивам. Во-первых, можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserve. Во-вторых, можно использовать ReDim для создания типизированного массива внутри переменной типа Variant. Поскольку переменные типа Variant могут содержать данные любого типа, можно использовать переменную типа
96