Эти два свойства очень полезны, когда программа работает с диапазонами, размерами которых Вы не можете управлять. Текущий регион (current region) -это диапазон ячеек, ограниченный пустыми строками и колонками или сочетанием пустых строк, пустых колонок и границ рабочего листа.
CurrentRegion ? свойство объектаRange. На листе может быть несколько текущих регионов ? все зависит от того, к какому объектуRange Вы обращаетесь.
Допустим, лист Sheet1 содержит список, для которого Вы хотите установить формат чисел. Единственное, что известно об этом списке, ? он начинается с ячейки А1; число строк и колонок в нем Вы не знаете. В следующем примере показано, как отформатировать такой список через свойствоCurrentRegion:
Sub FormatRange() Set myRange = Worksheets("Sheet1").Range("A1").CurrentRegion myRange.NumberFormat = "0.0" End Sub
Использованный диапазон (used range) ограничен левой верхней и правой нижней заполненными ячейками, наиболее удаленными друг от друга. В этом диапазоне содержатся все заполненные ячейки листа, а также расположенные между ними пустые ячейки. На листе может быть только один такой диапазон, иUsedRange является свойством объектаWorksheet,а не Range.
Пусть активный лист содержит результаты каких-то измерений за определенный период времени. В первой колонке использованного диапазона записаны даты, во второй ? время, а в третьей и четвертой ? результаты измерений. Вы хотите написать код, который объединяет пары ?дата-время? в одно значение, преобразует время из GMT (Greenwich Mean Time ? время по Гринвичу) в PST (Pacific Standard Time ? стандартное время Тихоокеанского побережья США) и применяет к полученному значению формат даты. В таблице могут быть пустые строки и колонки. Чтобы получить весь использованный диапазон, включая пустые строки, можно задействовать свойство UsedRange. Вот один из вариантов преобразования и форматирования дат и времени:
Sub ConvertDates() Set myRange = ActiveSheet.UsedRange myRange.Columns ("C") .Insert Set dateCol = myRange.Columns("C") For Each с In dateCol.Cells If c.0ffset(0, -1).Value <> "" Then c.FormulaR1C1 = "=RC[-2]+RC[-1]-(8/24)" End If Next с dateCol.NumberFormat = "mrnm-dd-yyyy hh:mm" dateCol.Copy dateCol.PasteSpecial Paste.: =xlValues my Range.Columns( "A:B" ).Delete dateCol.AutoFit End Sub
Заметьте: чтобы получить третью колонку в использованном диапазоне, применяется выражение ActiveSheet. UsedRange. Columns( "С"), но на самом листе эта колонка может быть любой по счету ? использованному диапазону могут предшествовать пустые колонки.
Другие свойства и методы объекта Range позволяют строить весьма сложные выражения, возвращающие поддиапазоны (subranges) или наддиапазоны (super-ranges) этого объекта. Среди свойств и методов, обычно применяемых с этой целью, можно отметить Areas, Cells, Columns, EntireColumn, EntireRow, RangeиRows.
Организация циклов для перебора ячеек диапазона
Есть несколько способов перебора ячеек диапазона в цикле. Примеры из этого раздела демонстрируют использование с этой целью операторов For Each...Next иDo...Loop.
For Each ? Next Do ? Loop
Применение свойства Address для отладки кода, работающего с объектом Range
У любого объектаRange есть свойствоAddress, которое возвращает адрес ячеек диапазона в виде строки. В следующем примере при отладке процедуры HideColumns используется свойствоAddress:
Sub HideColumns() Set r = Worksheets( "Sheet1 ").UsedRange MsgBox r.Address ' только при отладке! For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True MsgBox r.Columns(i).Address ' только при отладке! End If Next i End Sub
Окна с сообщениями можно заменить контрольными выражениями (watch expressions). В предыдущем примере можно было бы установить два таких выражения ? r.Address и r.Columns(i).Address ? и понаблюдать за их значениями в окнеImmediate (Проверка). Подробнее об отладке см. главу 14 ?Отладка и обработка ошибок?.
Работа с событиями.
Включение и отключение обработки событий Использование событий, связанных с рабочими листами События на уровне рабочего листа События на уровне диаграммы События на уровне рабочей книги События на уровне приложения Модули классов и события
Если Вы раньше работали с Visual Basic (Standard, Professional или Enterprise Edition), то событийно-управляемое программирование Вам уже знакомо; большая часть кода, написанная Вами на Visual Basic, вероятно, предназначалась для обработки таких событий, как щелчок кнопки мыши или загрузка формы. Может быть, в Microsoft Excel Вам доводилось использовать события типа OnSheetActivate или OnEntry, запуская макрос при активизации или изменении листа. И это тоже событийно-управляемое программирование. В Microsoft Excel 97 набор событий расширен и в него добавлены процедуры обработки событий, принимающие аргументы.
Microsoft Excel 97 допускает написание процедур обработки событий на уровне листа, диаграммы, книги или приложения. Например, событие Activate происходит на уровне листа, а событие SheetActivate доступно как на уровне книги, так и на уровне приложения. Событие SheetActivate для книги возникает при активизации любого из ее листов, а на уровне приложения ? при активизации любого листа открытых в данный момент книг.
Процедуры обработки событий листа и книги создаются по умолчанию для любого открытого листа, диаграммы или книги. Чтобы написать процедуру обработки события для внедренной диаграммы или для приложения, создайте новый объект в модуле класса с помощью ключевого слова WithEvents. Модуль класса можно использовать и для создания процедур обработки событий, доступных из нескольких листов или книг (см. раздел Модули классов и события далее в этой главе).