[an error occurred while processing this directive] | |||||||||||||||||||
1-й час. Знакомство с Visual Basic for Applications 3-й час. Работа с элементами управления 4-й час. Переменные и константы 6-й час. Логика условных операторов 7-й час. Циклические вычисления 9-й час. Основные объекты Excel 11-й час. Редактор Visual Basic 15-й час. Автоматизация экранных форм 20-й час. Получение внешних данных |
10-й час. Объект RangeОбъект Range (Диапазон), по всей видимости, наиболее часто используемый в процедурах VBA объект Excel. Так же, как и пользователи Excel в основном работают с ячейками и диапазонами, так и у программистов VBA больше всего времени уходит на работу с объектом Range (наряду с созданием интерфейса приложения). В этом часе мы изучим различные методы работы с диапазонами. В этом часе будут рассмотрены следующие вопросы.
Описание объекта RangeПоскольку вы создаете приложение для Excel, то естественно ваше внимание к ячейкам рабочего листа. В VBA ячейки трактуются как объект Range. Среди всех объектов Excel этот объект используется наиболее часто. Поэтому текущий час будет полностью посвящен объекту Range. В качестве объекта Range могут выступать:
Свойства объекта RangeИзучение любого объекта - это прежде всего изучение его свойств и методов. Среди всех свойств объекта Range выделим следующие.
Конечно, этот список не исчерпывает все свойства объекта Range, которых у него несколько десятков. Приведенные свойства, на мой взгляд, наиболее полезные и часто используемые. Чтобы поэкспериментировать со свойствами объекта Range, создадим процедуру. Сначала закройте все открытые рабочие книги, а затем откройте новую рабочую книгу. Будем считать, что текущий рабочий лист у вас Лист1.
Рис. 10.1. В создании текста этого сообщения использовано свойство Address Рассмотрим эту процедуру подробнее. Ее полный код приведен в листинге 10.1. Листинг 10.1. Процедура СвойстваДиапазона
Процедура начинается с активизации ячейки А1 (т.е. установки на ней табличного курсора):
После активизации ячейки A1 свойство Offset перемещает табличный курсор на ячейку С3, процедура показывает адрес новой активной ячейки в окне сообщения:
Свойство Offset позволяет перемещаться от одного диапазона к другому и имеет следующий синтаксис:
Аргументы смещ_строк и смещ_столбцов задают направление перемещения табличного курсора. В нашей процедуре оба аргумента принимают значение 2, что позволяет перейти из ячейки А1 в ячейку С3. Последние два оператора процедуры с помощью окон сообщения отображают значение и формулу ячейки В4:
Эти операторы показывают различие между свойствами Value и Formula. Свойство Value возвращает то, что отображается в ячейке, а свойство Formula - то, что находится в ячейке. Методы объекта RangeОбъект Range имеет много методов, среди которых следующие.
Использование оператора WithТеперь, когда вы знакомы с объектами Excel, пришло время изучить несколько конструкций языка VBA, значительно облегчающих работу с объектами. Одна из задач, которую часто придется решать с помощью VBA, - задание различных параметров форматирования объекта. В листинге 10.2 показан пример форматирования диапазона ячеек. Листинг 10.2. Пример форматирования диапазона
Чтобы ввести код этого листинга, вам надо снова и снова набирать Range("А1:А6"). Конечно, можно использовать переменную-объект для ссылки на объект Range("A1:A6"), но в этом случае вам столько же раз придется вводить имя переменной. Из подобных ситуаций VBA предлагает другой выход - оператор With, который применяется тогда, когда необходимо задать много свойств или выполнить большое количество методов одного объекта. Листинг 10.3 показывает тот же код листинга 10.2, но с использованием оператора With. Листинг 10.3. Пример использования оператора With
Оператор With имеет следующий синтаксис:
Объект - это тот объект, чьи свойства и методы указаны в секции операторы. Каждая строка в этой секции начинается с точки, как показано в листинге 10.3. Операторы With можно вкладывать друг в друга. В нашем листинге оператор With объекта Font вложен в оператор With объекта Range. В листинге 10.4 приведен другой пример использования оператора with. Листинг 10.4. Оператор With, содержащий оператор и метод
Оператор For EachЕсли оператор With используется для выполнения нескольких операторов для одного объекта, то оператор For Each применяется для выполнения одного и того же набора операторов для нескольких объектов. Этот оператор дает возможность повторить набор операторов для всех элементов коллекции. Оператор For Each можно применять к массивам. Оператор For Each имеет следующий синтаксис:
Отметим, что синтаксис предусматривает выражение Exit For. Так же, как и в других подобных выражениях Exit, для организации досрочного выхода из оператора For Each обычно применяется оператор If. В листинге 10.5 оператор For Each применяется для изменения значений всех ячеек определенного диапазона. Листинг 10.5. Пример использования оператора For Each
Использование объекта RangeВ своих лекциях по VBA я постоянно подчеркиваю, что один из эффективных путей изучения программирования - это исследование листингов программ. Оставшуюся часть текущего часа мы посвятим рассмотрению примеров листингов, в которых применяются свойства и методы объекта Range. В первом примере выполняется форматирование определенных строк диапазона. Подобная операция часто применяется перед выводом на печать различных списков. Предположим, что ваш рабочий лист похож на тот, что на показан рис. 10.2. Отметим, что первая строка содержит заголовки столбцов. Необходимо сделать полужирным шрифт в каждой второй строке. Процедура, выполняющая эту задачу, представлена в листинге 10.6.
Рис. 10.2. Рабочий лист, который будет частично переформатирован Листинг 10.6. Применение объекта Row и оператора цикла
Основным в этой процедуре является оператор цикла For... Next. Отметим, что переменная-счетчик этого цикла iCounter имеет начальное значение 3, а затем увеличивается с шагом 2, обеспечивая тем самым выделение полужирным начертанием каждой второй строки. На рис. 10.3 показан результат выполнения этой процедуры.
Рис. 10.3. Результат выполнения процедуры Очевиден недостаток приведенной выше процедуры: здесь заранее указывается размер диапазона. На практике размер диапазона может часто изменяться, например в результате импорта данных из какой-либо базы данных или в результате внесения Новых либо удаления старых данных. Другими словами, в процедуре не должен быть указан конкретный размер диапазона. Код листинга 10.7 выполняет выбор диапазона без указания его размера и местоположения. Листинг 10.7. Выделение диапазона
Ключевой элемент в этой процедуре - свойство CurrentRegion (Текущая область). Это свойство возвращает диапазон ячеек, содержащий активную ячейку и ограниченный пустыми строками и пустыми столбцами. При выделении диапазона с помощью свойства CurrentRegion нет необходимости заранее знать размер и местоположение выделяемого диапазона. Пример следующей процедуры показывает выполнение операции "копировать и вставить". Код листинга 10.8 копирует любой заранее выделенный объект в буфер обмена, а затем вставляет его в новое положение на рабочем листе. Листинг 10.8. Копирование и вставка диапазонов
Оператор Selection.Copy помещает выделенный диапазон в буфер обмена. Следующий оператор перемещает табличный курсор в ту ячейку, начиная с которой будет вставлен скопированный диапазон. Вставка диапазона из буфера обмена осуществляется оператором ActiveSheet.Paste. Последний оператор устанавливает значение свойства CutCopyMode (Режим вырезать-вставить) объекта Application как False (Ложь). Если не выполнить этот оператор, то вокруг исходного диапазона (того, что копировался) сохранится пунктирная рамка выделения, а в строке состояния будет по-прежнему отображаться инструкция по копированию диапазона. РезюмеВ этом часе мы исследовали много процедур, где использовались различные свойства и методы объекта Range. Мы рассмотрели также две конструкции VBA, помогающие в работе с объектами. Это оператор With, применяемый для выполнения набора операторов и методов какого-либо объекта, и оператор For Each, позволяющий выполнять одинаковую группу операторов применительно к нескольким объектам. Вопросы и ответыВопрос. Почему Range не является коллекцией? Ответ. Одним из основных признаков коллекции является возможность добавления новых элементов в коллекцию. Число ячеек (т.е. диапазонов) в рабочем листе предопределено Microsoft и не может быть изменено пользователем. Поэтому Range не является коллекцией. Вопрос. Чем оператор цикла For отличается от оператора For Each? Ответ. Давайте сначала посмотрим, что между ними общего. Оба эти оператора выполняют определенную последовательность операторов несколько раз. Но от чего зависит, сколько раз они выполнят эту последовательность операторов? Число выполнений цикла For зависит от заданных начального и конечного значений счетчика цикла. Число выполнений операторов, заданных в операторе For Each, зависит только от числа объектов или количества элементов массива. ПрактикумС помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении. Тесты
УпражнениеОткройте новую рабочую книгу. Введите следующие значения в первый лист рабочей книги.
Создайте процедуру с именем СнижениеЦен. Процедура должна уменьшить значения всех ячеек из диапазона В2:В6 на 5. Если цена будет меньше или равна нулю, выделите ее и название товара красным полужирным шрифтом. Также в этом случае (цена меньше или равна нулю) процедура должна вывести окно сообщения с соответствующим текстом предупреждения. Выполните процедуру. 1 Если ничего интересного не приходит в голову, ведите просто Товар 1, Товар 2 и т.д. - Прим. ред. |
||||||||||||||||||
[an error occurred while processing this directive] |