Объект Range
Объект Range (Диапазон), наиболее часто используемый в процедурах VBA объект Excel.
Цель: Изучить различные методы работы с диапозонами.
Задачи:
1. Рассмотреть роль объекта Range в VBA
2. Освоить использование оператора With
3. Освоить использование оператора For Each
4. Выполнить анализ процедур, использующих оператор Range
Описание объекта Range
Поскольку вы создаете приложение для Excel, то естественно ваше внимание к ячейкам рабочего листа. В VBA ячейки трактуются как объект Range
В качестве объекта Range могут выступать:
отдельная ячейка;
выделенный диапазон ячеек;
несколько выделенных диапазонов ячеек (т.е. совокупность несмежных диапазонов);
строка и столбец;
трехмерный диапазон (т.е. состоящий из диапазонов, расположенных на разных рабочих листах).
Свойства объекта Range
Изучение любого объекта — это, прежде всего изучение его свойств и методов. Среди всех свойств объекта Range выделим следующие.
Address (Адрес) — возвращает текущее положение диапазона.
Count (Счет) — возвращает количество ячеек в диапазоне.
Formula (Формула) - возвращает формулу, по которой вычисляется значение, отображаемое в ячейке.
Offset (Смещение) — возвращает величину смещения одного диапазона относительно другого.
Resize (Изменение размеров) — позволяет изменять текущее выделение диа¬пазона.
Value (Значение) — возвращает значения ячеек, составляющих диапазон.
Чтобы поэкспериментировать со свойствами объекта Range, создадим процедуру
Сначала закройте все открытые рабочие книги, а затем откройте новую рабочую книгу. Будем считать, что текущий рабочий лист у вас Лист1.
1. Введите число 100 в ячейку В1, число 200 — в ячейку В2 и 300 — в ячейку ВЗ.
2. В ячейку В4 введите формулу =СУММ (В1: ВЗ).
3. Нажмите комбинацию клавиш <Alt+Fll>, чтобы открыть редактор Visual Basic, и вставьте модуль в текущую рабочую книгу.
4. Создайте новую процедуру и назовите ее СвойстваДиапазона.
5. Введите код процедуры
Visual Basic |
1
2
3
4
5 |
ThisWorkbook.Worksheets("Лист1").Range("A1").Activate
ActiveCell.Offset(2,2).Activate
MsgBox "Текущая ячейка - " & ActiveCell.Address
MsgBox "Значение ячейки В4 = " & Range("В4").Value
MsgBox "Формула в ячейке В4: " & Range("В4").Formula | |
|
6. Перейдите на Лист1 рабочей книги и выполните процедуру СвойстваДиа¬пазона. Появится первое окно с сообщением, что текущей ячейкой является ячейка СЗ.
7. Щелкните на кнопке ОК. Следующее окно сообщения покажет значение, отображаемое в ячейке В4.
8. Щелкните на кнопке ОК. Последнее окно покажет формулу, содержащуюся в ячейке В4. (Обратите внимание, что хотя формула в ячейке В4 введена русскими буквами, процедура корректно ее обработала и преобразовала в формулу англоязычной версии Excel)
9. Щелкните на кнопке ОК для закрытия окна сообщения.
Рассмотрим эту процедуру подробнее.
Процедура начинается с активизации ячейки A1 (т.е. установки на ней табличного курсора):
Visual Basic |
1 |
ThisWorkbook.Worksheets("Лист1").Range("Al").Activate | |
|
После активизации ячейки Al свойство Offset перемещает табличный курсор на ячейку СЗ, процедура показывает адрес новой активной ячейки в окне сообщения:
Visual Basic |
1
2 |
ActiveCell.Offset(2,2).Activate
MsgBox "Текущая ячейка - " & ActiveCell.Address | |
|
Свойство Offset позволяет перемещаться от одного диапазона к другому и имеет следующий синтаксис:
имя_диапазона..Offset(смещ_строк, смещ_ столбцов)
Аргументы смещ_строк и смещ_столбцов задают направление перемещения табличного курсора. В нашей процедуре оба аргумента принимают значение 2, что позволяет перейти из ячейки А1 в ячейку С3.
Последние два оператора процедуры с помощью окон сообщения отображают зна¬чение и формулу ячейки В4:
Visual Basic |
1
2 |
МsgВох "Значение ячейки В4 = " & Range("В4").Value
MsgBox "Формула в ячейке В4: " & Range("В4").Formula | |
|
Эти операторы показывают различие между свойствами Value и Formula. Свойст во Value возвращает то, что отображается в ячейке, а свойство Formula — то, что на¬ходится в ячейке.
Методы объекта Range
Объект Range имеет много методов, среди которых следующие.
Activate (Активизировать) — активизирует (выделяет) диапазон.
Clear (Очистить) — очищает содержимое диапазона.
Copy (Копировать) — копирует содержимое диапазона в буфер обмена.
Cut (Вырезать) — перемещает содержимое диапазона в буфер обмена.
PasteSpecial (Специальная вставка) — вставляет содержимое буфера обмена в диапазон, используя при этом различные аргументы.
Select (Выделить) — выделяет диапазон.
Использование оператора With
Изучим несколько конст¬рукций языка VBA, значительно облегчающих работу с объектами. Одна из задач, которую часто придется решать с помощью VBA, - задание различных параметров форматирова¬ния объекта. В листинге 10.1 показан пример форматирования диапазона ячеек.
Листинг 10.1. Пример форматирования диапазона
Visual Basic |
1
2
3
4
5
6
7
8
9
10
11 |
Range("Al:A6").NumberFormat = "#,##0.00"
Range("Al :A6").Font.Name = "Courier New"
Range("Al: A6").Font.FontStyle = "Regular"
Range("Al :A6").Font.Size = 11
Range("Al :A6").Font.Strikethrough = False
Range("Al :A6").Font.Superscript = False
Range("Al :A6").Font.Subscript = False
Range("Al :A6").Font.OutlineFont = False
Range("Al :A6").Font.Shadow = False
Range("Al :A6").Font.Underline = xlUnderlineStyleNone
Range("Al :A6").Font.Colorlndex = xlAutomatic | |
|
Чтобы ввести код этого листинга, вам надо снова и снова набирать Range ("А1:А6"). Конечно, можно использовать переменную-объект для ссылки на объект Range ("А1:А6"), но в этом случае вам столько же раз придется вводить имя переменной. Из подобных ситуаций VBA предлагает другой выход — оператор With, который применяется тогда, когда необходимо задать много свойств или выполнить большое количество методов одного объекта. Листинг 10.2 показывает тот же код лис-тинга 10.2, но с использованием оператора with.
Листинг 10.2. Пример использования оператора With
Visual Basic |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
With Range ("А1:А6)
.NumberFormat = "#,##0.00"
With.Font
.Name = "Courier New"
.FontStyle = "Regular"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.Font.Colorlndex = xlAutomatic
End With
End With | |
|
Оператор With имеет следующий синтаксис:
With объект
[опера торы]
End With
Объект — это тот объект, чьи свойства и методы указаны в секции операторы. Каждая строка в этой секции начинается с точки, как показано в листинге 10.2. Операторы With можно вкладывать друг в друга. В нашем листинге оператор With объекта Font вложен в оператор With объекта Range. В листинге 10.3 приведен другой пример использования оператора With.
Листинг 10.3. Оператор With, содержащий оператор и метод
Visual Basic |
1
2
3
4
5
6 |
Sub WithWorksheet()
With ThisWorkbook
. SaveAs "IIpимepWith"
MsgBox "Статус сохранения: " & .Saved
End With
End Sub | |
|
Оператор For Each
Если оператор With используется для выполнения нескольких операторов для од¬ного объекта, то оператор For Each применяется для выполнения одного и того же набора операторов для нескольких объектов. Этот оператор дает возможность повто¬рить набор операторов для всех элементов коллекции.
Оператор For Each можно применять к массивам Оператор For Each имеет следующий синтаксис:
For Each элемент In группа
[Опера торы]
[Exit For]
[Опера торы]
Next
Отметим, что синтаксис предусматривает выражение Exit For. Так же, как и в других подобных выражениях Exit, для организации досрочного выхода из оператора For Each обычно применяется оператор If.
В листинге 10.4 оператор For Each применяется для изменения значений всех ячеек диапазона.
Листинг 10.4. Пример использования оператора For Each____
Visual Basic |
1
2
3
4
5
6 |
Sub ПримерFог_Еасh()
Dim x As Range
For Each x In ThisWorkbook..Worksheets("Лист1").Range("A1:A6")
x.Value = x.Value + 10
Next
End Sub | |
|
Использование объекта Range
В первом примере выполняется форматирование определенных строк диапазона. По¬добная операция часто применяется перед выводом на печать различных списков. Предпо¬ложим, что первая строка вашего рабочего листа содержит заголовки столбцов. Необходимо сделать полужирным шрифт в каждой второй строке. Процедура, выполняющая эту задачу, представлена в листинге 10.5.
Листинг 10.5. Применение объекта Row и оператора цикла
Visual Basic |
1
2
3
4
5
6
7 |
Sub Полужирный()
Dim iCounter As Integer
For iCounter = 3 To ThisWorkbook.Worksheets("Лист1").Range("A1:C25").Rows.Count Step 2
ThisWorkbook.Worksheets("Лист1").
Range("A1:C25").Font.Bold = True
Next
End Sub | |
|
Основным в этой процедуре является оператор цикла For... Next. Отметим, что переменная-счетчик этого цикла iCounter имеет начальное значение 3, а затем уве¬личивается с шагом 2, обеспечивая тем самым выделение полужирным начертанием каждой второй строки.
Очевиден недостаток приведенной выше процедуры: здесь заранее указывается размер диапазона. На практике размер диапазона может часто изменяться, например в результате импорта данных из какой-либо базы данных или в результате внесения новых либо удаления старых данных. Другими словами, в процедуре не должен быть указан конкретный размер диапазона. Код листинга 10.6 выполняет выбор диапазона без указания его размера и местоположения.
Листинг 10.6. Выделение диапазона
Visual Basic |
1
2
3
4
5 |
Sub ВыделениеДиапазона()
ThisWorkbook.Worksheets("Лист1").Range("A1").Activate
ActiveCell.CurrentRegion.Select
MsgBox "Выделен диапазон " & Selection.Address
End Sub | |
|
Ключевой элемент в этой процедуре - свойство CurrentRegion (Текущая об¬ласть). Это свойство возвращает диапазон ячеек, содержащий активную ячейку и ог¬раниченный пустыми строками и пустыми столбцами. При выделении диапазона с помощью свойства CurrentRegion нет необходимости заранее знать размер и место¬положение выделяемого диапазона.
Пример следующей процедуры показывает выполнение операции "копировать и вставить". Код листинга 10.7 копирует любой заранее выделенный объект в буфер обмена, а затем вставляет его в новое положение на рабочем листе.
Листинг 10.7. Копирование и вставка диапазонов
Visual Basic |
1
2
3
4
5
6 |
Sub Копировать_Вставить()
Selection.Copy
Range("F3").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub | |
|
Оператор Selection. Copy помещает выделенный диапазон в буфер обмена. Сле¬дующий оператор перемещает табличный курсор в ту ячейку, начиная с которой будет вставлен скопированный диапазон. Вставка диапазона из буфера обмена осуществля¬ется оператором ActiveSheet. Paste. Последний оператор устанавливает значение свойства CutCopyMode (Режим вырезать-вставить) объекта Application как False (Ложь). Если не выполнить этот оператор, то вокруг исходного диапазона (того, что копировался) сохранится пунктирная рамка выделения, а в строке состояния будет по-прежнему отображаться инструкция по копированию диапазона.