Отображение рабочих книг можно изменить с помощью объектов Window (Окно). Объекты Window, которые иногда используются и для изменения содержимого рабочей книги, являются членами коллекции Windows объекта Application. Ссылка на окно осуществляется указанием в качестве индекса в коллекции Windows имени файла, содержащего рабочую книгу:
Windows("Кривая продаж игрушек.xls")
Если для одной рабочей книги открыто несколько окон, необходимо после имени рабочей книги через двоеточие указать номер окна, например: Windows ("Кривая продаж иг ру ше к.x l s:2").
Использование в коде объектов Range для работы с ячейками
Весьма неожиданно, что в Excel нет объекта Cell (Ячейка). Поэтому при написании кода следует руководствоваться следующим подходом: для указания ячейки в VBA-коде используется объект Range. В Excel объект Range может заключать в себе одну или больше ячеек и даже несколько не непрерывных областей листа.
Объект Range в Excel во многом подобен аналогичным объектам в Word, но вместе с тем имеет и существенные отличия. Как и в Word, VBA-программа может ссылаться на любое необходимое число объектов Range. Как в Excel, так и Word, действие программы не ограничивается видимым выделением пользователя, и для воздействия на какую-либо область ее выделять не требуется.
Определение объекта Range
В Excel имеется несколько возможных методов идентификации диапазона из одной или нескольких ячеек, на который должен воздействовать написанный код. Для достижения данной цели используются следующие.
Стандартная ссылка на ячейку. Так называемый А1-стиль ссылки на ячейку является, пожалуй, самым простым способом работы с объектами Range. Для определения диапазона необходимо ссылку заключить в кавычки и скобки после ключевого слова Range, как показано в следующем примере:
ActiveSheet.Range("B3")
Worksheets("Sheet 2").Range("M5:S20")
Именованные диапазоны. Если рабочий лист содержит именованные диапазоны, VBA объекты Range могут опираться на них, как показано в следующем примере:
Worksheets("Финансовый отчет").Range("Выплата процентов")
Для присвоения диапазону имени непосредственно в самом коде необходимо употребить следующее выражение с использованием функцией свойства Name (Имя):
Range("A3:В4")-Name = "Прайс-лист"
Сокращенная запись. Вследствие частого использования объектов Range, Excel позволяет упускать ключевое слово Range при определении диапазона при записи в А1 -стиле или при записи с использованием имени. Для реализации такого приема ссылку на ячейку или имя диапазона следует заключить в квадратные скобки, как показано в приведенном ниже примере:
ActiveSheet["Al:Z26"]
["Квартальный отчет"]
Свойство Cells объекта Worksheets. Данная техника крайне необходима профессионалам, так как позволяет определять диапазон не путем указания фиксированных адресов ячейки, а на основе переменных. Основная идея состоит в составлении в цифровом виде списка координат строк и столбцов диапазона. Читайте об этом в разделе "Использование свойства Cells для определения диапазона" дальше в данной главе.
Свойство Selection (Выделение). Когда требуется воздействие кода на диапазон, соответствующий выделению пользователя, используется свойство Selection. Читайте об этом в разделе "Работа с выделениями" дальше в данной главе.
Свойство ActiveCell (Активная ячейка). Свойство Active Cell используется для доступа к диапазону, представляющему активную ячейку данного окна. При использовании без спецификатора объекта (что эквивалентно использованию объекта Application), свойство Active Cell ссылается на активное окно:
ValueStorageBi n = ActiveCell.Value
Свойства Rows (Строки) или Columns (Столбцы) объекта Worksheet. Доступ к диапазону, включающему весь столбец или строку, осуществляется с помощью свойств рабочего листа Rows и Columns с использованием номера указываемого столбца или строки (нельзя адресовать столбец через его буквенное обозначение). В следующем примере определяется диапазон, включающий столбец Е, т.е. пятый столбец:
Workbooks("IOU.xls").Worksheets("Sheetshoot out").Column(5)
Определенные пользователем ссылки на объекты. Поскольку диапазон является объектом, можно установить именованную объектную ссылку на него, после чего доступ к диапазону осуществляется с помощью указания имени ссылки. Данную технику использовать проще и быстрее, чем многократное указание оригинального диапазона. После установки объектной ссылки RanGer, как показано в последующем примере, можно использовать его свойства в таких выражениях, как RanGer . Value:
Dim RanGer As Range Set RanGer = Worksheets("Лист1").Range("B12:H13" )
Использование свойств Cells для определения диапазона
При использовании без координат свойство Cells объекта Worksheets указывает на диапазон, включающий все ячейки данного рабочего листа. По аналогии, свойства Cells объекта Application ( Application. Cells ) ссылаются на все ячейки листа, активного в данный момент (свойство Cells может использоваться само по себе, без указания в явном виде объекта Application).
Если необходимо остановиться на более локализированном диапазоне, для свойства Cells требуется числовое указание координат строки и столбца (буквенное указание столбца не допускается). В следующем примере указан диапазон, заключающий ячейку ЕЗ:
Worksheets("Старые новости").Cells ( 3,5)
Весьма непривычно то, что сначала указывается координата строки, а затем столбца, в противоположность записи в А1-стиле. В предшествующем примере второе значение в ссылке на ячейку указывает на столбец Е, т.е. пятый столбец. Вследствие того, что данная система трудна для понимания, работать с ней следует лишь в случае особой необходимости. Поскольку обе координаты являются числами, можно очень просто указывать их через переменные. Переменные координаты позволяют программе (при работе) принимать решение о том, где находится требуемый диапазон на основе введенных пользователем данных, результатов вычислений и т.д.
В следующем примере строка выбирается в зависимости от текущего года и месяца: intMonth = Month (Now О)
aGoal = Worksheets("Monthly Projections").Cells ( intMont h, 8)
Способом чуть похитрее можно указать диапазон, покрывающий больше одной ячейки:
Range( Cells ( 3,5), Cells ( 4,6) )
В приведенном здесь примере указывается диапазон ячеек 2x2 на активном рабочем листе, включающий ячейки ЕЗ (строка 3, столбец 5) в верхнем левом и ячейку F4 в левом нижнем углах.
Для определения диапазона на неактивном листе необходимо использовать совместно свойства Range и Cells для требуемого листа. Следующее выражение выполняет данную работу, правда, имеет достаточно громоздкий вид:
Worksheets("2"). _
Range(Worksheets("2").Cells(3,5).
Worksheets("2">.Cells(4,6))
Оператор With позволяет избежать излишних ссылок на рабочий лист. В следующем примере к тексту всего диапазона применяется полужирное форматирование:
With Worksheets("Лист2")
.Range(.Cells ( 3,5), .Cells ( 4,6) ).Font.Bold = True
End With
Обратите внимание, что точки перед каждым использованием свойства Cells необходимы для связи любой ссылки с требуемым рабочим листом. В случае отсутствия точек каждое свойство Cells будет относится к активному листу, что приведет к возникновению конфликта со ссылкой свойства Range.
Выполнение совместных действий с ячейками
Используя свойства диапазона, можно одним действием изменять характеристики целого диапазона. Следующая строка изменяет размер шрифта текста во всех ячейках диапазона:
Worksheets ("Лист1").Range("B12:H13").Font.Size = 14
Безусловно, можно и даже предпочтительно использовать структуру With, когда необходимо работать с несколькими свойствами или методами целого диапазона, как показано здесь:
With someRange ' определенная ранее объектная ссылка
.Value = 20 ' Значение всех ячеек устанавливается равным 20
.Font.Name = "Garamond"
. Font.Italic = True
.Locked = True someRange = .Name ' Сохраняется имя диапазона
End With
Работа с отдельными ячейками диапазона
Хотя можно с помощью одного оператора назначить одно значение всем ячейкам диапазона, как показано в предыдущем примере, в Excel нет метода, позволяющего с помощью единственного действия изменять имеющиеся значения многоячеечного диапазона. Оператор вроде someRange .Value = someRange . Value + 10 не работает. Вместо этого необходимо осуществить циклический перебор всех ячеек диапазона с помощью цикла For Each. . , Next. При использовании данной техники не требуется знание количества ячеек, входящих в диапазон. Вот пример работоспособного кода:
For Each aCell In Selection
aCell.Value = aCell.Value + 10
Next
Часто перед тем, как принять решение о выполнении действия над отдельной ячейкой или о вообще о выборе действия, требуется проверка содержимого ячейки. Основываясь на текущем значении ячейки, код может принять решение о форматировании ячейки, изменении ее значения или же использовании данного значения для выполнения других вычислений. В таком случае также используется цикл For Each . . . Next: