Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Макросы.doc
Скачиваний:
27
Добавлен:
21.11.2018
Размер:
16.91 Mб
Скачать

Оператор For Each

Если оператор With используется для выполнения нескольких операторов для одного объекта, то оператор For Each применяется для выполнения одного и того же набора операторов для нескольких объектов. Этот оператор дает возможность повторить набор операторов для всех элементов коллекции.

Оператор For Each можно применять к массивам.

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

For Each элемент In группа

 [Операторы]

 [Exit For]

 [Операторы]

Next

Отметим, что синтаксис предусматривает выражение Exit For. Так же, как и в других подобных выражениях Exit, для организации досрочного выхода из оператора For Each обычно применяется оператор If.

В листинге 10.5 оператор For Each применяется для изменения значений всех ячеек определенного диапазона.

Листинг 10.5. Пример использования оператора For Each

1: Sub ПримepFor_Each()

2:  Dim x As Range

3:

4:  For Each x In ThisWorkbook.Worksheets("Лист1").Range("A1:A6")

5:   x.Value = x.Value + 10

6:  Next

7: End Sub

Использование объекта Range

В своих лекциях по VBA я постоянно подчеркиваю, что один из эффективных путей изучения программирования - это исследование листингов программ. Оставшуюся часть текущего часа мы посвятим рассмотрению примеров листингов, в которых применяются свойства и методы объекта Range.

В первом примере выполняется форматирование определенных строк диапазона. Подобная операция часто применяется перед выводом на печать различных списков. Предположим, что ваш рабочий лист похож на тот, что на показан рис. 10.2. Отметим, что первая строка содержит заголовки столбцов. Необходимо сделать полужирным шрифт в каждой второй строке. Процедура, выполняющая эту задачу, представлена в листинге 10.6.

Рис. 10.2. Рабочий лист, который будет частично переформатирован

Листинг 10.6. Применение объекта Row и оператора цикла

1: Sub Полужирный()

2:  Dim iCounter As Integer

3:

4:  For iCounter = 3 To ThisWorkbook.Worksheets("Лист1"). _

      Range("A1:C25").Rows.Count Step 2

5:   ThisWorkbook.Worksheets("Лист1"). _

      Range("A1:C25").Font.Bold = True

6:  Next

7:

8: End Sub

Основным в этой процедуре является оператор цикла For... Next. Отметим, что переменная-счетчик этого цикла iCounter имеет начальное значение 3, а затем увеличивается с шагом 2, обеспечивая тем самым выделение полужирным начертанием каждой второй строки. На рис. 10.3 показан результат выполнения этой процедуры.

Рис. 10.3. Результат выполнения процедуры

Очевиден недостаток приведенной выше процедуры: здесь заранее указывается размер диапазона. На практике размер диапазона может часто изменяться, например в результате импорта данных из какой-либо базы данных или в результате внесения Новых либо удаления старых данных. Другими словами, в процедуре не должен быть указан конкретный размер диапазона. Код листинга 10.7 выполняет выбор диапазона без указания его размера и местоположения.

Листинг 10.7. Выделение диапазона

1: Sub ВыделениеДиапазона()

2:  ThisWorkbook.Worksheets("Лист1").Range("A1").Activate

3:  ActiveCell.CurrentRegion.Select

4:  MsgBox "Выделен диапазон" & Selection.Address

5: End Sub

Ключевой элемент в этой процедуре - свойство CurrentRegion (Текущая область). Это свойство возвращает диапазон ячеек, содержащий активную ячейку и ограниченный пустыми строками и пустыми столбцами. При выделении диапазона с помощью свойства CurrentRegion нет необходимости заранее знать размер и местоположение выделяемого диапазона.

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

Листинг 10.8. Копирование и вставка диапазонов

1: Sub Копировать_Вставить()

2:  Selection.Copy

3:  Range("F3").Select

4:  ActiveSheet.Paste

5:  Application.CutCopyMode = False

6: End Sub

Оператор Selection.Copy помещает выделенный диапазон в буфер обмена. Следующий оператор перемещает табличный курсор в ту ячейку, начиная с которой будет вставлен скопированный диапазон. Вставка диапазона из буфера обмена осуществляется оператором ActiveSheet.Paste. Последний оператор устанавливает значение свойства CutCopyMode (Режим вырезать-вставить) объекта Application как False (Ложь). Если не выполнить этот оператор, то вокруг исходного диапазона (того, что копировался) сохранится пунктирная рамка выделения, а в строке состояния будет по-прежнему отображаться инструкция по копированию диапазона.

Резюме

В этом часе мы исследовали много процедур, где использовались различные свойства и методы объекта Range. Мы рассмотрели также две конструкции VBA, помогающие в работе с объектами. Это оператор With, применяемый для выполнения набора операторов и методов какого-либо объекта, и оператор For Each, позволяющий выполнять одинаковую группу операторов применительно к нескольким объектам.